26#if defined(__GNUC__) && \
28 (__GNUC__ >= 4 && ((__GNUC_MINOR__ == 2 && __GNUC_PATCHLEVEL__ >= 1) || \
29 (__GNUC_MINOR__ >= 3)))) && \
31#pragma GCC diagnostic ignored "-Wstrict-aliasing"
37struct Initcpyrt_NoneType_t {
38 Initcpyrt_NoneType_t() {
51 cpyrt_NoneType.tp_dealloc = (destructor)&Initcpyrt_NoneType_t::DeAlloc;
54 (richcmpfunc)&Initcpyrt_NoneType_t::RichCompare;
62 static void DeAlloc(
PyObject* pyobj) { Py_TYPE(pyobj)->tp_free(pyobj); }
63 static int PtrHash(
PyObject* pyobj) {
return (
int)ptrdiff_t(pyobj); }
66 return PyObject_RichCompare(other, Py_None, opid);
72 return !PyObject_RichCompareBool(other, Py_None, Py_EQ);
85 static Initcpyrt_NoneType_t initcpyrt_NoneType;
108 CppToPyMap_t::iterator ppo = cppobjs->find(cppobj);
110 if (ppo != cppobjs->end()) {
121 Py_INCREF(Py_TYPE(pyobj));
129 }
else if (
cpyrt_NoneType.tp_traverse != Py_TYPE(pyobj)->tp_traverse) {
131 std::cerr <<
"in cpyrt::MemoryRegulater, unexpected object of type: "
132 << Py_TYPE(pyobj)->tp_name << std::endl;
140 Py_ssize_t refcnt = Py_REFCNT((
PyObject*)pyobj);
142 PyObject_ClearWeakRefs((
PyObject*)pyobj);
143 Py_SET_REFCNT((
PyObject*)pyobj, refcnt);
151 Py_DECREF(Py_TYPE(pyobj));
167 if (!(pyobj && cppobj))
171 auto res = registerHook(cppobj, pyobj->
ObjectIsA(
false));
182 const auto& res = cppobjs->insert(std::make_pair(cppobj, (
PyObject*)pyobj));
185 (*cppobjs)[cppobj] = (
PyObject*)pyobj;
197 if (!(pyobj && pyclass))
205 if (unregisterHook) {
206 auto res = unregisterHook(cppobj, ((
CPPClass*)pyclass)->fCppType);
216 if (cppobjs->erase(cppobj)) {
229 if (!(cppobj && pyclass))
236 CppToPyMap_t::iterator ppo = cppobjs->find(cppobj);
237 if (ppo != cppobjs->end()) {
238 Py_INCREF(ppo->second);
static Py_ssize_t AlwaysNullLength(PyObject *)
static PyTypeObject cpyrt_NoneType
static PyMappingMethods cpyrt_NoneType_mapping
Int_t Compare(const void *item1, const void *item2)
interop::TCppScope_t ObjectIsA(bool check_smart=true) const
static bool RegisterPyObject(CPPInstance *pyobj, interop::TCppObject_t cppobj)
static PyObject * RetrievePyObject(interop::TCppObject_t cppobj, PyObject *pyclass)
static MemHook_t registerHook
static bool UnregisterPyObject(CPPInstance *pyobj, PyObject *pyclass)
static void SetRegisterHook(MemHook_t h)
static bool RecursiveRemove(interop::TCppObject_t cppobj, interop::TCppScope_t klass)
static MemHook_t unregisterHook
static void SetUnregisterHook(MemHook_t h)
PyObject * GetScopeProxy(interop::TCppScope_t)
void op_dealloc_nofree(CPPInstance *)
std::function< std::pair< bool, bool >(interop::TCppObject_t, interop::TCppScope_t)> MemHook_t
std::unordered_map< interop::TCppObject_t, PyObject * > CppToPyMap_t
Type object to hold class reference (this is only semantically a presentation of CPPScope instances,...
bool CPPScope_Check(T *object)
Cpp::ObjectRef TCppObject_t