diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2018-07-06 14:59:57 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2018-07-06 15:00:02 +0200 |
commit | e2805675caca2f275f7074e94e3cf04de55f0b3a (patch) | |
tree | 6f5bc7b2272815f503e62d99ca2e70a93893cfd4 /sources | |
parent | e729091759156f417d987ede9de8961d33f28079 (diff) | |
parent | b20dfab4bc9a4887160e359b8d23dd25760ff948 (diff) |
Merge remote-tracking branch 'origin/5.11' into dev
Change-Id: I52be54b4bd400df557255b7d88eb22cb7260ca31
Diffstat (limited to 'sources')
-rw-r--r-- | sources/pyside2/tests/QtCore/CMakeLists.txt | 2 | ||||
-rw-r--r-- | sources/pyside2/tests/QtCore/attr_cache_py3k.py | 65 | ||||
-rw-r--r-- | sources/pyside2/tests/QtCore/emoji_string_test.py | 78 | ||||
-rw-r--r-- | sources/pyside2/tests/QtWidgets/qvariant_test.py | 42 | ||||
-rw-r--r-- | sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp | 2 | ||||
-rw-r--r-- | sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp | 17 | ||||
-rw-r--r-- | sources/shiboken2/ApiExtractor/parser/codemodel.cpp | 24 | ||||
-rw-r--r-- | sources/shiboken2/ApiExtractor/parser/codemodel.h | 9 | ||||
-rw-r--r-- | sources/shiboken2/libshiboken/sbkpython.h | 6 |
9 files changed, 235 insertions, 10 deletions
diff --git a/sources/pyside2/tests/QtCore/CMakeLists.txt b/sources/pyside2/tests/QtCore/CMakeLists.txt index dc7aa3ddd..649e796cc 100644 --- a/sources/pyside2/tests/QtCore/CMakeLists.txt +++ b/sources/pyside2/tests/QtCore/CMakeLists.txt @@ -1,3 +1,4 @@ +PYSIDE_TEST(attr_cache_py3k.py) PYSIDE_TEST(bug_278_test.py) PYSIDE_TEST(bug_332.py) PYSIDE_TEST(bug_408.py) @@ -34,6 +35,7 @@ PYSIDE_TEST(deepcopy_test.py) PYSIDE_TEST(deletelater_test.py) PYSIDE_TEST(destroysignal_test.py) PYSIDE_TEST(duck_punching_test.py) +PYSIDE_TEST(emoji_string_test.py) PYSIDE_TEST(hash_test.py) PYSIDE_TEST(inherits_test.py) PYSIDE_TEST(max_signals.py) diff --git a/sources/pyside2/tests/QtCore/attr_cache_py3k.py b/sources/pyside2/tests/QtCore/attr_cache_py3k.py new file mode 100644 index 000000000..ec0575b02 --- /dev/null +++ b/sources/pyside2/tests/QtCore/attr_cache_py3k.py @@ -0,0 +1,65 @@ +# This Python file uses the following encoding: utf-8 + +############################################################################# +## +## Copyright (C) 2018 The Qt Company Ltd. +## Contact: https://www.qt.io/licensing/ +## +## This file is part of Qt for Python. +## +## $QT_BEGIN_LICENSE:LGPL$ +## Commercial License Usage +## Licensees holding valid commercial Qt licenses may use this file in +## accordance with the commercial license agreement provided with the +## Software or, alternatively, in accordance with the terms contained in +## a written agreement between you and The Qt Company. For licensing terms +## and conditions see https://www.qt.io/terms-conditions. For further +## information use the contact form at https://www.qt.io/contact-us. +## +## GNU Lesser General Public License Usage +## Alternatively, this file may be used under the terms of the GNU Lesser +## General Public License version 3 as published by the Free Software +## Foundation and appearing in the file LICENSE.LGPL3 included in the +## packaging of this file. Please review the following information to +## ensure the GNU Lesser General Public License version 3 requirements +## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +## +## GNU General Public License Usage +## Alternatively, this file may be used under the terms of the GNU +## General Public License version 2.0 or (at your option) the GNU General +## Public license version 3 or any later version approved by the KDE Free +## Qt Foundation. The licenses are as published by the Free Software +## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +## included in the packaging of this file. Please review the following +## information to ensure the GNU General Public License requirements will +## be met: https://www.gnu.org/licenses/gpl-2.0.html and +## https://www.gnu.org/licenses/gpl-3.0.html. +## +## $QT_END_LICENSE$ +## +############################################################################# + +''' +Unit tests for attribute cache in Python 3 + +This is the original code from the bug report +https://bugreports.qt.io/browse/PYSIDE-60 +''' + +from PySide2.QtCore import QObject + + +class A(QObject): + instance = 1 + + @classmethod + def test(cls): + cls.instance + cls.instance = cls() + assert "<__main__.A object " in repr(cls.__dict__['instance']) + assert "<__main__.A object " in repr(cls.instance) + assert "<__main__.A object " in repr(type.__getattribute__(cls, 'instance')) + + +if __name__ == "__main__": + A.test() diff --git a/sources/pyside2/tests/QtCore/emoji_string_test.py b/sources/pyside2/tests/QtCore/emoji_string_test.py new file mode 100644 index 000000000..2e0522878 --- /dev/null +++ b/sources/pyside2/tests/QtCore/emoji_string_test.py @@ -0,0 +1,78 @@ +# This Python file uses the following encoding: utf-8 + +############################################################################# +## +## Copyright (C) 2018 The Qt Company Ltd. +## Contact: https://www.qt.io/licensing/ +## +## This file is part of Qt for Python. +## +## $QT_BEGIN_LICENSE:LGPL$ +## Commercial License Usage +## Licensees holding valid commercial Qt licenses may use this file in +## accordance with the commercial license agreement provided with the +## Software or, alternatively, in accordance with the terms contained in +## a written agreement between you and The Qt Company. For licensing terms +## and conditions see https://www.qt.io/terms-conditions. For further +## information use the contact form at https://www.qt.io/contact-us. +## +## GNU Lesser General Public License Usage +## Alternatively, this file may be used under the terms of the GNU Lesser +## General Public License version 3 as published by the Free Software +## Foundation and appearing in the file LICENSE.LGPL3 included in the +## packaging of this file. Please review the following information to +## ensure the GNU Lesser General Public License version 3 requirements +## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +## +## GNU General Public License Usage +## Alternatively, this file may be used under the terms of the GNU +## General Public License version 2.0 or (at your option) the GNU General +## Public license version 3 or any later version approved by the KDE Free +## Qt Foundation. The licenses are as published by the Free Software +## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +## included in the packaging of this file. Please review the following +## information to ensure the GNU General Public License requirements will +## be met: https://www.gnu.org/licenses/gpl-2.0.html and +## https://www.gnu.org/licenses/gpl-3.0.html. +## +## $QT_END_LICENSE$ +## +############################################################################# + +""" +emoji-string-test.py + +This is the original code from the bug report +https://bugreports.qt.io/browse/PYSIDE-336 + +The only changes are the emoji constant creation which avoids unicode in the +source itself, utf8 encoding in line 1 and a short plausibility test to make +it safely fail. +""" + +import sys +from PySide2 import QtCore + +emoji_str = u'\U0001f632' + u' ' # "😲 " + +class TestStuff(QtCore.QObject): + testsig = QtCore.Signal(str) + + def a_nop(self, sendMeAnEmoji): + print(sendMeAnEmoji) + return + + def __init__(self): + super(TestStuff, self).__init__() + self.testsig.connect(self.a_nop) + self.testsig.emit(emoji_str) + + def plausi(self): + # Python 2 may be built with UCS-2 or UCS-4 support. + # UCS-2 creates 2 surrogate code points. See + # https://stackoverflow.com/questions/30775689/python-length-of-unicode-string-confusion + assert len(emoji_str) == 2 if sys.maxunicode > 0xffff else 3 + +if __name__ == "__main__": + mything = TestStuff() + mything.plausi() diff --git a/sources/pyside2/tests/QtWidgets/qvariant_test.py b/sources/pyside2/tests/QtWidgets/qvariant_test.py index a595f405b..907e6d9ed 100644 --- a/sources/pyside2/tests/QtWidgets/qvariant_test.py +++ b/sources/pyside2/tests/QtWidgets/qvariant_test.py @@ -27,8 +27,10 @@ ############################################################################# import unittest -from PySide2.QtCore import * -from PySide2.QtWidgets import * +from PySide2.QtWidgets import (QApplication, QComboBox, QGraphicsScene, + QGraphicsRectItem) + +from helper import UsesQApplication class MyDiagram(QGraphicsScene): pass @@ -37,14 +39,38 @@ class MyItem(QGraphicsRectItem): def itemChange(self, change, value): return value; -class QGraphicsSceneOnQVariantTest(unittest.TestCase): +class Sequence(object): + # Having the __getitem__ method on a class transform the Python + # type to a PySequence. + # Before the patch: aa75437f9119d997dd290471ac3e2cc88ca88bf1 + # "Fix QVariant conversions when using PySequences" + # one could not use an object from this class, because internally + # we were requiring that the PySequence was finite. + def __getitem__(self, key): + raise IndexError() + +class QGraphicsSceneOnQVariantTest(UsesQApplication): """Test storage ot QGraphicsScene into QVariants""" + def setUp(self): + super(QGraphicsSceneOnQVariantTest, self).setUp() + self.s = MyDiagram() + self.i = MyItem() + self.combo = QComboBox() + + def tearDown(self): + del self.s + del self.i + del self.combo + super(QGraphicsSceneOnQVariantTest, self).tearDown() + def testIt(self): - app = QApplication([]) - s = MyDiagram() - i = MyItem() - s.addItem(i) - self.assertEqual(len(s.items()), 1) + self.s.addItem(self.i) + self.assertEqual(len(self.s.items()), 1) + + def testSequence(self): + # PYSIDE-641 + self.combo.addItem("test", userData=Sequence()) + self.assertTrue(isinstance(self.combo.itemData(0), Sequence)) if __name__ == '__main__': unittest.main() diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp index c879727c3..84c116708 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp +++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp @@ -1913,7 +1913,7 @@ bool AbstractMetaBuilderPrivate::setArrayArgumentType(AbstractMetaFunction *func AbstractMetaFunction *AbstractMetaBuilderPrivate::traverseFunction(FunctionModelItem functionItem) { - if (!functionItem->templateParameters().isEmpty()) + if (functionItem->isDeleted() || !functionItem->templateParameters().isEmpty()) return nullptr; QString functionName = functionItem->name(); QString className; diff --git a/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp b/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp index 5192e9e76..af7f96068 100644 --- a/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp +++ b/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp @@ -260,6 +260,18 @@ FunctionModelItem BuilderPrivate::createFunction(const CXCursor &cursor, result->setFunctionType(t); result->setScope(m_scope); result->setStatic(clang_Cursor_getStorageClass(cursor) == CX_SC_Static); + switch (clang_getCursorAvailability(cursor)) { + case CXAvailability_Available: + break; + case CXAvailability_Deprecated: + result->setDeprecated(true); + break; + case CXAvailability_NotAvailable: // "Foo(const Foo&) = delete;" + result->setDeleted(true); + break; + case CXAvailability_NotAccessible: + break; + } return result; } @@ -729,7 +741,6 @@ BaseVisitor::StartTokenResult Builder::startToken(const CXCursor &cursor) d->m_currentEnum->setSigned(isSigned(clang_getEnumDeclIntegerType(cursor).kind)); if (!qSharedPointerDynamicCast<_ClassModelItem>(d->m_scopeStack.back()).isNull()) d->m_currentEnum->setAccessPolicy(accessPolicy(clang_getCXXAccessSpecifier(cursor))); - d->m_scopeStack.back()->addEnum(d->m_currentEnum); } break; case CXCursor_EnumConstantDecl: { @@ -912,6 +923,10 @@ bool Builder::endToken(const CXCursor &cursor) d->m_currentFunctionType = CodeModel::Normal; break; case CXCursor_EnumDecl: + // Add enum only if values were encountered, otherwise assume it + // is a forward declaration of an enum class. + if (!d->m_currentEnum.isNull() && d->m_currentEnum->hasValues()) + d->m_scopeStack.back()->addEnum(d->m_currentEnum); d->m_currentEnum.clear(); break; case CXCursor_VarDecl: diff --git a/sources/shiboken2/ApiExtractor/parser/codemodel.cpp b/sources/shiboken2/ApiExtractor/parser/codemodel.cpp index 60a699337..d862692dd 100644 --- a/sources/shiboken2/ApiExtractor/parser/codemodel.cpp +++ b/sources/shiboken2/ApiExtractor/parser/codemodel.cpp @@ -896,6 +896,26 @@ void _FunctionModelItem::setVariadics(bool isVariadics) m_isVariadics = isVariadics; } +bool _FunctionModelItem::isDeleted() const +{ + return m_isDeleted; +} + +void _FunctionModelItem::setDeleted(bool d) +{ + m_isDeleted = d; +} + +bool _FunctionModelItem::isDeprecated() const +{ + return m_isDeprecated; +} + +void _FunctionModelItem::setDeprecated(bool d) +{ + m_isDeprecated = d; +} + bool _FunctionModelItem::isVirtual() const { return m_isVirtual; @@ -972,12 +992,16 @@ void _FunctionModelItem::formatDebug(QDebug &d) const { _MemberModelItem::formatDebug(d); d << ", type=" << m_functionType; + if (m_isDeleted) + d << " [deleted!]"; if (m_isInline) d << " [inline]"; if (m_isVirtual) d << " [virtual]"; if (m_isOverride) d << " [override]"; + if (m_isDeprecated) + d << " [deprecated]"; if (m_isFinal) d << " [final]"; if (m_isAbstract) diff --git a/sources/shiboken2/ApiExtractor/parser/codemodel.h b/sources/shiboken2/ApiExtractor/parser/codemodel.h index d93aa10d9..ac1fe26c1 100644 --- a/sources/shiboken2/ApiExtractor/parser/codemodel.h +++ b/sources/shiboken2/ApiExtractor/parser/codemodel.h @@ -552,6 +552,12 @@ public: CodeModel::FunctionType functionType() const; void setFunctionType(CodeModel::FunctionType functionType); + bool isDeleted() const; + void setDeleted(bool d); + + bool isDeprecated() const; + void setDeprecated(bool d); + bool isVirtual() const; void setVirtual(bool isVirtual); @@ -587,9 +593,11 @@ private: CodeModel::FunctionType m_functionType; union { struct { + uint m_isDeleted: 1; uint m_isVirtual: 1; uint m_isOverride: 1; uint m_isFinal: 1; + uint m_isDeprecated: 1; uint m_isInline: 1; uint m_isAbstract: 1; uint m_isExplicit: 1; @@ -646,6 +654,7 @@ public: CodeModel::AccessPolicy accessPolicy() const; void setAccessPolicy(CodeModel::AccessPolicy accessPolicy); + bool hasValues() const { return !m_enumerators.isEmpty(); } EnumeratorList enumerators() const; void addEnumerator(EnumeratorModelItem item); diff --git a/sources/shiboken2/libshiboken/sbkpython.h b/sources/shiboken2/libshiboken/sbkpython.h index a26c318d1..fbac016eb 100644 --- a/sources/shiboken2/libshiboken/sbkpython.h +++ b/sources/shiboken2/libshiboken/sbkpython.h @@ -71,6 +71,12 @@ #define PyInt_AsSsize_t(x) PyLong_AsSsize_t(x) #define PyString_Type PyUnicode_Type + // In Python 3, Py_TPFLAGS_DEFAULT contains Py_TPFLAGS_HAVE_VERSION_TAG, + // which will trigger the attribute cache, which is not intended in Qt for Python. + // Use a customized Py_TPFLAGS_DEFAULT by defining Py_TPFLAGS_HAVE_VERSION_TAG = 0. + #undef Py_TPFLAGS_HAVE_VERSION_TAG + #define Py_TPFLAGS_HAVE_VERSION_TAG (0) + #else // Note: if there wasn't for the old-style classes, only a PyNumber_Check would suffice. #define SbkNumber_Check(X) \ |