aboutsummaryrefslogtreecommitdiffstats
path: root/sources
diff options
context:
space:
mode:
Diffstat (limited to 'sources')
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetafunction.cpp3
-rw-r--r--sources/shiboken6/generator/generator.cpp10
-rw-r--r--sources/shiboken6/generator/generator.h1
-rw-r--r--sources/shiboken6/generator/shiboken/cppgenerator.cpp4
-rw-r--r--sources/shiboken6/generator/shiboken/shibokengenerator.cpp3
-rw-r--r--sources/shiboken6/tests/libsample/stdcomplex.cpp5
-rw-r--r--sources/shiboken6/tests/libsample/stdcomplex.h3
-rw-r--r--sources/shiboken6/tests/samplebinding/stdcomplex_test.py5
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())