diff options
-rw-r--r-- | cppgenerator.cpp | 2 | ||||
-rw-r--r-- | libshiboken/conversions.h | 13 | ||||
-rw-r--r-- | shibokengenerator.cpp | 29 | ||||
-rw-r--r-- | shibokengenerator.h | 2 | ||||
-rw-r--r-- | tests/samplebinding/point_test.py | 9 |
5 files changed, 24 insertions, 31 deletions
diff --git a/cppgenerator.cpp b/cppgenerator.cpp index 04d90c79d..f3ca270da 100644 --- a/cppgenerator.cpp +++ b/cppgenerator.cpp @@ -2691,7 +2691,7 @@ void CppGenerator::writeRichCompareFunction(QTextStream& s, const AbstractMetaCl // It's a value type and the conversion for a pointer returned null. if (type->typeEntry()->isValue()) { s << "!cpp_other ? cpp_self == "; - writeToCppConversion(s, type, metaClass, "other", ExcludeReference); + writeToCppConversion(s, type, metaClass, "other", ExcludeReference | ExcludeConst); s << " : "; } s << "(cpp_self " << op << ' ' << (type->typeEntry()->isValue() ? "(*" : ""); diff --git a/libshiboken/conversions.h b/libshiboken/conversions.h index 4b6d8e388..4c3ebb5b8 100644 --- a/libshiboken/conversions.h +++ b/libshiboken/conversions.h @@ -157,10 +157,13 @@ struct Converter<T*> { if (Shiboken_TypeCheck(pyobj, T)) return (T*) getCppPointer(pyobj, SbkType<T>()); + else if (Converter<T>::isConvertible(pyobj)) return CppObjectCopier<T>::copy(Converter<T>::toCpp(pyobj)); + else if (pyobj == Py_None) return 0; + assert(false); return 0; } @@ -177,7 +180,15 @@ struct Converter<T&> static inline T& toCpp(PyObject* pyobj) { return *Converter<T*>::toCpp(pyobj); } }; -template <typename T> struct Converter<const T&> : Converter<T&> {}; +template <typename T> +struct Converter<const T&> : Converter<T&> +{ + static inline PyObject* toPython(const T& cppobj) + { + T* cpy = CppObjectCopier<T>::copy(cppobj); + return createWrapper<T>(cpy); + } +}; // Void pointer conversions. template<> diff --git a/shibokengenerator.cpp b/shibokengenerator.cpp index f5349d299..3efd59f0e 100644 --- a/shibokengenerator.cpp +++ b/shibokengenerator.cpp @@ -170,12 +170,13 @@ void ShibokenGenerator::initPrimitiveTypesCorrespondences() } QString ShibokenGenerator::translateTypeForWrapperMethod(const AbstractMetaType* cType, - const AbstractMetaClass* context) const + const AbstractMetaClass* context, + Options options) const { QString result; if (cType->isArray()) { - result = translateTypeForWrapperMethod(cType->arrayElementType(), context) + "[]"; + result = translateTypeForWrapperMethod(cType->arrayElementType(), context, options) + "[]"; } else { #ifdef AVOID_PROTECTED_HACK if (cType->isEnum()) { @@ -185,7 +186,7 @@ QString ShibokenGenerator::translateTypeForWrapperMethod(const AbstractMetaType* } if (result.isEmpty()) #endif - result = translateType(cType, context); + result = translateType(cType, context, options); } return result; @@ -497,24 +498,14 @@ void ShibokenGenerator::writeBaseConversion(QTextStream& s, const AbstractMetaTy if (ptype->basicAliasedTypeEntry()) ptype = ptype->basicAliasedTypeEntry(); typeName = ptype->name(); - } else { - typeName = translateTypeForWrapperMethod(type, context); + } else { + if (type->isObject() || (type->isValue() && !type->isReference())) + options |= Generator::ExcludeConst; + if (type->isContainer() ) + options |= Generator::ExcludeReference | Generator::ExcludeConst; + typeName = translateTypeForWrapperMethod(type, context, options); } - const TypeEntry* tentry = type->typeEntry(); - - // If the type is an Object (and a pointer) remove its constness since it - // is already declared as const in the signature of the generated converter. - if (tentry->isObject() && typeName.startsWith("const ")) - typeName.remove(0, sizeof("const ") / sizeof(char) - 1); - - // Remove the constness, if any - if (typeName.startsWith("const ") && type->name() != "char") - typeName.remove(0, sizeof("const ") / sizeof(char) - 1); - - if ((options & ExcludeReference || tentry->isPrimitive() || tentry->isContainer()) && typeName.endsWith('&')) - typeName.chop(1); - s << baseConversionString(typeName); } diff --git a/shibokengenerator.h b/shibokengenerator.h index 9f2feda3e..5e91fe5db 100644 --- a/shibokengenerator.h +++ b/shibokengenerator.h @@ -43,7 +43,7 @@ public: ShibokenGenerator(); QString translateTypeForWrapperMethod(const AbstractMetaType* cType, - const AbstractMetaClass* context) const; + const AbstractMetaClass* context, Options opt = NoOption) const; /** * Returns a map with all functions grouped, the function name is used as key. diff --git a/tests/samplebinding/point_test.py b/tests/samplebinding/point_test.py index c5b1bf2e6..a461703f2 100644 --- a/tests/samplebinding/point_test.py +++ b/tests/samplebinding/point_test.py @@ -78,15 +78,6 @@ class PointTest(unittest.TestCase): self.assertEqual(sys.getrefcount(pt1), refcount1 + 1) self.assertEqual(sys.getrefcount(pt1), sys.getrefcount(pt2)) - def testReturnConstReference(self): - '''Point returns a const reference for itself.''' - pt1 = Point(5.0, 2.3) - refcount1 = sys.getrefcount(pt1) - pt2 = pt1.getConstReferenceToSelf() - self.assertEqual(pt1, pt2) - self.assertEqual(sys.getrefcount(pt1), refcount1 + 1) - self.assertEqual(sys.getrefcount(pt1), sys.getrefcount(pt2)) - if __name__ == '__main__': unittest.main() |