From cc4dd34c86d38cda4306b077e2f7883bc321ead4 Mon Sep 17 00:00:00 2001 From: ykiko Date: Tue, 18 Jun 2024 19:49:30 +0800 Subject: [PATCH 1/5] fix py_exec and py_eval. --- src/vm.cpp | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/vm.cpp b/src/vm.cpp index 0ec1c31e..723d02f8 100644 --- a/src/vm.cpp +++ b/src/vm.cpp @@ -518,33 +518,34 @@ i64 VM::py_hash(PyVar obj){ } PyVar VM::__py_exec_internal(const CodeObject_& code, PyVar globals, PyVar locals){ - Frame* frame = &vm->callstack.top(); + Frame* frame = nullptr; + if(!callstack.empty()) frame = &callstack.top(); // fast path - if(globals == vm->None && locals == vm->None){ + if(frame && globals == vm->None && locals == vm->None) { return vm->_exec(code.get(), frame->_module, frame->_callable, frame->_locals); } auto _lock = heap.gc_scope_lock(); // for safety - PyVar globals_obj = nullptr; + PyObject* globals_obj = nullptr; Dict* globals_dict = nullptr; NameDict_ locals_closure = nullptr; Dict* locals_dict = nullptr; - if(globals == vm->None){ - globals_obj = frame->_module; - }else{ - if(is_type(globals, VM::tp_mappingproxy)){ + if(globals == vm->None) { + globals_obj = frame ? frame->_module : _main; + } else { + if(is_type(globals, VM::tp_mappingproxy)) { globals_obj = PK_OBJ_GET(MappingProxy, globals).obj; - }else{ + } else { check_compatible_type(globals, VM::tp_dict); // make a temporary object and copy globals into it globals_obj = heap.gcnew(VM::tp_object); globals_obj->_enable_instance_dict(); globals_dict = &PK_OBJ_GET(Dict, globals); - globals_dict->apply([&](PyVar k, PyVar v){ + globals_dict->apply([&](PyVar k, PyVar v) { globals_obj->attr().set(CAST(Str&, k), v); }); } @@ -552,29 +553,29 @@ PyVar VM::__py_exec_internal(const CodeObject_& code, PyVar globals, PyVar local PyVar retval = nullptr; - if(locals == vm->None){ - retval = vm->_exec(code, globals_obj); // only globals - }else{ + if(locals == vm->None) { + retval = vm->_exec(code, globals_obj); // only globals + } else { check_compatible_type(locals, VM::tp_dict); locals_dict = &PK_OBJ_GET(Dict, locals); locals_closure = std::make_shared(); - locals_dict->apply([&](PyVar k, PyVar v){ + locals_dict->apply([&](PyVar k, PyVar v) { locals_closure->set(CAST(Str&, k), v); }); - PyVar _callable = VAR(Function(__dynamic_func_decl, globals_obj, nullptr, locals_closure)); + PyObject* _callable = VAR(Function(__dynamic_func_decl, globals_obj, nullptr, locals_closure)); retval = vm->_exec(code.get(), globals_obj, _callable, vm->s_data._sp); } - if(globals_dict){ + if(globals_dict) { globals_dict->clear(); - globals_obj->attr().apply([&](StrName k, PyVar v){ + globals_obj->attr().apply([&](StrName k, PyVar v) { globals_dict->set(VAR(k.sv()), v); }); } - if(locals_dict){ + if(locals_dict) { locals_dict->clear(); - locals_closure->apply([&](StrName k, PyVar v){ + locals_closure->apply([&](StrName k, PyVar v) { locals_dict->set(VAR(k.sv()), v); }); } From 71432a405406c783c5a22d2aefb02e8dc8fe3a9d Mon Sep 17 00:00:00 2001 From: ykiko Date: Tue, 18 Jun 2024 20:36:42 +0800 Subject: [PATCH 2/5] fix format. --- src/vm.cpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/vm.cpp b/src/vm.cpp index 723d02f8..2e63f5ae 100644 --- a/src/vm.cpp +++ b/src/vm.cpp @@ -528,24 +528,24 @@ PyVar VM::__py_exec_internal(const CodeObject_& code, PyVar globals, PyVar local auto _lock = heap.gc_scope_lock(); // for safety - PyObject* globals_obj = nullptr; + PyVar globals_obj = nullptr; Dict* globals_dict = nullptr; NameDict_ locals_closure = nullptr; Dict* locals_dict = nullptr; - if(globals == vm->None) { + if(globals == vm->None){ globals_obj = frame ? frame->_module : _main; - } else { - if(is_type(globals, VM::tp_mappingproxy)) { + }else{ + if(is_type(globals, VM::tp_mappingproxy)){ globals_obj = PK_OBJ_GET(MappingProxy, globals).obj; - } else { + }else{ check_compatible_type(globals, VM::tp_dict); // make a temporary object and copy globals into it globals_obj = heap.gcnew(VM::tp_object); globals_obj->_enable_instance_dict(); globals_dict = &PK_OBJ_GET(Dict, globals); - globals_dict->apply([&](PyVar k, PyVar v) { + globals_dict->apply([&](PyVar k, PyVar v){ globals_obj->attr().set(CAST(Str&, k), v); }); } @@ -553,29 +553,29 @@ PyVar VM::__py_exec_internal(const CodeObject_& code, PyVar globals, PyVar local PyVar retval = nullptr; - if(locals == vm->None) { - retval = vm->_exec(code, globals_obj); // only globals - } else { + if(locals == vm->None){ + retval = vm->_exec(code, globals_obj); // only globals + }else{ check_compatible_type(locals, VM::tp_dict); locals_dict = &PK_OBJ_GET(Dict, locals); locals_closure = std::make_shared(); - locals_dict->apply([&](PyVar k, PyVar v) { + locals_dict->apply([&](PyVar k, PyVar v){ locals_closure->set(CAST(Str&, k), v); }); - PyObject* _callable = VAR(Function(__dynamic_func_decl, globals_obj, nullptr, locals_closure)); + PyVar _callable = VAR(Function(__dynamic_func_decl, globals_obj, nullptr, locals_closure)); retval = vm->_exec(code.get(), globals_obj, _callable, vm->s_data._sp); } - if(globals_dict) { + if(globals_dict){ globals_dict->clear(); - globals_obj->attr().apply([&](StrName k, PyVar v) { + globals_obj->attr().apply([&](StrName k, PyVar v){ globals_dict->set(VAR(k.sv()), v); }); } - if(locals_dict) { + if(locals_dict){ locals_dict->clear(); - locals_closure->apply([&](StrName k, PyVar v) { + locals_closure->apply([&](StrName k, PyVar v){ locals_dict->set(VAR(k.sv()), v); }); } From f937fc1da8f25c577c3ed9d86437f288d9241a32 Mon Sep 17 00:00:00 2001 From: ykiko Date: Tue, 18 Jun 2024 20:37:27 +0800 Subject: [PATCH 3/5] fix format. --- src/vm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vm.cpp b/src/vm.cpp index 2e63f5ae..8576c434 100644 --- a/src/vm.cpp +++ b/src/vm.cpp @@ -554,7 +554,7 @@ PyVar VM::__py_exec_internal(const CodeObject_& code, PyVar globals, PyVar local PyVar retval = nullptr; if(locals == vm->None){ - retval = vm->_exec(code, globals_obj); // only globals + retval = vm->_exec(code, globals_obj); // only globals }else{ check_compatible_type(locals, VM::tp_dict); locals_dict = &PK_OBJ_GET(Dict, locals); From 435ded95b52289ff2c402ab4518094792f5f619a Mon Sep 17 00:00:00 2001 From: ykiko Date: Tue, 18 Jun 2024 20:37:57 +0800 Subject: [PATCH 4/5] fix format. --- src/vm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vm.cpp b/src/vm.cpp index 8576c434..b53e525b 100644 --- a/src/vm.cpp +++ b/src/vm.cpp @@ -554,7 +554,7 @@ PyVar VM::__py_exec_internal(const CodeObject_& code, PyVar globals, PyVar local PyVar retval = nullptr; if(locals == vm->None){ - retval = vm->_exec(code, globals_obj); // only globals + retval = vm->_exec(code, globals_obj); // only globals }else{ check_compatible_type(locals, VM::tp_dict); locals_dict = &PK_OBJ_GET(Dict, locals); From 21d886f1a42ea61eb246f65ef2e6c7a6dbea9ef8 Mon Sep 17 00:00:00 2001 From: ykiko Date: Tue, 18 Jun 2024 20:39:02 +0800 Subject: [PATCH 5/5] fix format. --- src/vm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vm.cpp b/src/vm.cpp index b53e525b..bbb386f6 100644 --- a/src/vm.cpp +++ b/src/vm.cpp @@ -522,7 +522,7 @@ PyVar VM::__py_exec_internal(const CodeObject_& code, PyVar globals, PyVar local if(!callstack.empty()) frame = &callstack.top(); // fast path - if(frame && globals == vm->None && locals == vm->None) { + if(frame && globals == vm->None && locals == vm->None){ return vm->_exec(code.get(), frame->_module, frame->_callable, frame->_locals); }