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>;
|
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);
|
||||||
|
@ -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){
|
||||||
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user