diff options
author | Marcelo Lira <marcelo.lira@openbossa.org> | 2011-10-28 15:25:22 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:18:31 -0300 |
commit | 670cde3115f372b70768f14cf19d236f0d019f99 (patch) | |
tree | 7a1a6022ea58f92e6ea5cb8f03128c77332cfa4e | |
parent | 121373c06d6b99a6614c7577c17812dec2237895 (diff) |
Register type converters by name.
This way they can be queried as the soon-to-be-deprecated TypeResolvers.
-rw-r--r-- | generator/cppgenerator.cpp | 28 | ||||
-rw-r--r-- | libshiboken/basewrapper.cpp | 10 | ||||
-rw-r--r-- | libshiboken/sbkconverter.cpp | 17 | ||||
-rw-r--r-- | libshiboken/sbkconverter.h | 6 |
4 files changed, 49 insertions, 12 deletions
diff --git a/generator/cppgenerator.cpp b/generator/cppgenerator.cpp index 9ddf515a1..0bfa66076 100644 --- a/generator/cppgenerator.cpp +++ b/generator/cppgenerator.cpp @@ -1174,10 +1174,8 @@ void CppGenerator::writeConverterRegister(QTextStream& s, const AbstractMetaClas if (metaClass->isNamespace()) return; s << INDENT << "// Register Converter" << endl; - s << INDENT; - if (!isObjectType(metaClass)) - s << "SbkConverter* converter = "; - s << "Shiboken::Conversions::createConverter(&" << cpythonTypeName(metaClass) << ',' << endl; + s << INDENT << "SbkConverter* converter = Shiboken::Conversions::createConverter(&"; + s << cpythonTypeName(metaClass) << ',' << endl; { Indentation indent(INDENT); QString sourceTypeName = metaClass->name(); @@ -1194,6 +1192,22 @@ void CppGenerator::writeConverterRegister(QTextStream& s, const AbstractMetaClas } s << ");" << endl; + s << endl; + + s << INDENT << "Shiboken::Conversions::registerConverterName(converter, \""; + s << metaClass->qualifiedCppName() << "\");" << endl; + // TODO-CONVERTER: review the need for registering this pointer version of the type name. + s << INDENT << "Shiboken::Conversions::registerConverterName(converter, \""; + s << metaClass->qualifiedCppName() << "*\");" << endl; + s << INDENT << "Shiboken::Conversions::registerConverterName(converter, typeid(::"; + s << metaClass->qualifiedCppName() << ").name());" << endl; + if (shouldGenerateCppWrapper(metaClass)) { + s << INDENT << "Shiboken::Conversions::registerConverterName(converter, typeid(::"; + s << wrapperName(metaClass) << ").name());" << endl; + } + + s << endl; + if (!metaClass->typeEntry()->isValue()) return; @@ -3150,8 +3164,9 @@ void CppGenerator::writeSpecialCastFunction(QTextStream& s, const AbstractMetaCl void CppGenerator::writePrimitiveConverterInitialization(QTextStream& s, const CustomConversion* customConversion) { const TypeEntry* type = customConversion->ownerType(); + QString converter = converterObject(type); s << INDENT << "// Register converter for type '" << type->qualifiedTargetLangName() << "'." << endl; - s << INDENT << converterObject(type) << " = Shiboken::Conversions::createConverter("; + s << INDENT << converter << " = Shiboken::Conversions::createConverter("; if (type->targetLangApiName() == type->name()) s << '0'; else if (type->targetLangApiName() == "PyObject") @@ -3160,7 +3175,8 @@ void CppGenerator::writePrimitiveConverterInitialization(QTextStream& s, const C s << '&' << type->targetLangApiName() << "_Type"; QString typeName = fixedCppTypeName(type); s << ", " << cppToPythonFunctionName(typeName, typeName) << ");" << endl; - writeCustomConverterRegister(s, customConversion, converterObject(type)); + s << INDENT << "Shiboken::Conversions::registerConverterName(" << converter << ", \"" << type->qualifiedCppName() << "\");" << endl; + writeCustomConverterRegister(s, customConversion, converter); } void CppGenerator::writeEnumConverterInitialization(QTextStream& s, const AbstractMetaEnum* metaEnum) diff --git a/libshiboken/basewrapper.cpp b/libshiboken/basewrapper.cpp index aeca2bbfe..a35178ee5 100644 --- a/libshiboken/basewrapper.cpp +++ b/libshiboken/basewrapper.cpp @@ -1035,13 +1035,13 @@ PyObject* newObject(SbkObjectType* instanceType, { // Try to find the exact type of cptr. if (!isExactType) { - TypeResolver* tr = 0; + PyTypeObject* exactType = 0; if (typeName) { - tr = TypeResolver::get(typeName); - if (tr) - instanceType = reinterpret_cast<SbkObjectType*>(tr->pythonType()); + exactType = Shiboken::Conversions::getPythonTypeObject(typeName); + if (exactType) + instanceType = reinterpret_cast<SbkObjectType*>(exactType); } - if (!tr) + if (!exactType) instanceType = BindingManager::instance().resolveType(&cptr, instanceType); } diff --git a/libshiboken/sbkconverter.cpp b/libshiboken/sbkconverter.cpp index 79a2f65fa..3a32bec50 100644 --- a/libshiboken/sbkconverter.cpp +++ b/libshiboken/sbkconverter.cpp @@ -283,12 +283,15 @@ bool isImplicitConversion(SbkObjectType* type, PythonToCppFunc toCppFunc) void registerConverterName(SbkConverter* converter , const char* typeName) { ConvertersMap::iterator iter = converters.find(typeName); - if (iter == converters.end()) + if (iter == converters.end()) { + //SbkDbg() << "Registering " << typeName; converters.insert(std::make_pair(typeName, converter)); + } } SbkConverter* getConverter(const char* typeName) { + //SbkDbg() << "Looking for converter for type " << typeName; ConvertersMap::const_iterator it = converters.find(typeName); if (it != converters.end()) return it->second; @@ -423,4 +426,16 @@ bool convertibleDictTypes(SbkConverter* keyConverter, bool keyCheckExact, SbkCon return true; } +PyTypeObject* getPythonTypeObject(SbkConverter* converter) +{ + if (converter) + return converter->pythonType; + return 0; +} + +PyTypeObject* getPythonTypeObject(const char* typeName) +{ + return getPythonTypeObject(getConverter(typeName)); +} + } } // namespace Shiboken::Conversions diff --git a/libshiboken/sbkconverter.h b/libshiboken/sbkconverter.h index 463014fdc..f760e82f3 100644 --- a/libshiboken/sbkconverter.h +++ b/libshiboken/sbkconverter.h @@ -242,6 +242,12 @@ LIBSHIBOKEN_API bool checkDictTypes(PyTypeObject* keyType, PyTypeObject* valueTy /// Returns true if a Python dictionary can be converted to a C++ hash or map. LIBSHIBOKEN_API bool convertibleDictTypes(SbkConverter* keyConverter, bool keyCheckExact, SbkConverter* valueConverter, bool valueCheckExact, PyObject* pyIn); +/// Returns the Python type object associated with the given \p converter. +LIBSHIBOKEN_API PyTypeObject* getPythonTypeObject(SbkConverter* converter); + +/// Returns the Python type object for the given \p typeName. +LIBSHIBOKEN_API PyTypeObject* getPythonTypeObject(const char* typeName); + #define SBK_PY_LONG_LONG_IDX 0 #define SBK_BOOL_IDX 1 #define SBK_CHAR_IDX 2 |