diff --git a/bindings/pyroot/src/TMemoryRegulator.cxx b/bindings/pyroot/src/TMemoryRegulator.cxx index 1a71a6a2ffb0cc4a90b7154bc1a7288f4c95f180..270fe4d223a8ca241aacec76ff3972862ee8aedf 100644 --- a/bindings/pyroot/src/TMemoryRegulator.cxx +++ b/bindings/pyroot/src/TMemoryRegulator.cxx @@ -20,16 +20,13 @@ PyROOT::TMemoryRegulator::WeakRefMap_t* PyROOT::TMemoryRegulator::fgWeakRefTable namespace { // memory regulater callback for deletion of registered objects - PyMethodDef methoddef_ = { + PyMethodDef gObjectEraseMethodDef = { const_cast< char* >( "TMemoryRegulator_internal_ObjectEraseCallback" ), (PyCFunction) PyROOT::TMemoryRegulator::ObjectEraseCallback, METH_O, NULL }; - PyObject* gObjectEraseCallback = PyCFunction_New( &methoddef_, NULL ); - - // pseudo-None type for masking out objects on the python side PyTypeObject PyROOT_NoneType; @@ -199,13 +196,15 @@ void PyROOT::TMemoryRegulator::RecursiveRemove( TObject* object ) Bool_t PyROOT::TMemoryRegulator::RegisterObject( ObjectProxy* pyobj, TObject* object ) { + static PyObject* objectEraseCallback = PyCFunction_New(&gObjectEraseMethodDef, nullptr); + if ( ! ( pyobj && object ) ) return kFALSE; ObjectMap_t::iterator ppo = fgObjectTable->find( object ); if ( ppo == fgObjectTable->end() ) { object->SetBit( TObject::kMustCleanup ); - PyObject* pyref = PyWeakref_NewRef( (PyObject*)pyobj, gObjectEraseCallback ); + PyObject* pyref = PyWeakref_NewRef( (PyObject*)pyobj, objectEraseCallback ); ObjectMap_t::iterator newppo = fgObjectTable->insert( std::make_pair( object, pyref ) ).first; (*fgWeakRefTable)[ pyref ] = newppo; // no Py_INCREF on pyref, as object table has one return kTRUE;