diff options
author | Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io> | 2018-11-23 15:17:48 +0100 |
---|---|---|
committer | Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io> | 2018-11-27 16:47:12 +0000 |
commit | 0a70c8485771ae8cc62faaa775b1db2a5dbd95ef (patch) | |
tree | 73bbfeb66bc907631b9810553e97e004ed17959f /sources/shiboken2 | |
parent | f30e4db5169800c25bf79573f650fc2b08d13046 (diff) |
Exclude reverse operations from shift hack
An old fix for a QDataStream bug was performing
an additional step related reverse operations,
to make sure we call them if they were implemented
in other classes.
This was intended for shift operations.
Classes like QVector*, QTransform, and others
which include reverse operations like __radd__,
and __rmul__ will include this patch too.
When implementing a class that inherits from these types,
this becomes an infinite loop, which can be solved
applying this patch only for shift operations.
Due to this change, a QMatrix and a shiboken test
needed to be adapted.
Change-Id: Ie399837b6435b2cd058648a15f4d5cdff037ac6b
Fixes: PYSIDE-192
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'sources/shiboken2')
-rw-r--r-- | sources/shiboken2/generator/shiboken2/cppgenerator.cpp | 5 | ||||
-rwxr-xr-x | sources/shiboken2/tests/otherbinding/extended_multiply_operator_test.py | 2 |
2 files changed, 5 insertions, 2 deletions
diff --git a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp index 393f8a850..adec70dd7 100644 --- a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp +++ b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp @@ -1764,6 +1764,7 @@ void CppGenerator::writeMethodWrapper(QTextStream &s, const AbstractMetaFunction s << endl; /* + * This code is intended for shift operations only: * Make sure reverse <</>> operators defined in other classes (specially from other modules) * are called. A proper and generic solution would require an reengineering in the operator * system like the extended converters. @@ -1778,7 +1779,9 @@ void CppGenerator::writeMethodWrapper(QTextStream &s, const AbstractMetaFunction && rfunc->isOperatorOverload(); if (callExtendedReverseOperator) { QString revOpName = ShibokenGenerator::pythonOperatorFunctionName(rfunc).insert(2, QLatin1Char('r')); - if (rfunc->isBinaryOperator()) { + // For custom classes, operations like __radd__ and __rmul__ + // will enter an infinite loop. + if (rfunc->isBinaryOperator() && revOpName.contains(QLatin1String("shift"))) { s << INDENT << "if (!isReverse" << endl; { Indentation indent(INDENT); diff --git a/sources/shiboken2/tests/otherbinding/extended_multiply_operator_test.py b/sources/shiboken2/tests/otherbinding/extended_multiply_operator_test.py index 08541a1f4..0c58fbf5b 100755 --- a/sources/shiboken2/tests/otherbinding/extended_multiply_operator_test.py +++ b/sources/shiboken2/tests/otherbinding/extended_multiply_operator_test.py @@ -57,7 +57,7 @@ class PointOperationsWithNumber(unittest.TestCase): '''sample.Point * other.Number''' pt = Point(2, 7) num = Number(11) - self.assertEqual(pt * num, pt * 11) + self.assertEqual(pt * num.value(), pt * 11) if __name__ == '__main__': unittest.main() |