aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@digia.com>2014-12-18 10:24:22 +0100
committerErik Verbruggen <erik.verbruggen@theqtcompany.com>2014-12-18 12:12:31 +0100
commit7ee29f69918ef11b83f7ee6acc1fa9c508c9f4a3 (patch)
tree6208affc4abb174cd353fb69bc540f111bf5212c
parent87ac0d66abbe235e353fbe10dc864ebdc9904d41 (diff)
V4: only optimize out to-int32 conversions when the operands are int32.
The operands of bit-ops are not typed as int32 when no type-inference is done, like for the interpreter. Task-number: QTBUG-43309 Change-Id: I67af18e14ddbc0649530ac23601332ee7d7a1f34 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
-rw-r--r--src/qml/compiler/qv4ssa.cpp3
-rw-r--r--tests/auto/qml/qjsengine/tst_qjsengine.cpp12
2 files changed, 13 insertions, 2 deletions
diff --git a/src/qml/compiler/qv4ssa.cpp b/src/qml/compiler/qv4ssa.cpp
index d2222a0458..8b218492a9 100644
--- a/src/qml/compiler/qv4ssa.cpp
+++ b/src/qml/compiler/qv4ssa.cpp
@@ -4061,8 +4061,7 @@ void optimizeSSA(StatementWorklist &W, DefUses &defUses, DominatorTree &df)
default:
break;
}
- if (casted) {
- Q_ASSERT(casted->type == SInt32Type);
+ if (casted && casted->type == SInt32Type) {
m->source = casted;
W += m;
continue;
diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
index c43bd29614..b1ec4b709c 100644
--- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp
+++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
@@ -173,6 +173,8 @@ private slots:
void privateMethods();
+ void intConversion_QTBUG43309();
+
signals:
void testSignal();
};
@@ -3601,6 +3603,16 @@ void tst_QJSEngine::privateMethods()
}
}
+void tst_QJSEngine::intConversion_QTBUG43309()
+{
+ // This failed in the interpreter:
+ 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);
+}
+
QTEST_MAIN(tst_QJSEngine)
#include "tst_qjsengine.moc"