diff options
-rw-r--r-- | src/qml/jsapi/qjsprimitivevalue.h | 28 | ||||
-rw-r--r-- | tests/auto/qml/qjsprimitivevalue/tst_qjsprimitivevalue.cpp | 6 |
2 files changed, 33 insertions, 1 deletions
diff --git a/src/qml/jsapi/qjsprimitivevalue.h b/src/qml/jsapi/qjsprimitivevalue.h index f9cc9f3089..5a82175783 100644 --- a/src/qml/jsapi/qjsprimitivevalue.h +++ b/src/qml/jsapi/qjsprimitivevalue.h @@ -48,6 +48,7 @@ #include <QtCore/qvariant.h> #include <variant> +#include <cmath> QT_BEGIN_NAMESPACE @@ -296,6 +297,33 @@ public: return operate<DivOperators>(lhs, rhs); } + friend inline QJSPrimitiveValue operator%(const QJSPrimitiveValue &lhs, + const QJSPrimitiveValue &rhs) + { + switch (lhs.type()) { + case Null: + case Boolean: + case Integer: + switch (rhs.type()) { + case Boolean: + case Integer: { + const int leftInt = lhs.toInteger(); + const int rightInt = rhs.toInteger(); + if (leftInt >= 0 && rightInt > 0) + return leftInt % rightInt; + Q_FALLTHROUGH(); + } + default: + break; + } + Q_FALLTHROUGH(); + default: + break; + } + + return std::fmod(lhs.toDouble(), rhs.toDouble()); + } + constexpr bool strictlyEquals(const QJSPrimitiveValue &other) const { const Type myType = type(); diff --git a/tests/auto/qml/qjsprimitivevalue/tst_qjsprimitivevalue.cpp b/tests/auto/qml/qjsprimitivevalue/tst_qjsprimitivevalue.cpp index 5189ea4b94..4fe68e1f73 100644 --- a/tests/auto/qml/qjsprimitivevalue/tst_qjsprimitivevalue.cpp +++ b/tests/auto/qml/qjsprimitivevalue/tst_qjsprimitivevalue.cpp @@ -97,7 +97,7 @@ do {\ QVERIFY2(condition, qPrintable(expression + " -> " + js.toString())) enum Operator { - Add, Sub, Mul, Div, Eq, SEq, NEq, SNEq, GT, LT, GEq, LEq + Add, Sub, Mul, Div, Eq, SEq, NEq, SNEq, GT, LT, GEq, LEq, Mod }; QString toString(Operator op) { @@ -114,6 +114,7 @@ QString toString(Operator op) { case LT: return "<"; case GEq: return ">="; case LEq: return "<="; + case Mod: return "%"; } Q_UNREACHABLE(); @@ -149,6 +150,8 @@ void doTestOperator(QJSEngine *engine, LHS lhs, RHS rhs) result = lhs >= rhs; else if constexpr (op == LEq) result = lhs <= rhs; + else if constexpr (op == Mod) + result = lhs % rhs; else QFAIL("Unkonwn operator"); @@ -199,6 +202,7 @@ void doTestForAllOperators(QJSEngine *engine, LHS lhs, RHS rhs) doTestOperator<LHS, RHS, QJSPrimitiveValue, Sub>(engine, lhs, rhs); doTestOperator<LHS, RHS, QJSPrimitiveValue, Mul>(engine, lhs, rhs); doTestOperator<LHS, RHS, QJSPrimitiveValue, Div>(engine, lhs, rhs); + doTestOperator<LHS, RHS, QJSPrimitiveValue, Mod>(engine, lhs, rhs); doTestOperator<LHS, RHS, bool, Eq>(engine, lhs, rhs); doTestOperator<LHS, RHS, bool, SEq>(engine, lhs, rhs); doTestOperator<LHS, RHS, bool, NEq>(engine, lhs, rhs); |