add del support

This commit is contained in:
blueloveTH 2023-02-11 19:49:40 +08:00
parent 340f1bb15c
commit a94a580c15
2 changed files with 9 additions and 4 deletions

View File

@ -2,12 +2,15 @@
#include "common.h" #include "common.h"
#define MALLOC(count) malloc(count)
#define FREE(p) free(p)
namespace pkpy{ namespace pkpy{
template<typename T> template<typename T>
struct sp_deleter { struct sp_deleter {
inline static void call(int* counter){ inline static void call(int* counter){
((T*)(counter + 1))->~T(); ((T*)(counter + 1))->~T();
free(counter); FREE(counter);
} }
}; };
@ -79,7 +82,7 @@ namespace pkpy{
shared_ptr<T> make_shared(Args&&... args) { shared_ptr<T> make_shared(Args&&... args) {
static_assert(std::is_base_of_v<T, U>, "U must be derived from T"); static_assert(std::is_base_of_v<T, U>, "U must be derived from T");
static_assert(std::has_virtual_destructor_v<T>, "T must have virtual destructor"); static_assert(std::has_virtual_destructor_v<T>, "T must have virtual destructor");
int* p = (int*)malloc(sizeof(int) + sizeof(U)); int* p = (int*)MALLOC(sizeof(int) + sizeof(U));
*p = 1; *p = 1;
new(p+1) U(std::forward<Args>(args)...); new(p+1) U(std::forward<Args>(args)...);
return shared_ptr<T>(p); return shared_ptr<T>(p);
@ -87,7 +90,7 @@ namespace pkpy{
template <typename T, typename... Args> template <typename T, typename... Args>
shared_ptr<T> make_shared(Args&&... args) { shared_ptr<T> make_shared(Args&&... args) {
int* p = (int*)malloc(sizeof(int) + sizeof(T)); int* p = (int*)MALLOC(sizeof(int) + sizeof(T));
*p = 1; *p = 1;
new(p+1) T(std::forward<Args>(args)...); new(p+1) T(std::forward<Args>(args)...);
return shared_ptr<T>(p); return shared_ptr<T>(p);

View File

@ -1032,7 +1032,9 @@ void AttrRef::set(VM* vm, Frame* frame, PyVar val) const{
} }
void AttrRef::del(VM* vm, Frame* frame) 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{ PyVar IndexRef::get(VM* vm, Frame* frame) const{