diff --git a/include/pocketpy/interpreter/frame.hpp b/include/pocketpy/interpreter/frame.hpp index 188f6d81..5f3dc14a 100644 --- a/include/pocketpy/interpreter/frame.hpp +++ b/include/pocketpy/interpreter/frame.hpp @@ -19,7 +19,7 @@ struct FastLocals { FastLocals(const CodeObject* co, PyVar* a) : co(co), a(a) {} PyVar* try_get_name(StrName name); - NameDict_ to_namedict(); + NameDict* to_namedict(); PyVar* begin() const { return a; } diff --git a/include/pocketpy/objects/codeobject.hpp b/include/pocketpy/objects/codeobject.hpp index 3e8ce800..7b850542 100644 --- a/include/pocketpy/objects/codeobject.hpp +++ b/include/pocketpy/objects/codeobject.hpp @@ -1,6 +1,7 @@ #pragma once #include "pocketpy/common/any.h" +#include "pocketpy/common/traits.hpp" #include "pocketpy/objects/tuplelist.hpp" #include "pocketpy/objects/namedict.hpp" #include "pocketpy/objects/sourcedata.hpp" @@ -175,15 +176,21 @@ struct NativeFunc { }; struct Function { + PK_ALWAYS_PASS_BY_POINTER(Function) + FuncDecl_ decl; PyObject* _module; // weak ref PyObject* _class; // weak ref - NameDict_ _closure; + NameDict* _closure; // strong ref - explicit Function(FuncDecl_ decl, PyObject* _module, PyObject* _class, NameDict_ _closure) : + Function(FuncDecl_ decl, PyObject* _module, PyObject* _class, NameDict* _closure) : decl(decl), _module(_module), _class(_class), _closure(_closure) {} void _gc_mark(VM*) const; + + ~Function() { + delete _closure; + } }; template diff --git a/include/pocketpy/objects/namedict.hpp b/include/pocketpy/objects/namedict.hpp index d396e35b..3fe57948 100644 --- a/include/pocketpy/objects/namedict.hpp +++ b/include/pocketpy/objects/namedict.hpp @@ -59,6 +59,5 @@ struct NameDict { }; static_assert(sizeof(NameDict) <= 128); -using NameDict_ = std::shared_ptr; } // namespace pkpy diff --git a/src/interpreter/ceval.cpp b/src/interpreter/ceval.cpp index 7a1ff9d6..ad83acb8 100644 --- a/src/interpreter/ceval.cpp +++ b/src/interpreter/ceval.cpp @@ -183,11 +183,11 @@ PyVar VM::__run_top_frame() { const FuncDecl_& decl = frame->co->func_decls[byte.arg]; PyVar obj; if(decl->nested) { - NameDict_ captured = frame->_locals.to_namedict(); - obj = VAR(Function(decl, frame->_module, nullptr, captured)); + NameDict* captured = frame->_locals.to_namedict(); + obj = new_object(tp_function, decl, frame->_module, nullptr, captured); captured->set(decl->code->name, obj); } else { - obj = VAR(Function(decl, frame->_module, nullptr, nullptr)); + obj = new_object(tp_function, decl, frame->_module, nullptr, nullptr); } PUSH(obj); } diff --git a/src/interpreter/frame.cpp b/src/interpreter/frame.cpp index 71178de6..22e2c8dd 100644 --- a/src/interpreter/frame.cpp +++ b/src/interpreter/frame.cpp @@ -8,8 +8,8 @@ PyVar* FastLocals::try_get_name(StrName name) { return &a[index]; } -NameDict_ FastLocals::to_namedict() { - NameDict_ dict = std::make_shared(); +NameDict* FastLocals::to_namedict() { + NameDict* dict = new NameDict(); for(int i=0; ivarnames_inv.count; i++){ auto entry = c11__getitem(c11_smallmap_entry_n2i, &co->varnames_inv, i); PyVar value = a[entry.value]; diff --git a/src/interpreter/vm.cpp b/src/interpreter/vm.cpp index f232f135..8804d6f8 100644 --- a/src/interpreter/vm.cpp +++ b/src/interpreter/vm.cpp @@ -561,7 +561,7 @@ PyVar VM::__py_exec_internal(const CodeObject_& code, PyVar globals, PyVar local PyObject* globals_obj = nullptr; Dict* globals_dict = nullptr; - NameDict_ locals_closure = nullptr; + NameDict* locals_closure = nullptr; Dict* locals_dict = nullptr; if(is_none(globals)){ @@ -588,7 +588,7 @@ PyVar VM::__py_exec_internal(const CodeObject_& code, PyVar globals, PyVar local } else { check_compatible_type(locals, VM::tp_dict); locals_dict = &PK_OBJ_GET(Dict, locals); - locals_closure = std::make_shared(); + locals_closure = new NameDict(); locals_dict->apply([&](PyVar k, PyVar v) { locals_closure->set(CAST(Str&, k), v); });