summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/declarative/qml/qdeclarativecompiledbindings.cpp5
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/data/qtbug_20648.qml7
-rw-r--r--tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp10
3 files changed, 19 insertions, 3 deletions
diff --git a/src/declarative/qml/qdeclarativecompiledbindings.cpp b/src/declarative/qml/qdeclarativecompiledbindings.cpp
index 7f2cac2..51ffc10 100644
--- a/src/declarative/qml/qdeclarativecompiledbindings.cpp
+++ b/src/declarative/qml/qdeclarativecompiledbindings.cpp
@@ -2396,7 +2396,7 @@ bool QDeclarativeBindingCompilerPrivate::parseConditional(QDeclarativeJS::AST::N
skip.skip.reg = -1;
bytecode << skip;
- // Release to allow reuse of reg
+ // Release to allow reuse of reg in else path
releaseReg(ok.reg);
bytecode[skipIdx].skip.count = bytecode.count() - skipIdx - 1;
@@ -2406,8 +2406,7 @@ bool QDeclarativeBindingCompilerPrivate::parseConditional(QDeclarativeJS::AST::N
if (!parseExpression(expression->ko, ko)) return false;
if (ko.unknownType) return false;
- // Release to allow reuse of reg
- releaseReg(ko.reg);
+ // Do not release reg here, so that its ownership passes to the caller
bytecode[skipIdx2].skip.count = bytecode.count() - skipIdx2 - 1;
if (ok != ko)
diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_20648.qml b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_20648.qml
new file mode 100644
index 0000000..40f21ef
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeecmascript/data/qtbug_20648.qml
@@ -0,0 +1,7 @@
+import QtQuick 1.0
+
+QtObject {
+ property bool hd: true
+
+ property real test: ((hd ? 100 : 20) + 0)
+}
diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
index 71214a3..bf7c9a4 100644
--- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
+++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp
@@ -177,6 +177,7 @@ private slots:
void aliasWritesOverrideBindings();
void pushCleanContext();
void realToInt();
+ void qtbug_20648();
void include();
@@ -3090,6 +3091,15 @@ void tst_qdeclarativeecmascript::realToInt()
QCOMPARE(object->value(), int(8));
}
+void tst_qdeclarativeecmascript::qtbug_20648()
+{
+ QDeclarativeComponent component(&engine, TEST_FILE("qtbug_20648.qml"));
+ QObject *o = component.create();
+ QVERIFY(o != 0);
+ QCOMPARE(o->property("test").toInt(), 100);
+ delete o;
+}
+
QTEST_MAIN(tst_qdeclarativeecmascript)
#include "tst_qdeclarativeecmascript.moc"