mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-23 04:50:17 +00:00
some fix
This commit is contained in:
parent
a8b92c0ff4
commit
39ad3f2ef4
@ -43,24 +43,21 @@ struct ManagedHeap{
|
||||
using __T = std::decay_t<T>;
|
||||
static_assert(!is_sso_v<__T>, "gcnew cannot be used with SSO types");
|
||||
// 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)...);
|
||||
PyVar obj(type, p);
|
||||
gen.push_back(obj);
|
||||
gen.emplace_back(type, p);
|
||||
gc_counter++;
|
||||
return obj;
|
||||
return gen.back();
|
||||
}
|
||||
|
||||
template<typename T, typename... Args>
|
||||
PyVar _new(Type type, Args&&... args){
|
||||
using __T = std::decay_t<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)...);
|
||||
PyVar obj(type, p);
|
||||
obj->gc_enabled = false;
|
||||
_no_gc.push_back(obj);
|
||||
return obj;
|
||||
_no_gc.emplace_back(type, p);
|
||||
return _no_gc.back();
|
||||
}
|
||||
|
||||
void _delete(PyVar);
|
||||
|
@ -101,7 +101,7 @@ struct Slice {
|
||||
void _gc_mark(VM*) const;
|
||||
};
|
||||
|
||||
struct PyObject{
|
||||
struct PyObject final{
|
||||
bool gc_enabled; // whether this object is managed by GC
|
||||
bool gc_marked; // whether this object is marked
|
||||
NameDict* _attr;
|
||||
@ -119,7 +119,7 @@ struct PyObject{
|
||||
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>
|
||||
void placement_new(Args&&... args){
|
||||
|
@ -7,11 +7,7 @@ namespace pkpy{
|
||||
blocks.push_back(CodeBlock(CodeBlockType::NO_BLOCK, -1, 0, 0));
|
||||
}
|
||||
|
||||
struct PySignalObject: PyObject {
|
||||
PySignalObject() : PyObject() { gc_enabled = false; }
|
||||
};
|
||||
|
||||
PyVar const PY_NULL(Type(), new PySignalObject());
|
||||
PyVar const PY_OP_CALL(Type(), new PySignalObject());
|
||||
PyVar const PY_OP_YIELD(Type(), new PySignalObject());
|
||||
PyVar const PY_NULL(Type(), new PyObject(false));
|
||||
PyVar const PY_OP_CALL(Type(), new PyObject(false));
|
||||
PyVar const PY_OP_YIELD(Type(), new PyObject(false));
|
||||
} // namespace pkpy
|
Loading…
x
Reference in New Issue
Block a user