diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2019-10-31 08:22:55 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2019-10-31 08:23:11 +0100 |
commit | 1064a14bebdc27dd749d9ec91bce5aa88d7a5d0f (patch) | |
tree | ccae2dcf7db3cecfe5cb648c604aa4b007152ed4 /sources/shiboken2 | |
parent | 67929d31c4ab91b357957a9a47c16a8a6b42cf52 (diff) | |
parent | 403cfed02b017d80361cdb5b9bba8c4aad7a14bf (diff) |
Merge remote-tracking branch 'origin/5.13' into 5.14
Change-Id: I9f31a647fd9d4ad9c854a307f8b5df1be935354a
Diffstat (limited to 'sources/shiboken2')
9 files changed, 73 insertions, 19 deletions
diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp index 5e9c63adc..ae3cdd86b 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp +++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp @@ -248,6 +248,15 @@ void AbstractMetaBuilderPrivate::registerHashFunction(const FunctionModelItem &f } } +void AbstractMetaBuilderPrivate::registerToStringCapabilityIn(const NamespaceModelItem &nsItem) +{ + const FunctionList &streamOps = nsItem->findFunctions(QLatin1String("operator<<")); + for (const FunctionModelItem &item : streamOps) + registerToStringCapability(item, nullptr); + for (const NamespaceModelItem &ni : nsItem->namespaces()) + registerToStringCapabilityIn(ni); +} + /** * Check if a class has a debug stream operator that can be used as toString */ @@ -261,7 +270,7 @@ void AbstractMetaBuilderPrivate::registerToStringCapability(const FunctionModelI const ArgumentModelItem &arg = arguments.at(1); if (AbstractMetaClass *cls = argumentToClass(arg, currentClass)) { if (arg->type().indirections() < 2) - cls->setToStringCapability(true); + cls->setToStringCapability(true, arg->type().indirections()); } } } @@ -503,8 +512,12 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom) ReportHandler::startProgress("Fixing class inheritance..."); for (AbstractMetaClass *cls : qAsConst(m_metaClasses)) { - if (!cls->isInterface() && !cls->isNamespace()) + if (!cls->isInterface() && !cls->isNamespace()) { setupInheritance(cls); + if (!cls->hasVirtualDestructor() && cls->baseClass() + && cls->baseClass()->hasVirtualDestructor()) + cls->setHasVirtualDestructor(true); + } } ReportHandler::startProgress("Detecting inconsistencies in class model..."); @@ -591,11 +604,7 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom) registerHashFunction(item, nullptr); } - { - const FunctionList &streamOps = dom->findFunctions(QLatin1String("operator<<")); - for (const FunctionModelItem &item : streamOps) - registerToStringCapability(item, nullptr); - } + registerToStringCapabilityIn(dom); { FunctionList binaryOperators = dom->findFunctions(QStringLiteral("operator==")); diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h b/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h index adf4d836b..30df236d6 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h +++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h @@ -58,7 +58,7 @@ public: void dumpLog() const; AbstractMetaClassList classesTopologicalSorted(const AbstractMetaClassList &classList, const Dependencies &additionalDependencies = Dependencies()) const; - ScopeModelItem popScope() { return m_scopes.takeLast(); } + NamespaceModelItem popScope() { return m_scopes.takeLast(); } void pushScope(const NamespaceModelItem &item); @@ -108,6 +108,7 @@ public: void checkFunctionModifications(); void registerHashFunction(const FunctionModelItem &functionItem, AbstractMetaClass *currentClass); + void registerToStringCapabilityIn(const NamespaceModelItem &namespaceItem); void registerToStringCapability(const FunctionModelItem &functionItem, AbstractMetaClass *currentClass); diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.h b/sources/shiboken2/ApiExtractor/abstractmetalang.h index 6ed9dd36d..077191471 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetalang.h +++ b/sources/shiboken2/ApiExtractor/abstractmetalang.h @@ -1692,9 +1692,10 @@ public: return m_stream; } - void setToStringCapability(bool value) + void setToStringCapability(bool value, uint indirections = 0) { m_hasToStringCapability = value; + m_toStringCapabilityIndirections = indirections; } bool hasToStringCapability() const @@ -1702,6 +1703,11 @@ public: return m_hasToStringCapability; } + uint toStringCapabilityIndirections() const + { + return m_toStringCapabilityIndirections; + } + bool deleteInMainThread() const; static AbstractMetaClass *findClass(const AbstractMetaClassList &classes, @@ -1754,6 +1760,7 @@ private: // FunctionModelItem m_qDebugStreamFunction; bool m_stream = false; + uint m_toStringCapabilityIndirections = 0; }; Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractMetaClass::FunctionQueryOptions) diff --git a/sources/shiboken2/ApiExtractor/tests/testdtorinformation.cpp b/sources/shiboken2/ApiExtractor/tests/testdtorinformation.cpp index f4204e9b9..0eee8af24 100644 --- a/sources/shiboken2/ApiExtractor/tests/testdtorinformation.cpp +++ b/sources/shiboken2/ApiExtractor/tests/testdtorinformation.cpp @@ -69,6 +69,39 @@ void TestDtorInformation::testDtorIsVirtual() QCOMPARE(AbstractMetaClass::findClass(classes, QLatin1String("Subject"))->hasVirtualDestructor(), true); } +void TestDtorInformation::testDtorFromBaseIsVirtual() +{ + const char* cppCode = R"CPP(class ControlBase { public: ~ControlBase() {} }; +class Control : public ControlBase {}; +class SubjectBase { public: virtual ~SubjectBase() {} }; +class Subject : public SubjectBase {}; +)CPP"; + const char* xmlCode = R"XML(<typesystem package="Foo"><value-type name="ControlBase"/> +<value-type name="Control"/>" +<value-type name="SubjectBase"/>" +<value-type name="Subject"/> +</typesystem> +)XML"; + QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode)); + QVERIFY(!builder.isNull()); + AbstractMetaClassList classes = builder->classes(); + QCOMPARE(classes.count(), 4); + + auto klass = AbstractMetaClass::findClass(classes, QLatin1String("ControlBase")); + QVERIFY(klass); + QVERIFY(!klass->hasVirtualDestructor()); + klass = AbstractMetaClass::findClass(classes, QLatin1String("Control")); + QVERIFY(klass); + QVERIFY(!klass->hasVirtualDestructor()); + + klass = AbstractMetaClass::findClass(classes, QLatin1String("SubjectBase")); + QVERIFY(klass); + QVERIFY(klass->hasVirtualDestructor()); + klass = AbstractMetaClass::findClass(classes, QLatin1String("Subject")); + QVERIFY(klass); + QVERIFY(klass->hasVirtualDestructor()); +} + void TestDtorInformation::testClassWithVirtualDtorIsPolymorphic() { const char* cppCode ="class Control { public: virtual ~Control() {} }; class Subject { protected: virtual ~Subject() {} };"; diff --git a/sources/shiboken2/ApiExtractor/tests/testdtorinformation.h b/sources/shiboken2/ApiExtractor/tests/testdtorinformation.h index 068ef4952..0a57dd8d1 100644 --- a/sources/shiboken2/ApiExtractor/tests/testdtorinformation.h +++ b/sources/shiboken2/ApiExtractor/tests/testdtorinformation.h @@ -40,6 +40,7 @@ private slots: void testDtorIsPrivate(); void testDtorIsProtected(); void testDtorIsVirtual(); + void testDtorFromBaseIsVirtual(); void testClassWithVirtualDtorIsPolymorphic(); }; diff --git a/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp b/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp index 3b6d1c870..86abf21b0 100644 --- a/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp +++ b/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp @@ -1236,10 +1236,6 @@ void QtXmlToSphinx::handlePageTag(QXmlStreamReader &reader) : writeEscapedRstText(m_output, fullTitle); m_output << endl << Pad('*', size) << endl << endl; - - const QStringRef brief = reader.attributes().value(briefAttribute()); - if (!brief.isEmpty()) - m_output << escape(brief) << endl << endl; } void QtXmlToSphinx::handleTargetTag(QXmlStreamReader &reader) @@ -1625,7 +1621,7 @@ void QtDocGenerator::generateClass(QTextStream &s, GeneratorContext &classContex m_docParser->setPackageName(metaClass->package()); m_docParser->fillDocumentation(const_cast<AbstractMetaClass*>(metaClass)); - s << ".. module:: " << metaClass->package() << endl; + s << ".. currentmodule:: " << metaClass->package() << endl; QString className = getClassTargetFullName(metaClass, false); s << ".. _" << className << ":" << endl << endl; diff --git a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp index 146a53d2d..5460fd7c7 100644 --- a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp +++ b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp @@ -3941,9 +3941,10 @@ void CppGenerator::writeClassDefinition(QTextStream &s, m_tpFuncs[func->name()] = cpythonFunctionName(func); } if (m_tpFuncs.value(QLatin1String("__repr__")).isEmpty() - && !metaClass->isQObject() && metaClass->hasToStringCapability()) { - m_tpFuncs[QLatin1String("__repr__")] = writeReprFunction(s, classContext); + m_tpFuncs[QLatin1String("__repr__")] = writeReprFunction(s, + classContext, + metaClass->toStringCapabilityIndirections()); } // class or some ancestor has multiple inheritance @@ -5999,7 +6000,9 @@ void CppGenerator::writeIndexError(QTextStream &s, const QString &errorMsg) s << INDENT << '}' << endl; } -QString CppGenerator::writeReprFunction(QTextStream &s, GeneratorContext &context) +QString CppGenerator::writeReprFunction(QTextStream &s, + GeneratorContext &context, + uint indirections) { const AbstractMetaClass *metaClass = context.metaClass(); QString funcName = cpythonBaseName(metaClass) + QLatin1String("__repr__"); @@ -6012,7 +6015,7 @@ QString CppGenerator::writeReprFunction(QTextStream &s, GeneratorContext &contex s << INDENT << "buffer.open(QBuffer::ReadWrite);" << endl; s << INDENT << "QDebug dbg(&buffer);" << endl; s << INDENT << "dbg << "; - if (metaClass->typeEntry()->isValue()) + if (metaClass->typeEntry()->isValue() || indirections == 0) s << '*'; s << CPP_SELF_VAR << ';' << endl; s << INDENT << "buffer.close();" << endl; diff --git a/sources/shiboken2/generator/shiboken2/cppgenerator.h b/sources/shiboken2/generator/shiboken2/cppgenerator.h index ae6da9582..005518f96 100644 --- a/sources/shiboken2/generator/shiboken2/cppgenerator.h +++ b/sources/shiboken2/generator/shiboken2/cppgenerator.h @@ -336,7 +336,7 @@ private: /// Helper function for writeStdListWrapperMethods. void writeIndexError(QTextStream &s, const QString &errorMsg); - QString writeReprFunction(QTextStream &s, GeneratorContext &context); + QString writeReprFunction(QTextStream &s, GeneratorContext &context, uint indirections); const AbstractMetaFunction *boolCast(const AbstractMetaClass *metaClass) const; bool hasBoolCast(const AbstractMetaClass *metaClass) const diff --git a/sources/shiboken2/libshiboken/shibokenbuffer.cpp b/sources/shiboken2/libshiboken/shibokenbuffer.cpp index 330470183..dd6e46320 100644 --- a/sources/shiboken2/libshiboken/shibokenbuffer.cpp +++ b/sources/shiboken2/libshiboken/shibokenbuffer.cpp @@ -43,7 +43,11 @@ bool Shiboken::Buffer::checkType(PyObject *pyObj) { +#ifdef IS_PY3K + return PyObject_CheckBuffer(pyObj) != 0; +#else return PyObject_CheckReadBuffer(pyObj) != 0; +#endif } void *Shiboken::Buffer::getPointer(PyObject *pyObj, Py_ssize_t *size) |