Description: fix static/non-static override using a METH_STATIC function for non static does not work in python3 anymore. Hack around it by emitting a second PyMethodDef Author: Julian Taylor --- shiboken-1.1.2.orig/generator/shiboken/cppgenerator.h +++ shiboken-1.1.2/generator/shiboken/cppgenerator.h @@ -207,7 +207,7 @@ private: void writeClassRegister(QTextStream& s, const AbstractMetaClass* metaClass); void writeClassDefinition(QTextStream& s, const AbstractMetaClass* metaClass); - void writeMethodDefinitionEntry(QTextStream& s, const AbstractMetaFunctionList overloads); + void writeMethodDefinitionEntry(QTextStream& s, const AbstractMetaFunctionList overloads, bool nostatic=false); void writeMethodDefinition(QTextStream& s, const AbstractMetaFunctionList overloads); /// Writes the implementation of all methods part of python sequence protocol --- shiboken-1.1.2.orig/generator/shiboken/cppgenerator.cpp +++ shiboken-1.1.2/generator/shiboken/cppgenerator.cpp @@ -308,6 +308,11 @@ void CppGenerator::generateClass(QTextSt smd << INDENT; writeMethodDefinitionEntry(smd, overloads); smd << endl << "};" << endl << endl; + methDefName = cpythonMethodDefinitionName(rfunc) + "_nonstatic"; + smd << "static PyMethodDef " << methDefName << " = {" << endl; + smd << INDENT; + writeMethodDefinitionEntry(smd, overloads, true); + smd << endl << "};" << endl << endl; } writeMethodDefinition(md, overloads); } @@ -3897,7 +3902,7 @@ void CppGenerator::writeRichCompareFunct s << '}' << endl << endl; } -void CppGenerator::writeMethodDefinitionEntry(QTextStream& s, const AbstractMetaFunctionList overloads) +void CppGenerator::writeMethodDefinitionEntry(QTextStream& s, const AbstractMetaFunctionList overloads, bool nostatic) { Q_ASSERT(!overloads.isEmpty()); OverloadData overloadData(overloads, this); @@ -3917,7 +3922,7 @@ void CppGenerator::writeMethodDefinition if (overloadData.hasArgumentWithDefaultValue()) s << "|METH_KEYWORDS"; } - if (func->ownerClass() && overloadData.hasStaticFunction()) + if (!nostatic && func->ownerClass() && overloadData.hasStaticFunction()) s << "|METH_STATIC"; } @@ -4531,7 +4536,7 @@ void CppGenerator::writeGetattroFunction foreach (const AbstractMetaFunction* func, getMethodsWithBothStaticAndNonStaticMethods(metaClass)) { s << INDENT << "if (Shiboken::String::compare(name, \"" << func->name() << "\") == 0)" << endl; Indentation indent(INDENT); - s << INDENT << "return PyCFunction_NewEx(&" << cpythonMethodDefinitionName(func) << ", " PYTHON_SELF_VAR ", 0);" << endl; + s << INDENT << "return PyCFunction_NewEx(&" << cpythonMethodDefinitionName(func) << "_nonstatic" << ", " PYTHON_SELF_VAR ", 0);" << endl; } } s << INDENT << '}' << endl;