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

@ -13,7 +13,7 @@ bool Bytecode__is_forward_jump(const Bytecode* self) {
return self->op >= OP_JUMP_FORWARD && self->op <= OP_LOOP_BREAK; return self->op >= OP_JUMP_FORWARD && self->op <= OP_LOOP_BREAK;
} }
FuncDecl_ FuncDecl__rcnew(pk_SourceData_ src, c11_string name){ FuncDecl_ FuncDecl__rcnew(pk_SourceData_ src, c11_string name) {
FuncDecl* self = malloc(sizeof(FuncDecl)); FuncDecl* self = malloc(sizeof(FuncDecl));
self->rc.count = 1; self->rc.count = 1;
self->rc.dtor = (void (*)(void*))FuncDecl__dtor; self->rc.dtor = (void (*)(void*))FuncDecl__dtor;
@ -33,21 +33,22 @@ FuncDecl_ FuncDecl__rcnew(pk_SourceData_ src, c11_string name){
return self; return self;
} }
void FuncDecl__dtor(FuncDecl* self){ void FuncDecl__dtor(FuncDecl* self) {
CodeObject__dtor(&self->code); CodeObject__dtor(&self->code);
c11_vector__dtor(&self->args); c11_vector__dtor(&self->args);
c11_vector__dtor(&self->kwargs); c11_vector__dtor(&self->kwargs);
c11_smallmap_n2i__dtor(&self->kw_to_index); c11_smallmap_n2i__dtor(&self->kw_to_index);
} }
void FuncDecl__add_kwarg(FuncDecl* self, int index, uint16_t key, const PyVar* value){ void FuncDecl__add_kwarg(FuncDecl* self, int index, uint16_t key, const PyVar* value) {
c11_smallmap_n2i__set(&self->kw_to_index, key, index); c11_smallmap_n2i__set(&self->kw_to_index, key, index);
FuncDeclKwArg item = {index, key, *value}; FuncDeclKwArg item = {index, key, *value};
c11_vector__push(FuncDeclKwArg, &self->kwargs, item); c11_vector__push(FuncDeclKwArg, &self->kwargs, item);
} }
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));
@ -70,7 +71,7 @@ void CodeObject__ctor(CodeObject* self, pk_SourceData_ src, c11_string name){
c11_vector__push(CodeBlock, &self->blocks, root_block); c11_vector__push(CodeBlock, &self->blocks, root_block);
} }
void CodeObject__dtor(CodeObject* self){ void CodeObject__dtor(CodeObject* self) {
PK_DECREF(self->src); PK_DECREF(self->src);
py_Str__dtor(&self->name); py_Str__dtor(&self->name);
@ -85,7 +86,7 @@ void CodeObject__dtor(CodeObject* self){
c11_vector__dtor(&self->blocks); c11_vector__dtor(&self->blocks);
for(int i=0; i<self->func_decls.count; i++){ for(int i = 0; i < self->func_decls.count; i++) {
FuncDecl_ decl = c11__getitem(FuncDecl_, &self->func_decls, i); FuncDecl_ decl = c11__getitem(FuncDecl_, &self->func_decls, i);
PK_DECREF(decl); PK_DECREF(decl);
} }

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();