some refactor

This commit is contained in:
blueloveTH 2024-03-03 01:30:09 +08:00
parent a51eb5a641
commit 3edd4aca67
3 changed files with 10 additions and 15 deletions

View File

@ -53,7 +53,7 @@ struct ManagedHeap{
using __T = Py_<std::decay_t<T>>; using __T = Py_<std::decay_t<T>>;
// https://github.com/pocketpy/pocketpy/issues/94#issuecomment-1594784476 // https://github.com/pocketpy/pocketpy/issues/94#issuecomment-1594784476
PyObject* obj = new(pool64_alloc<__T>()) Py_<std::decay_t<T>>(type, std::forward<Args>(args)...); PyObject* obj = new(pool64_alloc<__T>()) Py_<std::decay_t<T>>(type, std::forward<Args>(args)...);
obj->gc.enabled = false; obj->gc_enabled = false;
_no_gc.push_back(obj); _no_gc.push_back(obj);
return obj; return obj;
} }

View File

@ -94,14 +94,9 @@ struct Slice {
Slice(PyObject* start, PyObject* stop, PyObject* step) : start(start), stop(stop), step(step) {} Slice(PyObject* start, PyObject* stop, PyObject* step) : start(start), stop(stop), step(step) {}
}; };
struct GCHeader {
bool enabled; // whether this object is managed by GC
bool marked; // whether this object is marked
GCHeader() : enabled(true), marked(false) {}
};
struct PyObject{ struct PyObject{
GCHeader gc; bool gc_enabled; // whether this object is managed by GC
bool gc_marked; // whether this object is marked
Type type; Type type;
NameDict* _attr; NameDict* _attr;
@ -114,7 +109,7 @@ struct PyObject{
virtual void _obj_gc_mark() = 0; virtual void _obj_gc_mark() = 0;
virtual void* _value_ptr() = 0; virtual void* _value_ptr() = 0;
PyObject(Type type) : type(type), _attr(nullptr) {} PyObject(Type type) : gc_enabled(true), gc_marked(false), type(type), _attr(nullptr) {}
virtual ~PyObject(); virtual ~PyObject();
@ -129,7 +124,7 @@ struct PyObject{
struct PySignalObject: PyObject { struct PySignalObject: PyObject {
PySignalObject() : PyObject(0) { PySignalObject() : PyObject(0) {
gc.enabled = false; gc_enabled = false;
} }
void _obj_gc_mark() override {} void _obj_gc_mark() override {}
void* _value_ptr() override { return nullptr; } void* _value_ptr() override { return nullptr; }
@ -195,8 +190,8 @@ struct MappingProxy{
#define PK_OBJ_GET(T, obj) (((Py_<T>*)(obj))->_value) #define PK_OBJ_GET(T, obj) (((Py_<T>*)(obj))->_value)
#define PK_OBJ_MARK(obj) \ #define PK_OBJ_MARK(obj) \
if(!is_tagged(obj) && !(obj)->gc.marked) { \ if(!is_tagged(obj) && !(obj)->gc_marked) { \
(obj)->gc.marked = true; \ (obj)->gc_marked = true; \
(obj)->_obj_gc_mark(); \ (obj)->_obj_gc_mark(); \
if((obj)->is_attr_valid()) gc_mark_namedict((obj)->attr()); \ if((obj)->is_attr_valid()) gc_mark_namedict((obj)->attr()); \
} }

View File

@ -5,8 +5,8 @@ namespace pkpy{
int ManagedHeap::sweep(){ int ManagedHeap::sweep(){
std::vector<PyObject*> alive; std::vector<PyObject*> alive;
for(PyObject* obj: gen){ for(PyObject* obj: gen){
if(obj->gc.marked){ if(obj->gc_marked){
obj->gc.marked = false; obj->gc_marked = false;
alive.push_back(obj); alive.push_back(obj);
}else{ }else{
#if PK_DEBUG_GC_STATS #if PK_DEBUG_GC_STATS
@ -19,7 +19,7 @@ namespace pkpy{
} }
// clear _no_gc marked flag // clear _no_gc marked flag
for(PyObject* obj: _no_gc) obj->gc.marked = false; for(PyObject* obj: _no_gc) obj->gc_marked = false;
int freed = gen.size() - alive.size(); int freed = gen.size() - alive.size();