This commit is contained in:
blueloveTH 2024-06-29 17:31:42 +08:00
parent c4897ea0fb
commit 773a05e25c
2 changed files with 20 additions and 25 deletions

View File

@ -47,7 +47,8 @@ void FuncDecl__add_kwarg(FuncDecl* self, int index, uint16_t key, const PyVar* v
} }
void CodeObject__ctor(CodeObject* self, pk_SourceData_ src, c11_string name) { void CodeObject__ctor(CodeObject* self, pk_SourceData_ src, c11_string name) {
self->src = src; PK_INCREF(src); self->src = src;
PK_INCREF(src);
py_Str__ctor2(&self->name, name.data, name.size); py_Str__ctor2(&self->name, name.data, name.size);
c11_vector__ctor(&self->codes, sizeof(Bytecode)); c11_vector__ctor(&self->codes, sizeof(Bytecode));

View File

@ -23,28 +23,22 @@ void py_finalize() {
pk_MemoryPools__finalize(); pk_MemoryPools__finalize();
} }
int py_exec(const char* source) { int py_exec(const char* source) { PK_UNREACHABLE(); }
pk_SourceData_ src = pk_SourceData__rcnew(source, "main.py", EXEC_MODE, false);
CodeObject co;
Error* err = pk_compile(src, &co);
PK_DECREF(src);
if(err) abort();
int py_eval(const char* source) {
CodeObject co;
pk_SourceData_ src = pk_SourceData__rcnew(source, "main.py", EVAL_MODE, false);
Error* err = pk_compile(src, &co);
if(err) {
PK_DECREF(src);
return -1;
}
pk_VM* vm = pk_current_vm; pk_VM* vm = pk_current_vm;
Frame* frame = Frame__new(&co, &vm->main, NULL, vm->stack.sp, vm->stack.sp, &co); Frame* frame = Frame__new(&co, &vm->main, NULL, vm->stack.sp, vm->stack.sp, &co);
pk_VM__push_frame(vm, frame); pk_VM__push_frame(vm, frame);
pk_FrameResult res = pk_VM__run_top_frame(vm); pk_FrameResult res = pk_VM__run_top_frame(vm);
if(res == RES_ERROR) return vm->last_error->type; CodeObject__dtor(&co);
if(res == RES_RETURN) return 0; PK_DECREF(src);
PK_UNREACHABLE();
}
int py_eval(const char* source) {
CodeObject* co = NULL;
pk_VM* vm = pk_current_vm;
Frame* frame = Frame__new(co, &vm->main, NULL, vm->stack.sp, vm->stack.sp, co);
pk_VM__push_frame(vm, frame);
pk_FrameResult res = pk_VM__run_top_frame(vm);
if(res == RES_ERROR) return vm->last_error->type; if(res == RES_ERROR) return vm->last_error->type;
if(res == RES_RETURN) return 0; if(res == RES_RETURN) return 0;
PK_UNREACHABLE(); PK_UNREACHABLE();