mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
fix py_exec and py_eval.
This commit is contained in:
parent
f9c00fd706
commit
cc4dd34c86
11
src/vm.cpp
11
src/vm.cpp
@ -518,23 +518,24 @@ i64 VM::py_hash(PyVar obj){
|
|||||||
}
|
}
|
||||||
|
|
||||||
PyVar VM::__py_exec_internal(const CodeObject_& code, PyVar globals, PyVar locals){
|
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
|
// 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);
|
return vm->_exec(code.get(), frame->_module, frame->_callable, frame->_locals);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto _lock = heap.gc_scope_lock(); // for safety
|
auto _lock = heap.gc_scope_lock(); // for safety
|
||||||
|
|
||||||
PyVar globals_obj = nullptr;
|
PyObject* globals_obj = nullptr;
|
||||||
Dict* globals_dict = nullptr;
|
Dict* globals_dict = nullptr;
|
||||||
|
|
||||||
NameDict_ locals_closure = nullptr;
|
NameDict_ locals_closure = nullptr;
|
||||||
Dict* locals_dict = nullptr;
|
Dict* locals_dict = nullptr;
|
||||||
|
|
||||||
if(globals == vm->None) {
|
if(globals == vm->None) {
|
||||||
globals_obj = frame->_module;
|
globals_obj = frame ? frame->_module : _main;
|
||||||
} else {
|
} else {
|
||||||
if(is_type(globals, VM::tp_mappingproxy)) {
|
if(is_type(globals, VM::tp_mappingproxy)) {
|
||||||
globals_obj = PK_OBJ_GET(MappingProxy, globals).obj;
|
globals_obj = PK_OBJ_GET(MappingProxy, globals).obj;
|
||||||
@ -561,7 +562,7 @@ PyVar VM::__py_exec_internal(const CodeObject_& code, PyVar globals, PyVar local
|
|||||||
locals_dict->apply([&](PyVar k, PyVar v) {
|
locals_dict->apply([&](PyVar k, PyVar v) {
|
||||||
locals_closure->set(CAST(Str&, k), 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);
|
retval = vm->_exec(code.get(), globals_obj, _callable, vm->s_data._sp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user