aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cppgenerator.cpp16
-rw-r--r--cppgenerator.h2
-rw-r--r--overloaddata.cpp49
-rw-r--r--shibokengenerator.cpp21
-rw-r--r--shibokengenerator.h2
-rw-r--r--tests/libsample/objecttype.cpp7
-rw-r--r--tests/libsample/objecttype.h3
-rwxr-xr-xtests/samplebinding/enum_test.py14
-rwxr-xr-xtests/samplebinding/namespace_test.py4
-rw-r--r--tests/samplebinding/typesystem_sample.xml5
10 files changed, 84 insertions, 39 deletions
diff --git a/cppgenerator.cpp b/cppgenerator.cpp
index 08a597d66..de2be43ca 100644
--- a/cppgenerator.cpp
+++ b/cppgenerator.cpp
@@ -464,6 +464,7 @@ void CppGenerator::writeVirtualMethodNative(QTextStream &s, const AbstractMetaFu
|| arg->type()->isValuePointer()
|| arg->type()->isFlags()
|| arg->type()->isEnum()
+ || arg->type()->isContainer()
|| arg->type()->isReference()
|| (arg->type()->isPrimitive()
&& !m_formatUnits.contains(arg->type()->typeEntry()->name()));
@@ -1656,13 +1657,14 @@ void CppGenerator::writeMethodCall(QTextStream& s, const AbstractMetaFunction* f
QStringList CppGenerator::getAncestorMultipleInheritance(const AbstractMetaClass* metaClass)
{
QStringList result;
- if (!metaClass->baseClassNames().isEmpty()) {
- foreach (QString base, metaClass->baseClassNames()) {
- result.append(QString("((size_t) static_cast<const %1*>(class_ptr)) - base").arg(base));
- result.append(QString("((size_t) static_cast<const %1*>((%2*)((void*)class_ptr))) - base").arg(base).arg(metaClass->name()));
- }
- foreach (const AbstractMetaClass* pClass, getBaseClasses(metaClass))
- result.append(getAncestorMultipleInheritance(pClass));
+ AbstractMetaClassList baseClases = getBaseClasses(metaClass);
+ if (!baseClases.isEmpty()) {
+ foreach (const AbstractMetaClass* baseClass, baseClases) {
+ result.append(QString("((size_t) static_cast<const %1*>(class_ptr)) - base").arg(baseClass->qualifiedCppName()));
+ result.append(QString("((size_t) static_cast<const %1*>((%2*)((void*)class_ptr))) - base").arg(baseClass->qualifiedCppName()).arg(metaClass->qualifiedCppName()));
+ }
+ foreach (const AbstractMetaClass* baseClass, baseClases)
+ result.append(getAncestorMultipleInheritance(baseClass));
}
return result;
}
diff --git a/cppgenerator.h b/cppgenerator.h
index b0a9e143e..009c2e6c7 100644
--- a/cppgenerator.h
+++ b/cppgenerator.h
@@ -34,8 +34,6 @@ class CppGenerator : public ShibokenGenerator
{
public:
CppGenerator();
- void clazclasses(QString arg1);
- void AbstractMeclasses(QString arg1);
protected:
QString fileNameForClass(const AbstractMetaClass* metaClass) const;
QList<AbstractMetaFunctionList> filterGroupedOperatorFunctions(const AbstractMetaClass* metaClass,
diff --git a/overloaddata.cpp b/overloaddata.cpp
index 25efbfa3f..66705333c 100644
--- a/overloaddata.cpp
+++ b/overloaddata.cpp
@@ -80,11 +80,27 @@ void OverloadData::sortNextOverloads()
// Create the graph of type dependencies based on implicit conversions.
Graph graph(reverseMap.count());
- bool haveInt = map.contains("int");
- bool haveUInt = map.contains("unsigned int");
- bool haveLong = map.contains("long");
- bool haveULong = map.contains("unsigned long");
- bool haveBool = map.contains("bool");
+ // All C++ primitive types, add any forgotten type AT THE END OF THIS LIST!
+ const char* primitiveTypes[] = {"int",
+ "unsigned int",
+ "long",
+ "unsigned long",
+ "short",
+ "unsigned short",
+ "bool",
+ "unsigned char",
+ "char",
+ "float",
+ "double"
+ };
+ const int numPrimitives = sizeof(primitiveTypes)/sizeof(const char*);
+ bool hasPrimitive[numPrimitives];
+ for (int i = 0; i < numPrimitives; ++i)
+ hasPrimitive[i] = map.contains(primitiveTypes[i]);
+ // just some alias
+ bool haveInt = hasPrimitive[0];
+ bool haveLong = hasPrimitive[2];
+ bool haveShort = hasPrimitive[4];
foreach(OverloadData* ov, m_nextOverloadData) {
const AbstractMetaType* targetType = ov->argType();
@@ -127,16 +143,10 @@ void OverloadData::sortNextOverloads()
}
if (targetTypeEntry->isEnum()) {
- if (haveInt)
- graph.addEdge(map[targetTypeEntry->name()], map["int"]);
- if (haveUInt)
- graph.addEdge(map[targetTypeEntry->name()], map["unsigned int"]);
- if (haveLong)
- graph.addEdge(map[targetTypeEntry->name()], map["long"]);
- if (haveULong)
- graph.addEdge(map[targetTypeEntry->name()], map["unsigned long"]);
- if (haveBool)
- graph.addEdge(map[targetTypeEntry->name()], map["bool"]);
+ for (int i = 0; i < numPrimitives; ++i) {
+ if (hasPrimitive[i])
+ graph.addEdge(map[targetTypeEntry->name()], map[primitiveTypes[i]]);
+ }
}
}
@@ -150,6 +160,15 @@ void OverloadData::sortNextOverloads()
graph.addEdge(map["bool"], map["int"]);
}
+ if (haveShort) {
+ if (map.contains("float"))
+ graph.addEdge(map["float"], map["short"]);
+ if (map.contains("double"))
+ graph.addEdge(map["double"], map["short"]);
+ if (map.contains("bool"))
+ graph.addEdge(map["bool"], map["short"]);
+ }
+
if (haveLong) {
if (map.contains("float"))
graph.addEdge(map["float"], map["long"]);
diff --git a/shibokengenerator.cpp b/shibokengenerator.cpp
index 33c5ad653..5753dcc09 100644
--- a/shibokengenerator.cpp
+++ b/shibokengenerator.cpp
@@ -158,17 +158,10 @@ QString ShibokenGenerator::translateTypeForWrapperMethod(const AbstractMetaType*
QString result;
const TypeEntry* tentry = cType->typeEntry();
- if (tentry->isValue() || tentry->isObject() || (cType->isReference() && !cType->isContainer())) {
- result = tentry->qualifiedCppName();
- if (cType->isReference())
- result.append('&');
- else if (tentry->isObject() || cType->isValuePointer())
- result.append('*');
- } else if (cType->isArray()) {
+ if (cType->isArray())
result = translateTypeForWrapperMethod(cType->arrayElementType(), context) + "[]";
- } else {
+ else
result = translateType(cType, context);
- }
return result;
}
@@ -368,23 +361,25 @@ void ShibokenGenerator::writeToCppConversion(QTextStream& s, const AbstractMetaT
s << "toCpp(" << argumentName << ')';
}
-QString ShibokenGenerator::getFormatUnitString(const AbstractMetaFunction* func) const
+QString ShibokenGenerator::getFormatUnitString(const AbstractMetaFunction* func, bool incRef) const
{
QString result;
+ const char objType = (incRef ? 'O' : 'S');
foreach (const AbstractMetaArgument* arg, func->arguments()) {
if (func->argumentRemoved(arg->argumentIndex() + 1))
continue;
if (!func->typeReplaced(arg->argumentIndex() + 1).isEmpty()) {
- result += 'O';
+ result += objType;
} else if (arg->type()->isQObject()
|| arg->type()->isObject()
|| arg->type()->isValue()
|| arg->type()->isValuePointer()
|| arg->type()->isEnum()
|| arg->type()->isFlags()
+ || arg->type()->isContainer()
|| arg->type()->isReference()) {
- result += 'O';
+ result += objType;
} else if (arg->type()->isPrimitive()) {
const PrimitiveTypeEntry* ptype = (const PrimitiveTypeEntry*) arg->type()->typeEntry();
if (ptype->basicAliasedTypeEntry())
@@ -392,7 +387,7 @@ QString ShibokenGenerator::getFormatUnitString(const AbstractMetaFunction* func)
if (m_formatUnits.contains(ptype->name()))
result += m_formatUnits[ptype->name()];
else
- result += 'O';
+ result += objType;
} else if (isCString(arg->type())) {
result += 'z';
} else {
diff --git a/shibokengenerator.h b/shibokengenerator.h
index 7c8a5d395..288acc87f 100644
--- a/shibokengenerator.h
+++ b/shibokengenerator.h
@@ -278,7 +278,7 @@ public:
QString cpythonSpecialCastFunctionName(const AbstractMetaClass* metaClass);
QString getFunctionReturnType(const AbstractMetaFunction* func, Options options = NoOption) const;
- QString getFormatUnitString(const AbstractMetaFunction* func) const;
+ QString getFormatUnitString(const AbstractMetaFunction* func, bool incRef = false) const;
/// Returns the name of the macro used to export symbols
QString getApiExportMacro() const;
diff --git a/tests/libsample/objecttype.cpp b/tests/libsample/objecttype.cpp
index d5bdace14..5ff3c2f19 100644
--- a/tests/libsample/objecttype.cpp
+++ b/tests/libsample/objecttype.cpp
@@ -226,3 +226,10 @@ unsigned int objectTypeHash(const ObjectType* objectType)
return reinterpret_cast<std::size_t>(objectType);
}
+unsigned char ObjectType::callWithEnum(const Str& prefix, Event::EventType type, unsigned char value){
+ return value*value;
+}
+
+unsigned char ObjectType::callWithEnum(const Str& prefix, unsigned char value) {
+ return value;
+}
diff --git a/tests/libsample/objecttype.h b/tests/libsample/objecttype.h
index 0515ecc98..8b9eda117 100644
--- a/tests/libsample/objecttype.h
+++ b/tests/libsample/objecttype.h
@@ -97,6 +97,9 @@ public:
// This method should be reimplemented by ObjectTypeLayout.
virtual bool isLayoutType() { return false; }
+ unsigned char callWithEnum(const Str& prefix, Event::EventType type, unsigned char value=80);
+ unsigned char callWithEnum(const Str& prefix, unsigned char value=0);
+
private:
ObjectType(const ObjectType&);
ObjectType& operator=(const ObjectType&);
diff --git a/tests/samplebinding/enum_test.py b/tests/samplebinding/enum_test.py
index a6c2e0421..0d4be2293 100755
--- a/tests/samplebinding/enum_test.py
+++ b/tests/samplebinding/enum_test.py
@@ -28,7 +28,7 @@
import unittest
-from sample import SampleNamespace
+from sample import SampleNamespace, ObjectType, Event
class EnumTest(unittest.TestCase):
'''Test case for Python representation of C++ enums.'''
@@ -66,6 +66,18 @@ class EnumTest(unittest.TestCase):
'''Calling the constructor of non-extensible enum with a string.'''
self.assertRaises(TypeError, SampleNamespace.InValue, '1')
+
+class EnumOverloadTest(unittest.TestCase):
+ '''Test case for overloads involving enums'''
+
+ def testWithInt(self):
+ '''Overload with Enums and ints with default value'''
+ o = ObjectType()
+
+ self.assertEqual(o.callWithEnum('', Event.ANY_EVENT, 9), 81)
+ self.assertEqual(o.callWithEnum('', 9), 9)
+
+
if __name__ == '__main__':
unittest.main()
diff --git a/tests/samplebinding/namespace_test.py b/tests/samplebinding/namespace_test.py
index 003d81b11..29633f38e 100755
--- a/tests/samplebinding/namespace_test.py
+++ b/tests/samplebinding/namespace_test.py
@@ -36,5 +36,9 @@ class TestClassesUnderNamespace(unittest.TestCase):
c3 = SampleNamespace.SomeClass.SomeInnerClass.OkThisIsRecursiveEnough()
e3 = SampleNamespace.SomeClass.SomeInnerClass.OkThisIsRecursiveEnough.NiceEnum()
+ def testFunctionAddedOnNamespace(self):
+ res = SampleNamespace.ImInsideANamespace(2, 2)
+ self.assertEquals(res, 4)
+
if __name__ == '__main__':
unittest.main()
diff --git a/tests/samplebinding/typesystem_sample.xml b/tests/samplebinding/typesystem_sample.xml
index 38311bd7c..3b0eb9069 100644
--- a/tests/samplebinding/typesystem_sample.xml
+++ b/tests/samplebinding/typesystem_sample.xml
@@ -95,6 +95,11 @@
</conversion-rule>
</modify-argument>
</modify-function>
+ <add-function signature="ImInsideANamespace(int, int)" return-type="int">
+ <inject-code class="target">
+ %PYARG_0 = %CONVERTTOPYTHON[int](%1 + %2);
+ </inject-code>
+ </add-function>
</namespace-type>
<value-type name="SampleNamespace::SomeClass" />