static PyObject* _BoundSignal_New( PyObject* owner, PyObject* objref ) { PyObjectPtr ownerptr( owner, true ); PyObjectPtr objrefptr( objref, true ); PyObjectPtr bsigptr; if( numfree > 0 ) { PyObject* o = reinterpret_cast<PyObject*>( freelist[ --numfree ] ); _Py_NewReference( o ); bsigptr = o; } else { bsigptr = PyType_GenericAlloc( &BoundSignal_Type, 0 ); if( !bsigptr ) return 0; } BoundSignal* bsig = reinterpret_cast<BoundSignal*>( bsigptr.get() ); bsig->owner = ownerptr.release(); bsig->objref = objrefptr.release(); return bsigptr.release(); }
static PyObject* load_dynamic_attr( PyObject* obj, PyObject* name, PyObject* tracer=0 ) { PyTypeObject* tp; PyObject** dictptr; PyObjectPtr descr; descrgetfunc descr_f; PyObjectPtr objptr( newref( obj ) ); // The body of this loop is PyObject_GenericGetAttr, modified to // use smart pointers and _PyObject_GetDictPtr, and run a tracer. while( objptr.get() != Py_None ) { tp = Py_TYPE( objptr.get() ); // Data descriptor descr_f = 0; descr = xnewref( _PyType_Lookup( tp, name ) ); if( descr && PyType_HasFeature( descr.get()->ob_type, Py_TPFLAGS_HAVE_CLASS ) ) { descr_f = descr.get()->ob_type->tp_descr_get; if( descr_f && PyDescr_IsData( descr.get() ) ) { PyObjectPtr res( descr_f( descr.get(), objptr.get(), pyobject_cast( tp ) ) ); if( !res ) maybe_translate_key_error(); else if( tracer && !run_tracer( tracer, objptr.get(), name, res.get() ) ) return 0; return res.release(); } } // Instance dictionary dictptr = _PyObject_GetDictPtr( objptr.get() ); if( dictptr && *dictptr ) { PyObject* item = PyDict_GetItem( *dictptr, name ); if( item ) { if( tracer && !run_tracer( tracer, objptr.get(), name, item ) ) return 0; return newref( item ); } } // Non-data descriptor if( descr_f ) { PyObjectPtr res( descr_f( descr.get(), objptr.get(), pyobject_cast( tp ) ) ); if( !res ) maybe_translate_key_error(); else if( tracer && !run_tracer( tracer, objptr.get(), name, res.get() ) ) return 0; return res.release(); } // Non-readable descriptor if( descr ) { if( tracer && !run_tracer( tracer, objptr.get(), name, descr.get() ) ) return 0; return descr.release(); } // Step up to the parent object objptr = PyObject_GetAttr( objptr.get(), parent_str ); if( !objptr ) return 0; } return 0; }