aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken6/generator
diff options
context:
space:
mode:
Diffstat (limited to 'sources/shiboken6/generator')
-rw-r--r--sources/shiboken6/generator/shiboken/cppgenerator.cpp58
-rw-r--r--sources/shiboken6/generator/shiboken/cppgenerator.h5
2 files changed, 46 insertions, 17 deletions
diff --git a/sources/shiboken6/generator/shiboken/cppgenerator.cpp b/sources/shiboken6/generator/shiboken/cppgenerator.cpp
index 0f1fe18f4..dc92e2432 100644
--- a/sources/shiboken6/generator/shiboken/cppgenerator.cpp
+++ b/sources/shiboken6/generator/shiboken/cppgenerator.cpp
@@ -575,11 +575,15 @@ void CppGenerator::generateClass(TextStream &s, const GeneratorContext &classCon
writeMethodWrapper(s, overloads, classContext);
writeSignatureInfo(signatureStream, overloads);
+ // For a mixture of static and member function overloads,
+ // a separate PyMethodDef entry is written which is referenced
+ // in the PyMethodDef list and later in getattro() for handling
+ // the non-static case.
if (OverloadData::hasStaticAndInstanceFunctions(overloads)) {
QString methDefName = cpythonMethodDefinitionName(rfunc);
- smd << "static PyMethodDef " << methDefName << " = {\n" << indent;
- writeMethodDefinitionEntry(smd, overloads);
- smd << outdent << "\n};\n\n";
+ smd << "static PyMethodDef " << methDefName << " = " << indent;
+ writeMethodDefinitionEntries(smd, overloads, 1);
+ smd << outdent << ";\n\n";
}
writeMethodDefinition(md, overloads);
}
@@ -716,12 +720,16 @@ void CppGenerator::generateClass(TextStream &s, const GeneratorContext &classCon
s << "static PyGetSetDef " << cpythonGettersSettersDefinitionName(metaClass)
<< "[] = {\n" << indent;
for (const AbstractMetaField &metaField : fields) {
- if (!metaField.isStatic()) {
- const QString getter = metaField.canGenerateGetter()
+ const bool canGenerateGetter = metaField.canGenerateGetter();
+ const bool canGenerateSetter = metaField.canGenerateSetter();
+ if (canGenerateGetter || canGenerateSetter) {
+ const QString getter = canGenerateGetter
? cpythonGetterFunctionName(metaField) : QString();
- const QString setter = metaField.canGenerateSetter()
+ const QString setter = canGenerateSetter
? cpythonSetterFunctionName(metaField) : QString();
- writePyGetSetDefEntry(s, metaField.name(), getter, setter);
+ const auto names = metaField.definitionNames();
+ for (const auto &name : names)
+ writePyGetSetDefEntry(s, name, getter, setter);
}
}
@@ -953,7 +961,8 @@ void CppGenerator::writeVirtualMethodNative(TextStream &s,
return;
const TypeEntry *retType = func->type().typeEntry();
- const QString funcName = func->isOperatorOverload() ? pythonOperatorFunctionName(func) : func->name();
+ const QString funcName = func->isOperatorOverload()
+ ? pythonOperatorFunctionName(func) : func->definitionNames().constFirst();
QString prefix = wrapperName(func->ownerClass()) + QLatin1String("::");
s << functionSignature(func, prefix, QString(), Generator::SkipDefaultValues|Generator::OriginalTypeDescription)
@@ -4881,16 +4890,16 @@ void CppGenerator::writeRichCompareFunction(TextStream &s,
<< outdent << "}\n\n";
}
-void CppGenerator::writeMethodDefinitionEntry(TextStream &s, const AbstractMetaFunctionCList &overloads) const
+QString CppGenerator::methodDefinitionParameters(const OverloadData &overloadData) const
{
- Q_ASSERT(!overloads.isEmpty());
- OverloadData overloadData(overloads, this);
bool usePyArgs = pythonFunctionWrapperUsesListOfArguments(overloadData);
const auto func = overloadData.referenceFunction();
int min = overloadData.minArgs();
int max = overloadData.maxArgs();
- s << '"' << func->name() << "\", reinterpret_cast<PyCFunction>("
+ QString result;
+ QTextStream s(&result);
+ s << "reinterpret_cast<PyCFunction>("
<< cpythonFunctionName(func) << "), ";
if ((min == max) && (max < 2) && !usePyArgs) {
if (max == 0)
@@ -4910,6 +4919,24 @@ void CppGenerator::writeMethodDefinitionEntry(TextStream &s, const AbstractMetaF
&& overloadData.hasStaticFunction()) {
s << "|METH_STATIC";
}
+ return result;
+}
+
+void CppGenerator::writeMethodDefinitionEntries(TextStream &s,
+ const AbstractMetaFunctionCList &overloads,
+ qsizetype maxEntries) const
+{
+ Q_ASSERT(!overloads.isEmpty());
+ OverloadData overloadData(overloads, this);
+ const QStringList names = overloadData.referenceFunction()->definitionNames();
+ const QString parameters = methodDefinitionParameters(overloadData);
+ const qsizetype count = maxEntries > 0
+ ? qMin(names.size(), maxEntries) : names.size();
+ for (qsizetype i = 0; i < count; ++i) {
+ if (i)
+ s << ",\n";
+ s << "{\"" << names.at(i) << "\", " << parameters << '}';
+ }
}
void CppGenerator::writeMethodDefinition(TextStream &s, const AbstractMetaFunctionCList &overloads) const
@@ -4922,9 +4949,7 @@ void CppGenerator::writeMethodDefinition(TextStream &s, const AbstractMetaFuncti
if (OverloadData::hasStaticAndInstanceFunctions(overloads)) {
s << cpythonMethodDefinitionName(func);
} else {
- s << '{';
- writeMethodDefinitionEntry(s, overloads);
- s << '}';
+ writeMethodDefinitionEntries(s, overloads);
}
s << ',' << '\n';
}
@@ -5778,7 +5803,8 @@ void CppGenerator::writeGetattroFunction(TextStream &s, AttroCheck attroCheck,
<< defName << ".ml_doc,\n";
}
s << "};\n"
- << "if (Shiboken::String::compare(name, \"" << func->name() << "\") == 0)\n";
+ << "if (Shiboken::String::compare(name, \""
+ << func->definitionNames().constFirst() << "\") == 0)\n";
Indentation indent(s);
s << "return PyCFunction_NewEx(&non_static_" << defName << ", self, 0);\n";
}
diff --git a/sources/shiboken6/generator/shiboken/cppgenerator.h b/sources/shiboken6/generator/shiboken/cppgenerator.h
index 0539a19ec..a81df17c9 100644
--- a/sources/shiboken6/generator/shiboken/cppgenerator.h
+++ b/sources/shiboken6/generator/shiboken/cppgenerator.h
@@ -286,7 +286,10 @@ private:
void writeClassDefinition(TextStream &s,
const AbstractMetaClass *metaClass,
const GeneratorContext &classContext);
- void writeMethodDefinitionEntry(TextStream &s, const AbstractMetaFunctionCList &overloads) const;
+ QString methodDefinitionParameters(const OverloadData &overloadData) const;
+ void writeMethodDefinitionEntries(TextStream &s,
+ const AbstractMetaFunctionCList &overloads,
+ qsizetype maxEntries = -1) const;
void writeMethodDefinition(TextStream &s, const AbstractMetaFunctionCList &overloads) const;
void writeSignatureInfo(TextStream &s, const AbstractMetaFunctionCList &overloads) const;
/// Writes the implementation of all methods part of python sequence protocol