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/qml/qml/qqmlboundsignal_p.h | |
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/qml/qml/qqmlboundsignal_p.h')
-rw-r--r-- | src/qml/qml/qqmlboundsignal_p.h | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/qml/qml/qqmlboundsignal_p.h b/src/qml/qml/qqmlboundsignal_p.h index 7ce45aa646..3fb20a1290 100644 --- a/src/qml/qml/qqmlboundsignal_p.h +++ b/src/qml/qml/qqmlboundsignal_p.h @@ -57,20 +57,21 @@ #include <private/qqmlabstractexpression_p.h> #include <private/qqmljavascriptexpression_p.h> +#include <private/qqmlboundsignalexpressionpointer_p.h> #include <private/qqmlnotifier_p.h> #include <private/qflagpointer_p.h> +#include <private/qqmlrefcount_p.h> #include <private/qobject_p.h> QT_BEGIN_NAMESPACE -class Q_QML_PRIVATE_EXPORT QQmlBoundSignalExpression : public QQmlAbstractExpression, public QQmlJavaScriptExpression +class Q_QML_PRIVATE_EXPORT QQmlBoundSignalExpression : public QQmlAbstractExpression, public QQmlJavaScriptExpression, public QQmlRefCount { public: QQmlBoundSignalExpression(QQmlContextData *ctxt, QObject *scope, const QByteArray &expression, bool isRewritten, const QString &fileName, int line, int column); QQmlBoundSignalExpression(QQmlContextData *ctxt, QObject *scope, const QString &expression, bool isRewritten, const QString &fileName, int line, int column); - ~QQmlBoundSignalExpression(); // "inherited" from QQmlJavaScriptExpression. static QString expressionIdentifier(QQmlJavaScriptExpression *); @@ -87,6 +88,8 @@ public: QQmlEngine *engine() const { return context() ? context()->engine : 0; } private: + ~QQmlBoundSignalExpression(); + v8::Persistent<v8::Object> m_v8qmlscope; v8::Persistent<v8::Function> m_v8function; @@ -108,7 +111,8 @@ public: virtual int index() const = 0; virtual QQmlBoundSignalExpression *expression() const = 0; - virtual QQmlBoundSignalExpression *setExpression(QQmlBoundSignalExpression *) = 0; + virtual QQmlBoundSignalExpressionPointer setExpression(QQmlBoundSignalExpression *) = 0; + virtual QQmlBoundSignalExpressionPointer takeExpression(QQmlBoundSignalExpression *) = 0; virtual QObject *scope() = 0; void removeFromObject(); @@ -134,7 +138,8 @@ public: int index() const; QQmlBoundSignalExpression *expression() const; - QQmlBoundSignalExpression *setExpression(QQmlBoundSignalExpression *); + QQmlBoundSignalExpressionPointer setExpression(QQmlBoundSignalExpression *); + QQmlBoundSignalExpressionPointer takeExpression(QQmlBoundSignalExpression *); QObject *scope() { return *m_scope; } static void subscriptionCallback(QQmlNotifierEndpoint *e, void **); @@ -142,7 +147,7 @@ public: bool isEvaluating() const { return m_scope.flag(); } private: - QQmlBoundSignalExpression *m_expression; + QQmlBoundSignalExpressionPointer m_expression; QQmlBoundSignalParameters *m_params; // We store some flag bits in the following flag pointer. // m_scope:flag1 - m_isEvaluating |