From 29d988d113aac1a193d3af6247a6e8231f3f3c9e Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Thu, 4 Aug 2011 12:00:53 +1000 Subject: Don't release register prematurely Task-number: QTBUG-20648 --- src/declarative/qml/qdeclarativecompiledbindings.cpp | 5 ++--- .../declarative/qdeclarativeecmascript/data/qtbug_20648.qml | 7 +++++++ .../qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp | 10 ++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 tests/auto/declarative/qdeclarativeecmascript/data/qtbug_20648.qml 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" -- cgit v0.12