diff options
Diffstat (limited to 'sources/shiboken6')
8 files changed, 31 insertions, 3 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp b/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp index 6bad267a7..23a44248e 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp +++ b/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp @@ -464,6 +464,9 @@ bool AbstractMetaFunction::generateBinding() const { switch (d->m_functionType) { case ConversionOperator: + if (d->m_name != u"operator int" && d->m_name != u"operator double") + return false; + break; case AssignmentOperatorFunction: case MoveAssignmentOperatorFunction: case AbstractMetaFunction::MoveConstructorFunction: diff --git a/sources/shiboken6/generator/generator.cpp b/sources/shiboken6/generator/generator.cpp index e34ff10e1..12f2c53b7 100644 --- a/sources/shiboken6/generator/generator.cpp +++ b/sources/shiboken6/generator/generator.cpp @@ -595,7 +595,10 @@ static const QHash<QString, QString> &pythonOperators() {u"operator<"_s, u"__lt__"_s}, {u"operator>"_s, u"__gt__"_s}, {u"operator<="_s, u"__le__"_s}, - {u"operator>="_s, u"__ge__"_s} + {u"operator>="_s, u"__ge__"_s}, + // Conversion (note bool has special handling with heuristics) + {u"operator int"_s, u"__int__"_s}, + {u"operator double"_s, u"__float__"_s} }; return result; } @@ -605,6 +608,11 @@ QString Generator::pythonOperatorFunctionName(const QString &cppOpFuncName) return pythonOperators().value(cppOpFuncName); } +bool Generator::isPythonOperatorFunctionName(const QString &cppOpFuncName) +{ + return pythonOperators().contains(cppOpFuncName); +} + QString Generator::subDirectoryForPackage(QString packageNameIn) const { if (packageNameIn.isEmpty()) diff --git a/sources/shiboken6/generator/generator.h b/sources/shiboken6/generator/generator.h index 9d87ada6b..b5c73db25 100644 --- a/sources/shiboken6/generator/generator.h +++ b/sources/shiboken6/generator/generator.h @@ -110,6 +110,7 @@ public: static QString moduleName(); static QString pythonOperatorFunctionName(const QString &cppOpFuncName); + static bool isPythonOperatorFunctionName(const QString &cppOpFuncName); protected: /// Helper for determining the file name diff --git a/sources/shiboken6/generator/shiboken/cppgenerator.cpp b/sources/shiboken6/generator/shiboken/cppgenerator.cpp index 223fc9aaa..5155d121e 100644 --- a/sources/shiboken6/generator/shiboken/cppgenerator.cpp +++ b/sources/shiboken6/generator/shiboken/cppgenerator.cpp @@ -4831,7 +4831,9 @@ static const QHash<QString, QString> &nbFuncs() {u"__iand__"_s, u"Py_nb_inplace_and"_s}, {u"__ixor__"_s, u"Py_nb_inplace_xor"_s}, {u"__ior__"_s, u"Py_nb_inplace_or"_s}, - {u"__bool__"_s, u"Py_nb_bool"_s} + {u"__bool__"_s, u"Py_nb_bool"_s}, + {u"__int__"_s, u"Py_nb_int"_s}, + {u"__float__"_s, u"Py_nb_float"_s} }; return result; } diff --git a/sources/shiboken6/generator/shiboken/shibokengenerator.cpp b/sources/shiboken6/generator/shiboken/shibokengenerator.cpp index 5f330e027..62602381c 100644 --- a/sources/shiboken6/generator/shiboken/shibokengenerator.cpp +++ b/sources/shiboken6/generator/shiboken/shibokengenerator.cpp @@ -2056,7 +2056,8 @@ QList<AbstractMetaFunctionCList> OperatorQueryOption::ArithmeticOp | OperatorQueryOption::IncDecrementOp | OperatorQueryOption::LogicalOp - | OperatorQueryOption::BitwiseOp); + | OperatorQueryOption::BitwiseOp + | OperatorQueryOption::ConversionOp); for (auto i = result.size() - 1; i >= 0; --i) { AbstractMetaFunctionCList &l = result[i]; diff --git a/sources/shiboken6/tests/libsample/stdcomplex.cpp b/sources/shiboken6/tests/libsample/stdcomplex.cpp index c9937b9da..847174387 100644 --- a/sources/shiboken6/tests/libsample/stdcomplex.cpp +++ b/sources/shiboken6/tests/libsample/stdcomplex.cpp @@ -11,6 +11,11 @@ StdComplex::StdComplex(double re, double img) noexcept : m_impl(re, img) { } +StdComplex::operator int() const +{ + return std::lround(abs_value()); +} + StdComplex::StdComplex(const Impl &impl) noexcept : m_impl(impl) { } diff --git a/sources/shiboken6/tests/libsample/stdcomplex.h b/sources/shiboken6/tests/libsample/stdcomplex.h index 130ca6545..b39b80612 100644 --- a/sources/shiboken6/tests/libsample/stdcomplex.h +++ b/sources/shiboken6/tests/libsample/stdcomplex.h @@ -27,6 +27,9 @@ public: StdComplex pow(const StdComplex &exp) const; + operator double() const { return abs_value(); } + operator int() const; + friend inline bool operator==(const StdComplex &c1, const StdComplex &c2) noexcept { return c1.m_impl == c2.m_impl; } friend inline bool operator!=(const StdComplex &c1, const StdComplex &c2) noexcept diff --git a/sources/shiboken6/tests/samplebinding/stdcomplex_test.py b/sources/shiboken6/tests/samplebinding/stdcomplex_test.py index 539463508..0caa9764d 100644 --- a/sources/shiboken6/tests/samplebinding/stdcomplex_test.py +++ b/sources/shiboken6/tests/samplebinding/stdcomplex_test.py @@ -25,6 +25,11 @@ class StdComplexTest(unittest.TestCase): '''Test case for StdComplex class, exercising esoteric number protocols (Py_nb_). For standard number protocols, see Point.''' + def testConversion(self): + pt = StdComplex(REAL, IMAG) + self.assertEqual(int(pt), int(round(pt.abs_value()))) + self.assertEqual(float(pt), pt.abs_value()) + def testAbs(self): pt = StdComplex(REAL, IMAG) self.assertEqual(abs(pt), pt.abs_value()) |