aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4runtime.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@qt.io>2017-06-20 11:28:27 +0200
committerLars Knoll <lars.knoll@qt.io>2017-06-21 09:19:59 +0000
commit48d77ce4c83c2c1d2f3ee3d01c69550e115c3226 (patch)
treeb62edfd573502ded0ff436c250992684d3770567 /src/qml/jsruntime/qv4runtime.cpp
parent5c86161fa28e951435a735a299b886fbfbe3bb16 (diff)
Add support for post increment/decrement
Change-Id: Ie3f03a548105fe49d29e3d60bf823435f21b0340 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4runtime.cpp')
-rw-r--r--src/qml/jsruntime/qv4runtime.cpp44
1 files changed, 42 insertions, 2 deletions
diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp
index 9737a18812..3342075f7f 100644
--- a/src/qml/jsruntime/qv4runtime.cpp
+++ b/src/qml/jsruntime/qv4runtime.cpp
@@ -1414,7 +1414,7 @@ QV4::ReturnedValue Runtime::method_setupArgumentsObject(ExecutionEngine *engine)
#endif // V4_BOOTSTRAP
-QV4::ReturnedValue Runtime::method_increment(const Value &value)
+QV4::ReturnedValue Runtime::method_preIncrement(const Value &value)
{
TRACE1(value);
@@ -1426,7 +1426,7 @@ QV4::ReturnedValue Runtime::method_increment(const Value &value)
}
}
-QV4::ReturnedValue Runtime::method_decrement(const Value &value)
+QV4::ReturnedValue Runtime::method_preDecrement(const Value &value)
{
TRACE1(value);
@@ -1438,6 +1438,46 @@ QV4::ReturnedValue Runtime::method_decrement(const Value &value)
}
}
+QV4::ReturnedValue Runtime::method_postIncrement(Value *value)
+{
+ TRACE1(value);
+
+ if (value->isNumber()) {
+ Value old = *value;
+ if (value->isInteger() && value->integerValue() < INT_MAX) {
+ *value = Primitive::fromInt32(value->integerValue() + 1);
+ } else {
+ *value = Primitive::fromDouble(value->doubleValue() + 1.0);
+ }
+ return old.asReturnedValue();
+ }
+
+ // ToNumber conversion needed:
+ double d = value->toNumberImpl();
+ *value = Primitive::fromDouble(d + 1.);
+ return Encode(d);
+}
+
+QV4::ReturnedValue Runtime::method_postDecrement(Value *value)
+{
+ TRACE1(value);
+
+ if (value->isNumber()) {
+ Value old = *value;
+ if (value->isInteger() && value->integerValue() > INT_MIN) {
+ *value = Primitive::fromInt32(value->integerValue() - 1);
+ } else {
+ *value = Primitive::fromDouble(value->doubleValue() - 1.0);
+ }
+ return old.asReturnedValue();
+ }
+
+ // ToNumber conversion needed:
+ double d = value->toNumber();
+ *value = Primitive::fromDouble(d - 1.);
+ return Encode(d);
+}
+
ReturnedValue Runtime::method_toDouble(const Value &value)
{
TRACE1(value);