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>>;
|
||||
// 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)...);
|
||||
obj->gc.enabled = false;
|
||||
obj->gc_enabled = false;
|
||||
_no_gc.push_back(obj);
|
||||
return obj;
|
||||
}
|
||||
|
@ -94,14 +94,9 @@ struct Slice {
|
||||
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{
|
||||
GCHeader gc;
|
||||
bool gc_enabled; // whether this object is managed by GC
|
||||
bool gc_marked; // whether this object is marked
|
||||
Type type;
|
||||
NameDict* _attr;
|
||||
|
||||
@ -114,7 +109,7 @@ struct PyObject{
|
||||
virtual void _obj_gc_mark() = 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();
|
||||
|
||||
@ -129,7 +124,7 @@ struct PyObject{
|
||||
|
||||
struct PySignalObject: PyObject {
|
||||
PySignalObject() : PyObject(0) {
|
||||
gc.enabled = false;
|
||||
gc_enabled = false;
|
||||
}
|
||||
void _obj_gc_mark() override {}
|
||||
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_MARK(obj) \
|
||||
if(!is_tagged(obj) && !(obj)->gc.marked) { \
|
||||
(obj)->gc.marked = true; \
|
||||
if(!is_tagged(obj) && !(obj)->gc_marked) { \
|
||||
(obj)->gc_marked = true; \
|
||||
(obj)->_obj_gc_mark(); \
|
||||
if((obj)->is_attr_valid()) gc_mark_namedict((obj)->attr()); \
|
||||
}
|
||||
|
@ -5,8 +5,8 @@ namespace pkpy{
|
||||
int ManagedHeap::sweep(){
|
||||
std::vector<PyObject*> alive;
|
||||
for(PyObject* obj: gen){
|
||||
if(obj->gc.marked){
|
||||
obj->gc.marked = false;
|
||||
if(obj->gc_marked){
|
||||
obj->gc_marked = false;
|
||||
alive.push_back(obj);
|
||||
}else{
|
||||
#if PK_DEBUG_GC_STATS
|
||||
@ -19,7 +19,7 @@ namespace pkpy{
|
||||
}
|
||||
|
||||
// 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();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user