mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-23 13:00:17 +00:00
some refactor
This commit is contained in:
parent
a51eb5a641
commit
3edd4aca67
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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()); \
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user