diff options
author | Erik Verbruggen <erik.verbruggen@digia.com> | 2014-12-16 11:40:24 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2014-12-18 12:14:20 +0100 |
commit | bbbbfc06a053896a335161c9aa41bee93048daba (patch) | |
tree | 9dd46d913a181d4e3deb86925c3e6a621cace356 | |
parent | 7ee29f69918ef11b83f7ee6acc1fa9c508c9f4a3 (diff) |
V4: fix reverse type propagation
Only do integer add/sub/mul when all operands are known to be integers.
[ChangeLog][QtQml] Fixed invalidly opportunistic truncating of non-integer values for additions/subtractions/multiplications in JavaScript and binding expressions.
Change-Id: I21b3bede2fb3e8033305591110b98cc9e6bf52f8
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
-rw-r--r-- | src/qml/compiler/qv4ssa.cpp | 23 | ||||
-rw-r--r-- | tests/auto/qml/qjsengine/tst_qjsengine.cpp | 4 |
2 files changed, 17 insertions, 10 deletions
diff --git a/src/qml/compiler/qv4ssa.cpp b/src/qml/compiler/qv4ssa.cpp index 8b218492a9..5861138dbe 100644 --- a/src/qml/compiler/qv4ssa.cpp +++ b/src/qml/compiler/qv4ssa.cpp @@ -2562,17 +2562,21 @@ public: } else if (m->source->asConvert()) { break; } else if (Binop *b = m->source->asBinop()) { + bool iterateOnOperands = true; + switch (b->op) { + case OpSub: + case OpMul: case OpAdd: - if (b->left->type & NumberType || b->right->type & NumberType) + if (b->left->type == SInt32Type && b->right->type == SInt32Type) { + iterateOnOperands = false; break; - else + } else { continue; + } case OpBitAnd: case OpBitOr: case OpBitXor: - case OpSub: - case OpMul: case OpLShift: case OpRShift: case OpURShift: @@ -2580,10 +2584,13 @@ public: default: continue; } - if (Temp *lt = b->left->asTemp()) - candidates.append(*lt); - if (Temp *rt = b->right->asTemp()) - candidates.append(*rt); + + if (iterateOnOperands) { + if (Temp *lt = b->left->asTemp()) + candidates.append(*lt); + if (Temp *rt = b->right->asTemp()) + candidates.append(*rt); + } } else if (Unop *u = m->source->asUnop()) { if (u->op == OpCompl || u->op == OpUPlus) { if (Temp *t = u->expr->asTemp()) diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp index b1ec4b709c..d24a1a4f20 100644 --- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp +++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp @@ -3609,8 +3609,8 @@ void tst_QJSEngine::intConversion_QTBUG43309() QJSEngine engine; QString jsCode = "var n = 0.1; var m = (n*255) | 0; m"; QJSValue result = engine.evaluate( jsCode ); -// QVERIFY(result.isNumber()); -// QCOMPARE(result.toNumber(), 25.0); + QVERIFY(result.isNumber()); + QCOMPARE(result.toNumber(), 25.0); } QTEST_MAIN(tst_QJSEngine) |