aboutsummaryrefslogtreecommitdiffstats
path: root/libshiboken
diff options
context:
space:
mode:
authorMarcelo Lira <marcelo.lira@openbossa.org>2010-03-04 16:34:45 -0300
committerMarcelo Lira <marcelo.lira@openbossa.org>2010-03-04 17:13:40 -0300
commitf4db0c74e0f267c102fff6eb47ecc3eae628a637 (patch)
treee988b735d382f9d814078a9fba2009f9d6a38a39 /libshiboken
parentdbeca960863dadbe8d496195bc60202619314214 (diff)
parentedc9cbfcfde439ccfe7100f53efc5d1e4ec34480 (diff)
Merge branch 'master' into extensibleconversions
Conflicts: cppgenerator.cpp libshiboken/basewrapper.cpp Reviewed by Hugo Parente <hugo.lima@openbossa.org> Reviewed by Lauro Moura <lauro.neto@openbossa.org>
Diffstat (limited to 'libshiboken')
-rw-r--r--libshiboken/basewrapper.cpp39
-rw-r--r--libshiboken/basewrapper.h18
-rw-r--r--libshiboken/conversions.h2
3 files changed, 36 insertions, 23 deletions
diff --git a/libshiboken/basewrapper.cpp b/libshiboken/basewrapper.cpp
index 358d6b249..a01fc57af 100644
--- a/libshiboken/basewrapper.cpp
+++ b/libshiboken/basewrapper.cpp
@@ -125,12 +125,8 @@ PyObject* SbkBaseWrapper_New(SbkBaseWrapperType* instanceType,
bool isExactType)
{
// Try to find the exact type of cptr.
- if (!isExactType && instanceType->type_name_func) {
- const char* typeName = instanceType->type_name_func(cptr);
- TypeResolver* typeResolver = TypeResolver::get(typeName);
- if (typeResolver)
- instanceType = reinterpret_cast<SbkBaseWrapperType*>(typeResolver->pythonType());
- }
+ if (!isExactType && instanceType->type_discovery)
+ instanceType = instanceType->type_discovery->getType(cptr, instanceType);
SbkBaseWrapper* self = reinterpret_cast<SbkBaseWrapper*>(SbkBaseWrapper_TpNew(reinterpret_cast<PyTypeObject*>(instanceType), 0, 0));
self->cptr = const_cast<void*>(cptr);
@@ -230,18 +226,14 @@ SbkBaseWrapperType_TpNew(PyTypeObject* metatype, PyObject* args, PyObject* kwds)
newType->mi_offsets = parentType->mi_offsets;
newType->mi_init = parentType->mi_init;
newType->mi_specialcast = parentType->mi_specialcast;
- newType->type_name_func = parentType->type_name_func;
newType->ext_isconvertible = parentType->ext_isconvertible;
newType->ext_tocpp = parentType->ext_tocpp;
+ newType->type_discovery = parentType->type_discovery;
+ newType->obj_copier = parentType->obj_copier;
return reinterpret_cast<PyObject*>(newType);
}
-extern "C"
-{
-
-struct SbkBaseWrapperType_Type;
-
PyTypeObject SbkBaseWrapperType_Type = {
PyObject_HEAD_INIT(0)
/*ob_size*/ 0,
@@ -274,7 +266,7 @@ PyTypeObject SbkBaseWrapperType_Type = {
/*tp_methods*/ 0,
/*tp_members*/ 0,
/*tp_getset*/ 0,
- /*tp_base*/ 0,
+ /*tp_base*/ &PyType_Type,
/*tp_dict*/ 0,
/*tp_descr_get*/ 0,
/*tp_descr_set*/ 0,
@@ -291,8 +283,6 @@ PyTypeObject SbkBaseWrapperType_Type = {
/*tp_weaklist*/ 0
};
-} // extern "C"
-
static PyObject* SbkBaseWrapper_get_dict(SbkBaseWrapper* obj)
{
if (!obj->ob_dict)
@@ -374,8 +364,6 @@ void initShiboken()
PyEval_InitThreads();
#endif
- SbkBaseWrapperType_Type.tp_base = &PyType_Type;
-
if (PyType_Ready(&SbkBaseWrapperType_Type) < 0)
Py_FatalError("[libshiboken] Failed to initialise Shiboken.BaseWrapperType metatype.");
@@ -422,7 +410,22 @@ void setErrorAboutWrongArguments(PyObject* args, const char* funcName, const cha
}
-} // namespace Shiboken
+SbkBaseWrapperType* TypeDiscovery::getType(const void* cptr, SbkBaseWrapperType* instanceType) const
+{
+ TypeDiscoveryFuncList::const_reverse_iterator it = m_discoveryFunctions.rbegin();
+ for (; it != m_discoveryFunctions.rend(); ++it) {
+ SbkBaseWrapperType* type = (*it)(const_cast<void*>(cptr), instanceType);
+ if (type)
+ return type;
+ }
+ return instanceType;
+}
+void TypeDiscovery::addTypeDiscoveryFunction(Shiboken::TypeDiscoveryFunc func)
+{
+ m_discoveryFunctions.push_back(func);
+}
+
+} // namespace Shiboken
diff --git a/libshiboken/basewrapper.h b/libshiboken/basewrapper.h
index 6383a7686..2474fa591 100644
--- a/libshiboken/basewrapper.h
+++ b/libshiboken/basewrapper.h
@@ -75,9 +75,10 @@ struct SbkBaseWrapperType;
* part of a multiple inheritance hierarchy.
* The implementation of this function is auto generated by the generator and you don't need to care about it.
*/
-typedef void* (*SpecialCastFunction)(PyObject*, SbkBaseWrapperType*);
-typedef const char* (*TypeNameFunction)(const void*);
+typedef void* (*SpecialCastFunction)(void*, SbkBaseWrapperType*);
typedef void* (*ObjectCopierFunction)(const void*);
+typedef SbkBaseWrapperType* (*TypeDiscoveryFunc)(void*, SbkBaseWrapperType*);
+typedef std::list<TypeDiscoveryFunc> TypeDiscoveryFuncList;
typedef void* (*ExtendedToCppFunc)(PyObject*);
typedef bool (*ExtendedIsConvertibleFunc)(PyObject*);
@@ -85,6 +86,14 @@ typedef bool (*ExtendedIsConvertibleFunc)(PyObject*);
LIBSHIBOKEN_API PyAPI_DATA(PyTypeObject) SbkBaseWrapperType_Type;
LIBSHIBOKEN_API PyAPI_DATA(SbkBaseWrapperType) SbkBaseWrapper_Type;
+class LIBSHIBOKEN_API TypeDiscovery {
+public:
+ SbkBaseWrapperType* getType(const void* cptr, SbkBaseWrapperType* instanceType) const;
+ void addTypeDiscoveryFunction(TypeDiscoveryFunc func);
+private:
+ TypeDiscoveryFuncList m_discoveryFunctions;
+};
+
/// PyTypeObject extended with C++ multiple inheritance information.
struct LIBSHIBOKEN_API SbkBaseWrapperType
{
@@ -93,7 +102,7 @@ struct LIBSHIBOKEN_API SbkBaseWrapperType
MultipleInheritanceInitFunction mi_init;
/// Special cast function, null if this class doesn't have multiple inheritance.
SpecialCastFunction mi_specialcast;
- TypeNameFunction type_name_func;
+ TypeDiscovery* type_discovery;
ObjectCopierFunction obj_copier;
/// Extended "isConvertible" function to be used when a conversion operator is defined in another module.
ExtendedIsConvertibleFunc ext_isconvertible;
@@ -263,7 +272,8 @@ void SbkBaseWrapper_Dealloc(PyObject* self)
if (SbkBaseWrapper_hasParentInfo(self))
destroyParentInfo(reinterpret_cast<SbkBaseWrapper*>(self));
SbkBaseWrapper_clearReferences(reinterpret_cast<SbkBaseWrapper*>(self));
- Py_TYPE(reinterpret_cast<SbkBaseWrapper*>(self))->tp_free(self);
+
+ Py_TYPE(self)->tp_free(self);
}
LIBSHIBOKEN_API PyAPI_FUNC(void) SbkBaseWrapper_Dealloc_PrivateDtor(PyObject* self);
diff --git a/libshiboken/conversions.h b/libshiboken/conversions.h
index 48f28048a..e40ebf2f0 100644
--- a/libshiboken/conversions.h
+++ b/libshiboken/conversions.h
@@ -252,7 +252,7 @@ struct ObjectTypeConverter
return 0;
SbkBaseWrapperType* shiboType = reinterpret_cast<SbkBaseWrapperType*>(pyobj->ob_type);
if (shiboType->mi_specialcast)
- return (T*) shiboType->mi_specialcast(pyobj, reinterpret_cast<SbkBaseWrapperType*>(SbkType<T>()));
+ return (T*) shiboType->mi_specialcast(SbkBaseWrapper_cptr(pyobj), reinterpret_cast<SbkBaseWrapperType*>(SbkType<T>()));
return (T*) SbkBaseWrapper_cptr(pyobj);
}
};