This commit is contained in:
blueloveTH 2025-02-06 14:37:56 +08:00
parent f2be5cf0f4
commit cd81927380
5 changed files with 11 additions and 17 deletions

View File

@ -55,7 +55,7 @@ void VM__pop_frame(VM* self);
bool pk__parse_int_slice(py_Ref slice, int length, int* start, int* stop, int* step); bool pk__parse_int_slice(py_Ref slice, int length, int* start, int* stop, int* step);
bool pk__normalize_index(int* index, int length); bool pk__normalize_index(int* index, int length);
void pk__mark_value(py_TValue*); #define pk__mark_value(val) if((val)->is_ptr && !(val)->_obj->gc_marked) PyObject__mark((val)->_obj)
void pk__mark_namedict(NameDict*); void pk__mark_namedict(NameDict*);
void pk__tp_set_marker(py_Type type, void (*gc_mark)(void*)); void pk__tp_set_marker(py_Type type, void (*gc_mark)(void*));
bool pk__object_new(int argc, py_Ref argv); bool pk__object_new(int argc, py_Ref argv);

View File

@ -25,4 +25,4 @@ void ModuleDict__dtor(ModuleDict* self);
void ModuleDict__set(ModuleDict* self, const char* key, py_TValue val); void ModuleDict__set(ModuleDict* self, const char* key, py_TValue val);
py_TValue* ModuleDict__try_get(ModuleDict* self, const char* path); py_TValue* ModuleDict__try_get(ModuleDict* self, const char* path);
bool ModuleDict__contains(ModuleDict* self, const char* path); bool ModuleDict__contains(ModuleDict* self, const char* path);
void ModuleDict__apply_mark(ModuleDict* self, void (*marker)(py_TValue*)); void ModuleDict__apply_mark(ModuleDict* self);

View File

@ -24,3 +24,4 @@ void* PyObject__userdata(PyObject* self);
#define PK_OBJ_SLOTS_SIZE(slots) ((slots) >= 0 ? sizeof(py_TValue) * (slots) : sizeof(NameDict)) #define PK_OBJ_SLOTS_SIZE(slots) ((slots) >= 0 ? sizeof(py_TValue) * (slots) : sizeof(NameDict))
void PyObject__dtor(PyObject* self); void PyObject__dtor(PyObject* self);
void PyObject__mark(PyObject* self);

View File

@ -585,14 +585,6 @@ void PyObject__dtor(PyObject* self) {
if(self->slots == -1) NameDict__dtor(PyObject__dict(self)); if(self->slots == -1) NameDict__dtor(PyObject__dict(self));
} }
static void mark_object(PyObject* obj);
void pk__mark_value(py_TValue* val) {
if(val->is_ptr && !val->_obj->gc_marked) {
mark_object(val->_obj);
}
}
void pk__mark_namedict(NameDict* dict) { void pk__mark_namedict(NameDict* dict) {
for(int i = 0; i < dict->length; i++) { for(int i = 0; i < dict->length; i++) {
NameDict_KV* kv = c11__at(NameDict_KV, dict, i); NameDict_KV* kv = c11__at(NameDict_KV, dict, i);
@ -606,9 +598,9 @@ void pk__tp_set_marker(py_Type type, void (*gc_mark)(void*)) {
ti->gc_mark = gc_mark; ti->gc_mark = gc_mark;
} }
static void mark_object(PyObject* obj) { void PyObject__mark(PyObject* obj) {
assert(!obj->gc_marked); assert(!obj->gc_marked);
obj->gc_marked = true; obj->gc_marked = true;
if(obj->slots > 0) { if(obj->slots > 0) {
@ -654,7 +646,7 @@ void ManagedHeap__mark(ManagedHeap* self) {
pk__mark_value(&vm->ascii_literals[i]); pk__mark_value(&vm->ascii_literals[i]);
} }
// mark modules // mark modules
ModuleDict__apply_mark(&vm->modules, pk__mark_value); ModuleDict__apply_mark(&vm->modules);
// mark types // mark types
int types_length = vm->types.length; int types_length = vm->types.length;
// 0-th type is placeholder // 0-th type is placeholder

View File

@ -1,4 +1,5 @@
#include "pocketpy/objects/namedict.h" #include "pocketpy/objects/namedict.h"
#include "pocketpy/objects/object.h"
#define SMALLMAP_T__SOURCE #define SMALLMAP_T__SOURCE
#define K uint16_t #define K uint16_t
@ -74,8 +75,8 @@ bool ModuleDict__contains(ModuleDict* self, const char* path) {
return ModuleDict__try_get(self, path) != NULL; return ModuleDict__try_get(self, path) != NULL;
} }
void ModuleDict__apply_mark(ModuleDict *self, void (*marker)(py_TValue*)) { void ModuleDict__apply_mark(ModuleDict *self) {
if(self->left) ModuleDict__apply_mark(self->left, marker); PyObject__mark(self->module._obj);
if(self->right) ModuleDict__apply_mark(self->right, marker); if(self->left) ModuleDict__apply_mark(self->left);
marker(&self->module); if(self->right) ModuleDict__apply_mark(self->right);
} }