aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/util/qquickpropertychanges.cpp
diff options
context:
space:
mode:
authorMichael Brasser <michael.brasser@nokia.com>2012-04-26 16:12:21 +1000
committerQt by Nokia <qt-info@nokia.com>2012-05-01 06:07:00 +0200
commit462edd23f953af6ce37d1c42400e2cb4443f5a24 (patch)
treeef505e16ad6e7a439a6217da191fdaac6d9eda3c /src/quick/util/qquickpropertychanges.cpp
parent7cecad76b6a8beb31c74111b986be0e67bb2e15c (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.cpp48
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();
}