23 PyMethodDef methoddef_ = {
24 const_cast< char*
>(
"TMemoryRegulator_internal_ObjectEraseCallback" ),
30 PyObject* gObjectEraseCallback = PyCFunction_New( &methoddef_,
NULL );
34 PyTypeObject PyROOT_NoneType;
45 PyMappingMethods PyROOT_NoneType_mapping = {
53 struct InitPyROOT_NoneType_t {
54 InitPyROOT_NoneType_t()
57 memset( &PyROOT_NoneType, 0,
sizeof( PyROOT_NoneType ) );
59 ((
PyObject&)PyROOT_NoneType).ob_type = &PyType_Type;
60 ((
PyObject&)PyROOT_NoneType).ob_refcnt = 1;
61 ((PyVarObject&)PyROOT_NoneType).ob_size = 0;
63 PyROOT_NoneType.tp_name =
const_cast< char*
>(
"PyROOT_NoneType" );
64 PyROOT_NoneType.tp_flags = Py_TPFLAGS_HAVE_RICHCOMPARE | Py_TPFLAGS_HAVE_GC;
66 PyROOT_NoneType.tp_traverse = (traverseproc) 0;
67 PyROOT_NoneType.tp_clear = (inquiry) 0;
68 PyROOT_NoneType.tp_dealloc = (destructor) &InitPyROOT_NoneType_t::DeAlloc;
69 PyROOT_NoneType.tp_repr =
Py_TYPE(Py_None)->tp_repr;
70 PyROOT_NoneType.tp_richcompare = (richcmpfunc) &InitPyROOT_NoneType_t::RichCompare;
71 #if PY_VERSION_HEX < 0x03000000
75 PyROOT_NoneType.tp_hash = (hashfunc) &InitPyROOT_NoneType_t::PtrHash;
77 PyROOT_NoneType.tp_as_mapping = &PyROOT_NoneType_mapping;
79 PyType_Ready( &PyROOT_NoneType );
87 return PyObject_RichCompare( other, Py_None, opid );
92 #if PY_VERSION_HEX < 0x03000000
93 return PyObject_Compare( other, Py_None );
96 return ! PyObject_RichCompareBool( other, Py_None, Py_EQ );
108 static InitPyROOT_NoneType_t initPyROOT_NoneType;
122 delete fgWeakRefTable;
125 delete fgObjectTable;
134 if ( !
object || ! fgObjectTable )
138 ObjectMap_t::iterator ppo = fgObjectTable->find(
object );
140 if ( ppo != fgObjectTable->end() ) {
141 fgWeakRefTable->erase( fgWeakRefTable->find( ppo->second ) );
146 fgObjectTable->erase( ppo );
151 Py_DECREF( ppo->second );
155 if ( ! PyROOT_NoneType.tp_traverse ) {
160 PyROOT_NoneType.tp_traverse =
Py_TYPE(pyobj)->tp_traverse;
161 PyROOT_NoneType.tp_clear =
Py_TYPE(pyobj)->tp_clear;
162 PyROOT_NoneType.tp_free =
Py_TYPE(pyobj)->tp_free;
163 }
else if ( PyROOT_NoneType.tp_traverse !=
Py_TYPE(pyobj)->tp_traverse ) {
164 std::cerr <<
"in PyROOT::TMemoryRegulater, unexpected object of type: "
165 <<
Py_TYPE(pyobj)->tp_name << std::endl;
172 int refcnt = ((
PyObject*)pyobj)->ob_refcnt;
174 PyObject_ClearWeakRefs( (
PyObject*)pyobj );
175 ((
PyObject*)pyobj)->ob_refcnt = refcnt;
182 Py_INCREF( (
PyObject*)(
void*)&PyROOT_NoneType );
184 ((
PyObject*)pyobj)->ob_type = &PyROOT_NoneType;
188 fgObjectTable->erase( ppo );
197 if ( ! ( pyobj &&
object ) )
200 ObjectMap_t::iterator ppo = fgObjectTable->find(
object );
201 if ( ppo == fgObjectTable->end() ) {
203 PyObject* pyref = PyWeakref_NewRef( (
PyObject*)pyobj, gObjectEraseCallback );
204 ObjectMap_t::iterator newppo = fgObjectTable->insert( std::make_pair(
object, pyref ) ).first;
205 (*fgWeakRefTable)[ pyref ] = newppo;
217 ObjectMap_t::iterator ppo = fgObjectTable->find(
object );
219 if ( ppo != fgObjectTable->end() ) {
220 fgWeakRefTable->erase( fgWeakRefTable->find( ppo->second ) );
221 fgObjectTable->erase( ppo );
236 ObjectMap_t::iterator ppo = fgObjectTable->find(
object );
237 if ( ppo != fgObjectTable->end() ) {
238 PyObject* pyobj = PyWeakref_GetObject( ppo->second );
240 if ( pyobj && ((
ObjectProxy*)pyobj)->ObjectIsA() != klass ) {
267 ObjectMap_t::iterator ppo = fgObjectTable->find(
object );
268 if ( ppo != fgObjectTable->end() ) {
270 fgWeakRefTable->erase( fgWeakRefTable->find( ppo->second ) );
271 Py_DECREF( ppo->second );
272 fgObjectTable->erase( ppo );
277 WeakRefMap_t::iterator wri = fgWeakRefTable->find( pyref );
278 if ( wri != fgWeakRefTable->end() ) {
279 fgObjectTable->erase( wri->second );
280 fgWeakRefTable->erase( wri );
285 Py_INCREF( Py_None );
static PyObject * RetrieveObject(TObject *object, Cppyy::TCppType_t klass)
lookup