diff options
-rw-r--r-- | cppgenerator.cpp | 16 | ||||
-rw-r--r-- | cppgenerator.h | 2 | ||||
-rw-r--r-- | overloaddata.cpp | 49 | ||||
-rw-r--r-- | shibokengenerator.cpp | 21 | ||||
-rw-r--r-- | shibokengenerator.h | 2 | ||||
-rw-r--r-- | tests/libsample/objecttype.cpp | 7 | ||||
-rw-r--r-- | tests/libsample/objecttype.h | 3 | ||||
-rwxr-xr-x | tests/samplebinding/enum_test.py | 14 | ||||
-rwxr-xr-x | tests/samplebinding/namespace_test.py | 4 | ||||
-rw-r--r-- | tests/samplebinding/typesystem_sample.xml | 5 |
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" /> |