diff options
Diffstat (limited to 'libshiboken/basewrapper.cpp')
-rw-r--r-- | libshiboken/basewrapper.cpp | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/libshiboken/basewrapper.cpp b/libshiboken/basewrapper.cpp index 6503616ab..0e2f2c89a 100644 --- a/libshiboken/basewrapper.cpp +++ b/libshiboken/basewrapper.cpp @@ -626,6 +626,38 @@ void initPrivateData(SbkObjectType* self) memset(self->d, 0, sizeof(SbkObjectTypePrivate)); } +bool introduceWrapperType(PyObject* enclosingObject, + const char* typeName, const char* originalName, + SbkObjectType* type, ObjectDestructor cppObjDtor, + SbkObjectType* baseType, PyObject* baseTypes, + bool isInnerClass) +{ + initPrivateData(type); + setOriginalName(type, originalName); + setDestructorFunction(type, cppObjDtor); + + if (baseType) { + type->super.ht_type.tp_base = (PyTypeObject*)baseType; + if (baseTypes) { + for (int i = 0; i < PySequence_Fast_GET_SIZE(baseTypes); ++i) + BindingManager::instance().addClassInheritance((SbkObjectType*)PySequence_Fast_GET_ITEM(baseTypes, i), type); + type->super.ht_type.tp_bases = baseTypes; + } else { + BindingManager::instance().addClassInheritance(baseType, type); + } + } + + if (PyType_Ready((PyTypeObject*)type) < 0) + return false; + + if (isInnerClass) + return PyDict_SetItemString(enclosingObject, typeName, (PyObject*)type) == 0; + + //PyModule_AddObject steals type's reference. + Py_INCREF((PyObject*)type); + return PyModule_AddObject(enclosingObject, typeName, (PyObject*)type) == 0; +} + void setSubTypeInitHook(SbkObjectType* self, SubTypeInitHook func) { self->d->subtype_init = func; @@ -1185,5 +1217,3 @@ void clearReferences(SbkObject* self) } // namespace Object } // namespace Shiboken - - |