This commit is contained in:
blueloveTH 2024-06-24 20:14:40 +08:00
parent 857b798172
commit c89c7bd1ac
6 changed files with 51 additions and 28 deletions

View File

@ -33,7 +33,6 @@ PyObject* pk_ManagedHeap__gcnew(pk_ManagedHeap* self, Type type, int size);
// external implementation // external implementation
void pk_ManagedHeap__mark(pk_ManagedHeap* self); void pk_ManagedHeap__mark(pk_ManagedHeap* self);
void pk_ManagedHeap__delete_obj(pk_ManagedHeap* self, PyObject* obj);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -38,7 +38,7 @@ typedef struct pk_TypeInfo{
py_CFunction on_end_subclass; // for enum module py_CFunction on_end_subclass; // for enum module
} pk_TypeInfo; } pk_TypeInfo;
void pk_TypeInfo__ctor(pk_TypeInfo *self, StrName name, Type base, PyObject* obj, PyObject* module, bool subclass_enabled); void pk_TypeInfo__ctor(pk_TypeInfo* self, StrName name, Type base, PyObject* obj, PyObject* module, bool subclass_enabled);
void pk_TypeInfo__dtor(pk_TypeInfo* self); void pk_TypeInfo__dtor(pk_TypeInfo* self);
typedef struct pk_VM { typedef struct pk_VM {

View File

@ -21,12 +21,8 @@ static_assert(sizeof(PyObject) <= 16, "!(sizeof(PyObject) <= 16)");
#define PK_OBJ_GET(T, val) (*(T*)(PyObject__value_ptr((val)._obj))) #define PK_OBJ_GET(T, val) (*(T*)(PyObject__value_ptr((val)._obj)))
#define PK_OBJ_SIZEOF(T) (sizeof(T) + 16) #define PK_OBJ_SIZEOF(T) (sizeof(T) + 16)
PK_INLINE void PyObject__ctor(PyObject* self, Type type, bool gc_is_large){ PyObject* PyObject__new(Type type, int size);
self->type = type; void PyObject__delete(PyObject* self);
self->gc_is_large = gc_is_large;
self->gc_marked = false;
self->dict = NULL;
}
PK_INLINE PyVar PyVar__fromobj(PyObject* obj){ PK_INLINE PyVar PyVar__fromobj(PyObject* obj){
PyVar retval = { PyVar retval = {

View File

@ -10,7 +10,7 @@ typedef struct PyVar PyVar;
typedef struct pk_VM pk_VM; typedef struct pk_VM pk_VM;
typedef struct py_Error py_Error; typedef struct py_Error py_Error;
typedef unsigned (*py_CFunction)(const PyVar*, int); typedef int (*py_CFunction)(const PyVar*, int);
extern pk_VM* pk_vm; extern pk_VM* pk_vm;

View File

@ -17,11 +17,11 @@ void pk_ManagedHeap__ctor(pk_ManagedHeap *self, pk_VM *vm){
void pk_ManagedHeap__dtor(pk_ManagedHeap *self){ void pk_ManagedHeap__dtor(pk_ManagedHeap *self){
for(int i = 0; i < self->gen.count; i++){ for(int i = 0; i < self->gen.count; i++){
PyObject* obj = c11__getitem(PyObject*, &self->gen, i); PyObject* obj = c11__getitem(PyObject*, &self->gen, i);
pk_ManagedHeap__delete_obj(self, obj); PyObject__delete(obj);
} }
for(int i = 0; i < self->no_gc.count; i++){ for(int i = 0; i < self->no_gc.count; i++){
PyObject* obj = c11__getitem(PyObject*, &self->no_gc, i); PyObject* obj = c11__getitem(PyObject*, &self->no_gc, i);
pk_ManagedHeap__delete_obj(self, obj); PyObject__delete(obj);
} }
c11_vector__dtor(&self->no_gc); c11_vector__dtor(&self->no_gc);
c11_vector__dtor(&self->gen); c11_vector__dtor(&self->gen);
@ -67,7 +67,7 @@ int pk_ManagedHeap__sweep(pk_ManagedHeap *self){
if(self->_gc_on_delete){ if(self->_gc_on_delete){
self->_gc_on_delete(self->vm, obj); self->_gc_on_delete(self->vm, obj);
} }
pk_ManagedHeap__delete_obj(self, obj); PyObject__delete(obj);
} }
} }
@ -89,29 +89,29 @@ int pk_ManagedHeap__sweep(pk_ManagedHeap *self){
} }
PyObject* pk_ManagedHeap__new(pk_ManagedHeap *self, Type type, int size){ PyObject* pk_ManagedHeap__new(pk_ManagedHeap *self, Type type, int size){
PyObject* obj; PyObject* obj = PyObject__new(type, size);
if(size <= kPoolObjectBlockSize){
obj = PoolObject_alloc();
PyObject__ctor(obj, type, false);
}else{
obj = malloc(size);
PyObject__ctor(obj, type, true);
}
c11_vector__push(PyObject*, &self->no_gc, obj); c11_vector__push(PyObject*, &self->no_gc, obj);
return obj; return obj;
} }
PyObject* pk_ManagedHeap__gcnew(pk_ManagedHeap *self, Type type, int size){ PyObject* pk_ManagedHeap__gcnew(pk_ManagedHeap *self, Type type, int size){
PyObject* obj; PyObject* obj = PyObject__new(type, size);
if(size <= kPoolObjectBlockSize){
obj = PoolObject_alloc();
PyObject__ctor(obj, type, false);
}else{
obj = malloc(size);
PyObject__ctor(obj, type, true);
}
c11_vector__push(PyObject*, &self->gen, obj); c11_vector__push(PyObject*, &self->gen, obj);
self->gc_counter++; self->gc_counter++;
return obj; return obj;
} }
PyObject* PyObject__new(Type type, int size){
PyObject* self;
if(size <= kPoolObjectBlockSize){
self = PoolObject_alloc();
self->gc_is_large = false;
}else{
self = malloc(size);
self->gc_is_large = true;
}
self->type = type;
self->gc_marked = false;
self->dict = NULL;
return self;
}

View File

@ -1,4 +1,5 @@
#include "pocketpy/interpreter/vm.h" #include "pocketpy/interpreter/vm.h"
#include "pocketpy/common/memorypool.h"
static unsigned char* pk_default_import_file(pk_VM* vm, const char* path){ static unsigned char* pk_default_import_file(pk_VM* vm, const char* path){
return NULL; return NULL;
@ -161,3 +162,30 @@ Type pk_VM__new_type(pk_VM* self, const char* name, Type base, PyObject* module,
pk_TypeInfo__ctor(ti, pk_StrName__map(name), base, typeobj, module, subclass_enabled); pk_TypeInfo__ctor(ti, pk_StrName__map(name), base, typeobj, module, subclass_enabled);
return type; return type;
} }
/****************************************/
void PyObject__delete(PyObject *self){
pk_TypeInfo* ti = c11__getitem(pk_TypeInfo*, &pk_vm->types, self->type);
if(ti->dtor) ti->dtor(PyObject__value_ptr(self));
if(self->dict) pk_NameDict__delete(self->dict);
if(self->gc_is_large){
free(self);
}else{
PoolObject_dealloc(self);
}
}
void pk_ManagedHeap__mark(pk_ManagedHeap* self){
// for(int i=0; i<self->no_gc.count; i++){
// PyObject* obj = c11__getitem(PyObject*, &self->no_gc, i);
// vm->__obj_gc_mark(obj);
// }
// vm->callstack.apply([vm](Frame& frame) {
// frame._gc_mark(vm);
// });
// vm->obj_gc_mark(vm->__last_exception);
// vm->obj_gc_mark(vm->__curr_class);
// vm->obj_gc_mark(vm->__c.error);
// vm->__stack_gc_mark(vm->s_data.begin(), vm->s_data.end());
// if(self->_gc_marker_ex) self->_gc_marker_ex((pkpy_VM*)vm);
}