aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cppgenerator.cpp2
-rw-r--r--libshiboken/conversions.h13
-rw-r--r--shibokengenerator.cpp29
-rw-r--r--shibokengenerator.h2
-rw-r--r--tests/samplebinding/point_test.py9
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()