Skip to content

Commit 83cfe85

Browse files
shiboken6: Reduce Sbk_..TypeF() function usage
A static helper function with postfix TypeF() was generated for each type. Besides the usage in the generated converter and for overridden functions, it was used to retrieve the enclosing type for enum initialization. The calls from the enum code are removed by adding an enclosing parameter to the enum function and removing the logic trying to detect invisible namespaces since the enclosing type is always the right one even for enums collected from nested invisible namespaces. The generation of the TypeF() can then be removed for namespace types. Task-number: PYSIDE-3155 Change-Id: Ia1c64594e180cf221cd0c416ae67ddab5d99a465 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
1 parent 57579e2 commit 83cfe85

File tree

2 files changed

+24
-27
lines changed

2 files changed

+24
-27
lines changed

sources/shiboken6/generator/shiboken/cppgenerator.cpp

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -719,7 +719,8 @@ void CppGenerator::generateClass(TextStream &s,
719719

720720
s << '\n';
721721

722-
writeClassTypeFunction(s, classContext.metaClass());
722+
if (!metaClass->isNamespace())
723+
writeClassTypeFunction(s, metaClass);
723724

724725
// class inject-code native/beginning
725726
if (!typeEntry->codeSnips().isEmpty()) {
@@ -5493,7 +5494,9 @@ void CppGenerator::writeSignatureInfo(TextStream &s, const OverloadData &overloa
54935494
}
54945495
}
54955496

5496-
void CppGenerator::writeEnumsInitialization(TextStream &s, const AbstractMetaEnumList &enums)
5497+
void CppGenerator::writeEnumsInitialization(TextStream &s,
5498+
const char *enclosing,
5499+
const AbstractMetaEnumList &enums)
54975500
{
54985501
if (enums.isEmpty())
54995502
return;
@@ -5510,7 +5513,7 @@ void CppGenerator::writeEnumsInitialization(TextStream &s, const AbstractMetaEnu
55105513
preambleWritten = true;
55115514
}
55125515
ConfigurableScope configScope(s, cppEnum.typeEntry());
5513-
etypeUsed |= writeEnumInitialization(s, cppEnum);
5516+
etypeUsed |= writeEnumInitialization(s, enclosing, cppEnum);
55145517
}
55155518
if (preambleWritten && !etypeUsed)
55165519
s << sbkUnusedVariableCast("EType");
@@ -5520,7 +5523,7 @@ void CppGenerator::writeEnumsInitFunc(TextStream &s, const QString &funcName,
55205523
const AbstractMetaEnumList &enums)
55215524
{
55225525
s << "static void " << funcName << "(PyObject *module)\n{\n" << indent;
5523-
writeEnumsInitialization(s, enums);
5526+
writeEnumsInitialization(s, "module", enums);
55245527
s << outdent << "}\n\n";
55255528
}
55265529

@@ -5534,19 +5537,11 @@ static qsizetype maxLineLength(const QStringList &list)
55345537
return result;
55355538
}
55365539

