diff options
author | Marcelo Lira <marcelo.lira@openbossa.org> | 2010-03-04 16:34:45 -0300 |
---|---|---|
committer | Marcelo Lira <marcelo.lira@openbossa.org> | 2010-03-04 17:13:40 -0300 |
commit | f4db0c74e0f267c102fff6eb47ecc3eae628a637 (patch) | |
tree | e988b735d382f9d814078a9fba2009f9d6a38a39 /libshiboken/basewrapper.cpp | |
parent | dbeca960863dadbe8d496195bc60202619314214 (diff) | |
parent | edc9cbfcfde439ccfe7100f53efc5d1e4ec34480 (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/basewrapper.cpp')
-rw-r--r-- | libshiboken/basewrapper.cpp | 39 |
1 files changed, 21 insertions, 18 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 |