aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcelo Lira <marcelo.lira@openbossa.org>2011-10-28 15:25:22 -0300
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-08 16:18:31 -0300
commit670cde3115f372b70768f14cf19d236f0d019f99 (patch)
tree7a1a6022ea58f92e6ea5cb8f03128c77332cfa4e
parent121373c06d6b99a6614c7577c17812dec2237895 (diff)
Register type converters by name.
This way they can be queried as the soon-to-be-deprecated TypeResolvers.
-rw-r--r--generator/cppgenerator.cpp28
-rw-r--r--libshiboken/basewrapper.cpp10
-rw-r--r--libshiboken/sbkconverter.cpp17
-rw-r--r--libshiboken/sbkconverter.h6
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