diff options
author | Michael Brasser <michael.brasser@nokia.com> | 2012-04-26 16:12:21 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-05-01 06:07:00 +0200 |
commit | 462edd23f953af6ce37d1c42400e2cb4443f5a24 (patch) | |
tree | ef505e16ad6e7a439a6217da191fdaac6d9eda3c /src/quick/util/qquickpropertychanges.cpp | |
parent | 7cecad76b6a8beb31c74111b986be0e67bb2e15c (diff) |
More robust tracking of signal handler expression ownership.
Reference count the expressions, and improve testing.
Change-Id: I810509eae1c7608b367e9ff5f7891a294667a692
Reviewed-by: Chris Adams <christopher.adams@nokia.com>
Diffstat (limited to 'src/quick/util/qquickpropertychanges.cpp')
-rw-r--r-- | src/quick/util/qquickpropertychanges.cpp | 48 |
1 files changed, 9 insertions, 39 deletions
diff --git a/src/quick/util/qquickpropertychanges.cpp b/src/quick/util/qquickpropertychanges.cpp index 49df009af2..e2486d3a6c 100644 --- a/src/quick/util/qquickpropertychanges.cpp +++ b/src/quick/util/qquickpropertychanges.cpp @@ -139,44 +139,23 @@ QT_BEGIN_NAMESPACE class QQuickReplaceSignalHandler : public QQuickActionEvent { public: - QQuickReplaceSignalHandler() : expression(0), reverseExpression(0), - rewindExpression(0), ownedExpression(0), ownedExpressionWatcher(0) {} - ~QQuickReplaceSignalHandler() { - delete ownedExpression; - } + QQuickReplaceSignalHandler() {} + ~QQuickReplaceSignalHandler() {} virtual EventType type() const { return SignalHandler; } QQmlProperty property; - QQmlBoundSignalExpression *expression; - QQmlBoundSignalExpression *reverseExpression; - QQmlBoundSignalExpression *rewindExpression; - QQmlBoundSignalExpression *ownedExpression; - QQmlAbstractExpression::DeleteWatcher *ownedExpressionWatcher; // TODO: refactor the ownership impl. + QQmlBoundSignalExpressionPointer expression; + QQmlBoundSignalExpressionPointer reverseExpression; + QQmlBoundSignalExpressionPointer rewindExpression; virtual void execute(Reason) { - ownedExpression = QQmlPropertyPrivate::setSignalExpression(property, expression); - if (ownedExpression == expression) { - delete ownedExpressionWatcher; - ownedExpressionWatcher = 0; - ownedExpression = 0; - } else if (ownedExpression) { - delete ownedExpressionWatcher; - ownedExpressionWatcher = new QQmlAbstractExpression::DeleteWatcher(ownedExpression); - } + QQmlPropertyPrivate::setSignalExpression(property, expression); } virtual bool isReversable() { return true; } virtual void reverse(Reason) { - ownedExpression = QQmlPropertyPrivate::setSignalExpression(property, reverseExpression); - if (ownedExpression == reverseExpression) { - delete ownedExpressionWatcher; - ownedExpressionWatcher = 0; - ownedExpression = 0; - } else if (ownedExpression) { - delete ownedExpressionWatcher; - ownedExpressionWatcher = new QQmlAbstractExpression::DeleteWatcher(ownedExpression); - } + QQmlPropertyPrivate::setSignalExpression(property, reverseExpression); } virtual void saveOriginals() { @@ -192,18 +171,10 @@ public: if (rsh == this) return; reverseExpression = rsh->reverseExpression; - if (rsh->ownedExpression == reverseExpression) { - ownedExpression = rsh->ownedExpression; - rsh->ownedExpression = 0; - delete ownedExpressionWatcher; - ownedExpressionWatcher = new QQmlAbstractExpression::DeleteWatcher(ownedExpression); - } } virtual void rewind() { - ownedExpression = QQmlPropertyPrivate::setSignalExpression(property, rewindExpression); - if (ownedExpression == rewindExpression) - ownedExpression = 0; + QQmlPropertyPrivate::setSignalExpression(property, rewindExpression); } virtual void saveCurrentValues() { rewindExpression = QQmlPropertyPrivate::signalExpression(property); @@ -370,7 +341,7 @@ void QQuickPropertyChangesPrivate::decode() QQuickReplaceSignalHandler *handler = new QQuickReplaceSignalHandler; handler->property = prop; - handler->expression = new QQmlBoundSignalExpression(QQmlContextData::get(qmlContext(q)), object, expression, false, url.toString(), line, column); + handler->expression.take(new QQmlBoundSignalExpression(QQmlContextData::get(qmlContext(q)), object, expression, false, url.toString(), line, column)); signalReplacements << handler; } else if (isScript) { // binding QString expression = data.toString(); @@ -390,7 +361,6 @@ void QQuickPropertyChangesPrivate::decode() properties << qMakePair(name, data); } } - decoded = true; data.clear(); } |