IR::BasicBlock *switchend = _function->newBasicBlock(exceptionHandler());
if (ast->block) {
- Result lhs = expression(ast->expression);
+ int lhs = _block->newTemp();
+ move(_block->TEMP(lhs), *expression(ast->expression));
IR::BasicBlock *switchcond = _function->newBasicBlock(exceptionHandler());
_block->JUMP(switchcond);
IR::BasicBlock *previousBlock = 0;
Result rhs = expression(clause->expression);
IR::BasicBlock *iftrue = blockMap[clause];
IR::BasicBlock *iffalse = _function->newBasicBlock(exceptionHandler());
- setLocation(cjump(binop(IR::OpStrictEqual, *lhs, *rhs), iftrue, iffalse), clause->caseToken);
+ setLocation(cjump(binop(IR::OpStrictEqual, _block->TEMP(lhs), *rhs), iftrue, iffalse), clause->caseToken);
_block = iffalse;
}
Result rhs = expression(clause->expression);
IR::BasicBlock *iftrue = blockMap[clause];
IR::BasicBlock *iffalse = _function->newBasicBlock(exceptionHandler());
- setLocation(cjump(binop(IR::OpStrictEqual, *lhs, *rhs), iftrue, iffalse), clause->caseToken);
+ setLocation(cjump(binop(IR::OpStrictEqual, _block->TEMP(lhs), *rhs), iftrue, iffalse), clause->caseToken);
_block = iffalse;
}
void qtbug_39520();
void readUnregisteredQObjectProperty();
void writeUnregisteredQObjectProperty();
+ void switchExpression();
private:
// static void propertyVarWeakRefCallback(v8::Persistent<v8::Value> object, void* parameter);
QCOMPARE(root->property("container").value<ObjectContainer*>()->mSetterCalled, true);
}
+void tst_qqmlecmascript::switchExpression()
+{
+ // verify that we evaluate the expression inside switch() exactly once
+ QJSEngine engine;
+ QJSValue v = engine.evaluate(QString::fromLatin1(
+ "var num = 0\n"
+ "var x = 0\n"
+ "function f() { ++num; return (Math.random() > 0.5) ? 0 : 1; }\n"
+ "for (var i = 0; i < 1000; ++i) {\n"
+ " switch (f()) {\n"
+ " case 0:\n"
+ " case 1:\n"
+ " break;\n"
+ " default:\n"
+ " ++x;\n"
+ " }\n"
+ "}\n"
+ "(x == 0 && num == 1000) ? true : false\n"
+ ));
+ QVERIFY(!v.isError());
+ QCOMPARE(v.toBool(), true);
+}
+
QTEST_MAIN(tst_qqmlecmascript)
#include "tst_qqmlecmascript.moc"