5537-
bool CppGenerator::writeEnumInitialization(TextStream &s, const AbstractMetaEnum &cppEnum)
5540+
bool CppGenerator::writeEnumInitialization(TextStream &s, const char *enclosing,
5541+
const AbstractMetaEnum &cppEnum)
55385542
{
55395543
const auto enclosingClass = cppEnum.targetLangEnclosingClass();
5540-
const bool hasUpperEnclosingClass = enclosingClass
5541-
&& enclosingClass->targetLangEnclosingClass();
55425544
EnumTypeEntryCPtr enumTypeEntry = cppEnum.typeEntry();
5543-
QString enclosingObjectVariable;
5544-
if (enclosingClass)
5545-
enclosingObjectVariable = cpythonTypeName(enclosingClass);
5546-
else if (hasUpperEnclosingClass)
5547-
enclosingObjectVariable = u"enclosingClass"_s;
5548-
else
5549-
enclosingObjectVariable = u"module"_s;
55505545

55515546
s << "// Initialization of ";
55525547
s << (cppEnum.isAnonymous() ? "anonymous enum identified by enum value" : "enum");
@@ -5629,9 +5624,9 @@ bool CppGenerator::writeEnumInitialization(TextStream &s, const AbstractMetaEnum
56295624
for (const auto &enumValue : enumValues) {
56305625
const QString mangledName = mangleName(enumValue.name());
56315626
const QString pyValue = initializerValues + u'[' + QString::number(idx++) + u']';
5632-
if (enclosingClass || hasUpperEnclosingClass) {
5627+
if (enclosingClass) {
56335628
s << "tpDict.reset(PepType_GetDict(reinterpret_cast<PyTypeObject *>("
5634-
<< enclosingObjectVariable << ")));\n"
5629+
<< enclosing << ")));\n"
56355630
<< "PyDict_SetItemString(tpDict.object(), \"" << mangledName << "\",\n"
56365631
<< indent << (isSigned ? "PyLong_FromLongLong" : "PyLong_FromUnsignedLongLong")
56375632
<< "(" << pyValue << "));\n" << outdent;
@@ -5650,7 +5645,7 @@ bool CppGenerator::writeEnumInitialization(TextStream &s, const AbstractMetaEnum
56505645
auto packageLevel = packageName().count(u'.') + 1;
56515646
s << "EType = Shiboken::Enum::"
56525647
<< "createPythonEnum"
5653-
<< '(' << enclosingObjectVariable << ",\n" << indent
5648+
<< '(' << enclosing << ",\n" << indent
56545649
<< '"' << packageLevel << ':' << getClassTargetFullName(cppEnum) << "\",\n"
56555650
<< initializerName << ", " << initializerValues << ");\n" << outdent
56565651
<< enumVarTypeObj << " = EType;\n";
@@ -5895,7 +5890,7 @@ void CppGenerator::writeClassRegister(TextStream &s,
58955890
const QString typePtr = u"_"_s + chopType(pyTypeName)
58965891
+ u"_Type"_s;
58975892

5898-
s << typePtr << " = Shiboken::ObjectType::introduceWrapperType(\n" << indent;
5893+
s << "PyTypeObject *pyType = Shiboken::ObjectType::introduceWrapperType(\n" << indent;
58995894
// 1:enclosingObject
59005895
s << enclosingObjectVariable << ",\n";
59015896

@@ -5940,9 +5935,10 @@ void CppGenerator::writeClassRegister(TextStream &s,
59405935
else
59415936
s << wrapperFlags.join(" | ");
59425937

5943-
s << outdent << ");\nauto *pyType = " << pyTypeName << "; // references "
5944-
<< typePtr << "\n"
5945-
<< outdent << "#if PYSIDE6_COMOPT_COMPRESS == 0\n" << indent
5938+
s << outdent << ");\n";
5939+
if (!metaClass->isNamespace())
5940+
s << typePtr << " = pyType;\n";
5941+
s << outdent << "#if PYSIDE6_COMOPT_COMPRESS == 0\n" << indent
59465942
<< "InitSignatureStrings(pyType, " << initFunctionName << "_SignatureStrings);\n"
59475943
<< outdent << "#else\n" << indent
59485944
<< "InitSignatureBytes(pyType, " << initFunctionName << "_SignatureBytes, "
@@ -5987,9 +5983,8 @@ void CppGenerator::writeClassRegister(TextStream &s,
59875983

59885984
// Set typediscovery struct or fill the struct of another one
59895985
if (needsTypeDiscoveryFunction(metaClass)) {
5990-
s << "Shiboken::ObjectType::setTypeDiscoveryFunctionV2(\n" << indent
5991-
<< cpythonTypeName(metaClass)
5992-
<< ", &" << cpythonBaseName(metaClass) << "_typeDiscovery);" << outdent << "\n\n";
5986+
s << "Shiboken::ObjectType::setTypeDiscoveryFunctionV2(pyType, &" << cpythonBaseName(metaClass)
5987+
<< "_typeDiscovery);\n\n";
59935988
}
59945989

59955990
AbstractMetaEnumList classEnums = metaClass->enums();
@@ -5999,7 +5994,7 @@ void CppGenerator::writeClassRegister(TextStream &s,
59995994
s << "// Pass the ..._EnumFlagInfo to the class.\n"
60005995
<< "SbkObjectType_SetEnumFlagInfo(pyType, " << chopType(pyTypeName)
60015996
<< "_EnumFlagInfo);\n\n";
6002-
writeEnumsInitialization(s, classEnums);
5997+
writeEnumsInitialization(s, "pyType", classEnums);
60035998

60045999
if (metaClass->hasSignals())
60056000
writeSignalInitialization(s, metaClass);

sources/shiboken6/generator/shiboken/cppgenerator.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -482,10 +482,12 @@ class CppGenerator : public ShibokenGenerator
482482
void writeRichCompareFunction(TextStream &s, TextStream &t, const GeneratorContext &context) const;
483483
void writeSmartPointerRichCompareFunction(TextStream &s, const GeneratorContext &context) const;
484484

485-
static void writeEnumsInitialization(TextStream &s, const AbstractMetaEnumList &enums);
485+
static void writeEnumsInitialization(TextStream &s, const char *enclosing,
486+
const AbstractMetaEnumList &enums);
486487
static void writeEnumsInitFunc(TextStream &s, const QString &funcName,
487488
const AbstractMetaEnumList &enums);
488-
static bool writeEnumInitialization(TextStream &s, const AbstractMetaEnum &metaEnum);
489+
static bool writeEnumInitialization(TextStream &s, const char *enclosing,
490+
const AbstractMetaEnum &metaEnum);
489491

490492
static void writeSignalInitialization(TextStream &s, const AbstractMetaClassCPtr &metaClass);
491493

0 commit comments

Comments
 (0)