diff --git a/src/compiler/compiler.cpp b/src/compiler/compiler.cpp index 26d0ebb5..4572d897 100644 --- a/src/compiler/compiler.cpp +++ b/src/compiler/compiler.cpp @@ -101,6 +101,7 @@ Error* Compiler::pop_context() noexcept{ assert(func->type != FuncType::UNSET); } + contexts.back().s_clean(); contexts.pop_back(); return NULL; } diff --git a/src/interpreter/vm.cpp b/src/interpreter/vm.cpp index 63704d69..64f32eed 100644 --- a/src/interpreter/vm.cpp +++ b/src/interpreter/vm.cpp @@ -583,7 +583,6 @@ 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->_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); @@ -1893,6 +1892,8 @@ 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) + c11_vector__dtor(obj->_attr); delete obj->_attr; // delete __dict__ if exists if(obj->gc_is_large){ std::free(obj);