From 62df3c9b5dd1f743693aa156e49e516b71162596 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Sun, 2 Jun 2024 19:53:53 +0800 Subject: [PATCH] some fix --- include/pocketpy/common/memorypool.hpp | 5 ----- include/pocketpy/interpreter/frame.hpp | 2 +- include/pocketpy/objects/object.hpp | 13 +++---------- src/interpreter/vm.cpp | 7 ++----- src/modules/modules.cpp | 2 +- src/pocketpy.cpp | 2 +- 6 files changed, 8 insertions(+), 23 deletions(-) diff --git a/include/pocketpy/common/memorypool.hpp b/include/pocketpy/common/memorypool.hpp index 25a0cd79..3b2f77c2 100644 --- a/include/pocketpy/common/memorypool.hpp +++ b/include/pocketpy/common/memorypool.hpp @@ -8,11 +8,6 @@ namespace pkpy{ void* pool128_alloc(size_t) noexcept; void pool128_dealloc(void*) noexcept; -template -void* pool128_alloc() noexcept{ - return pool128_alloc(sizeof(T)); -} - void pools_shrink_to_fit() noexcept; std::string pool64_info() noexcept; diff --git a/include/pocketpy/interpreter/frame.hpp b/include/pocketpy/interpreter/frame.hpp index 1e0638c9..363e8d06 100644 --- a/include/pocketpy/interpreter/frame.hpp +++ b/include/pocketpy/interpreter/frame.hpp @@ -147,7 +147,7 @@ struct CallStack{ template void emplace(Args&&... args){ - _tail = new(pool128_alloc()) LinkedFrame(_tail, std::forward(args)...); + _tail = new(pool128_alloc(sizeof(LinkedFrame))) LinkedFrame(_tail, std::forward(args)...); ++_size; } diff --git a/include/pocketpy/objects/object.hpp b/include/pocketpy/objects/object.hpp index 63987a04..ba33343d 100644 --- a/include/pocketpy/objects/object.hpp +++ b/include/pocketpy/objects/object.hpp @@ -42,20 +42,13 @@ struct PyObject final{ // backdoor for important builtin types if constexpr(std::is_same_v){ - _enable_instance_dict(); + _attr = new NameDict(); }else if constexpr(std::is_same_v){ - _enable_instance_dict(PK_TYPE_ATTR_LOAD_FACTOR); + _attr = new NameDict(PK_TYPE_ATTR_LOAD_FACTOR); }else if constexpr(std::is_same_v){ - _enable_instance_dict(PK_TYPE_ATTR_LOAD_FACTOR); + _attr = new NameDict(PK_TYPE_ATTR_LOAD_FACTOR); } } - - void _enable_instance_dict() { - _attr = new(pool128_alloc()) NameDict(); - } - void _enable_instance_dict(float lf){ - _attr = new(pool128_alloc()) NameDict(lf); - } }; static_assert(sizeof(PyObject) <= 16); diff --git a/src/interpreter/vm.cpp b/src/interpreter/vm.cpp index 8d2096ec..7c1d9f61 100644 --- a/src/interpreter/vm.cpp +++ b/src/interpreter/vm.cpp @@ -584,7 +584,7 @@ PyVar VM::__py_exec_internal(const CodeObject_& code, PyVar globals, PyVar local check_compatible_type(globals, VM::tp_dict); // make a temporary object and copy globals into it globals_obj = new_object(VM::tp_object).get(); - globals_obj->_enable_instance_dict(); + globals_obj->_attr = new NameDict(); globals_dict = &PK_OBJ_GET(Dict, globals); globals_dict->apply([&](PyVar k, PyVar v){ globals_obj->attr().set(CAST(Str&, k), v); @@ -1877,10 +1877,7 @@ void ManagedHeap::mark() { void ManagedHeap::_delete(PyObject* obj){ const PyTypeInfo* ti = vm->_tp_info(obj->type); if(ti->vt._dtor) ti->vt._dtor(obj->_value_ptr()); - if(obj->_attr){ - obj->_attr->~NameDict(); - pool128_dealloc(obj->_attr); - } + delete obj->_attr; // delete __dict__ if exists pool128_dealloc(obj); } diff --git a/src/modules/modules.cpp b/src/modules/modules.cpp index b15b45d6..427c3bd8 100644 --- a/src/modules/modules.cpp +++ b/src/modules/modules.cpp @@ -272,7 +272,7 @@ void add_module___builtins(VM* vm){ PyVar self = args[0]; if(is_tagged(self)) vm->TypeError("object: tagged object cannot enable instance dict"); if(self->is_attr_valid()) vm->RuntimeError("object: instance dict is already enabled"); - self->_enable_instance_dict(); + self->_attr = new NameDict(); return vm->None; }); } diff --git a/src/pocketpy.cpp b/src/pocketpy.cpp index e72ef811..445f9ed8 100644 --- a/src/pocketpy.cpp +++ b/src/pocketpy.cpp @@ -1517,7 +1517,7 @@ void __init_builtins(VM* _vm) { Type cls = PK_OBJ_GET(Type, args[0]); StrName cls_name = _type_name(vm, cls); PyObject* e_obj = vm->heap.gcnew(cls, cls_name); - e_obj->_enable_instance_dict(); + e_obj->_attr = new NameDict(); e_obj->as()._self = e_obj; return e_obj; });