This commit is contained in:
blueloveTH 2024-05-20 00:09:48 +08:00
parent a8b92c0ff4
commit 39ad3f2ef4
3 changed files with 11 additions and 18 deletions

View File

@ -43,24 +43,21 @@ struct ManagedHeap{
using __T = std::decay_t<T>; using __T = std::decay_t<T>;
static_assert(!is_sso_v<__T>, "gcnew cannot be used with SSO types"); static_assert(!is_sso_v<__T>, "gcnew cannot be used with SSO types");
// https://github.com/pocketpy/pocketpy/issues/94#issuecomment-1594784476 // https://github.com/pocketpy/pocketpy/issues/94#issuecomment-1594784476
PyObject* p = new(pool128_alloc(py_sizeof<__T>)) PyObject(); PyObject* p = new(pool128_alloc(py_sizeof<__T>)) PyObject(true);
p->placement_new<__T>(std::forward<Args>(args)...); p->placement_new<__T>(std::forward<Args>(args)...);
PyVar obj(type, p); gen.emplace_back(type, p);
gen.push_back(obj);
gc_counter++; gc_counter++;
return obj; return gen.back();
} }
template<typename T, typename... Args> template<typename T, typename... Args>
PyVar _new(Type type, Args&&... args){ PyVar _new(Type type, Args&&... args){
using __T = std::decay_t<T>; using __T = std::decay_t<T>;
static_assert(!is_sso_v<__T>); static_assert(!is_sso_v<__T>);
PyObject* p = new(pool128_alloc<__T>()) PyObject(); PyObject* p = new(pool128_alloc<__T>()) PyObject(false);
p->placement_new<__T>(std::forward<Args>(args)...); p->placement_new<__T>(std::forward<Args>(args)...);
PyVar obj(type, p); _no_gc.emplace_back(type, p);
obj->gc_enabled = false; return _no_gc.back();
_no_gc.push_back(obj);
return obj;
} }
void _delete(PyVar); void _delete(PyVar);

View File

@ -101,7 +101,7 @@ struct Slice {
void _gc_mark(VM*) const; void _gc_mark(VM*) const;
}; };
struct PyObject{ struct PyObject final{
bool gc_enabled; // whether this object is managed by GC bool gc_enabled; // whether this object is managed by GC
bool gc_marked; // whether this object is marked bool gc_marked; // whether this object is marked
NameDict* _attr; NameDict* _attr;
@ -119,7 +119,7 @@ struct PyObject{
return (*_attr)[name]; return (*_attr)[name];
} }
PyObject() : gc_enabled(true), gc_marked(false), _attr(nullptr) {} PyObject(bool gc_enabled) : gc_enabled(gc_enabled), gc_marked(false), _attr(nullptr) {}
template<typename T, typename ...Args> template<typename T, typename ...Args>
void placement_new(Args&&... args){ void placement_new(Args&&... args){

View File

@ -7,11 +7,7 @@ namespace pkpy{
blocks.push_back(CodeBlock(CodeBlockType::NO_BLOCK, -1, 0, 0)); blocks.push_back(CodeBlock(CodeBlockType::NO_BLOCK, -1, 0, 0));
} }
struct PySignalObject: PyObject { PyVar const PY_NULL(Type(), new PyObject(false));
PySignalObject() : PyObject() { gc_enabled = false; } PyVar const PY_OP_CALL(Type(), new PyObject(false));
}; PyVar const PY_OP_YIELD(Type(), new PyObject(false));
PyVar const PY_NULL(Type(), new PySignalObject());
PyVar const PY_OP_CALL(Type(), new PySignalObject());
PyVar const PY_OP_YIELD(Type(), new PySignalObject());
} // namespace pkpy } // namespace pkpy