diff --git a/src/memory.h b/src/memory.h index 4bfb37c3..b228a6f5 100644 --- a/src/memory.h +++ b/src/memory.h @@ -2,12 +2,15 @@ #include "common.h" +#define MALLOC(count) malloc(count) +#define FREE(p) free(p) + namespace pkpy{ template struct sp_deleter { inline static void call(int* counter){ ((T*)(counter + 1))->~T(); - free(counter); + FREE(counter); } }; @@ -79,7 +82,7 @@ namespace pkpy{ shared_ptr make_shared(Args&&... args) { static_assert(std::is_base_of_v, "U must be derived from T"); static_assert(std::has_virtual_destructor_v, "T must have virtual destructor"); - int* p = (int*)malloc(sizeof(int) + sizeof(U)); + int* p = (int*)MALLOC(sizeof(int) + sizeof(U)); *p = 1; new(p+1) U(std::forward(args)...); return shared_ptr(p); @@ -87,7 +90,7 @@ namespace pkpy{ template shared_ptr make_shared(Args&&... args) { - int* p = (int*)malloc(sizeof(int) + sizeof(T)); + int* p = (int*)MALLOC(sizeof(int) + sizeof(T)); *p = 1; new(p+1) T(std::forward(args)...); return shared_ptr(p); diff --git a/src/vm.h b/src/vm.h index 3c74b383..4ca0e839 100644 --- a/src/vm.h +++ b/src/vm.h @@ -1032,7 +1032,9 @@ void AttrRef::set(VM* vm, Frame* frame, PyVar val) const{ } void AttrRef::del(VM* vm, Frame* frame) const{ - vm->TypeError("cannot delete attribute"); + if(!obj->is_attr_valid()) vm->TypeError("cannot delete attribute"); + if(!obj->attr().contains(attr.name())) vm->AttributeError(obj, attr.name()); + obj->attr().erase(attr.name()); } PyVar IndexRef::get(VM* vm, Frame* frame) const{