summaryrefslogtreecommitdiffstats
path: root/src/declarative
diff options
context:
space:
mode:
authorBea Lam <bea.lam@nokia.com>2009-11-08 22:55:59 (GMT)
committerBea Lam <bea.lam@nokia.com>2009-11-08 22:55:59 (GMT)
commit2fb5889ea55209528fd19b7a34faac7c5be2b1b4 (patch)
tree9d17ae663848ccb5bb64c51b2e9ef8d50aea82d1 /src/declarative
parentc4bc9a635bf0fd42e80e570909e204ae24b303b2 (diff)
downloadQt-2fb5889ea55209528fd19b7a34faac7c5be2b1b4.zip
Qt-2fb5889ea55209528fd19b7a34faac7c5be2b1b4.tar.gz
Qt-2fb5889ea55209528fd19b7a34faac7c5be2b1b4.tar.bz2
Fix crash when watch is deleted before calling removeWatch().
Diffstat (limited to 'src/declarative')
-rw-r--r--src/declarative/debugger/qmldebug.cpp12
-rw-r--r--src/declarative/debugger/qmldebug_p.h2
2 files changed, 13 insertions, 1 deletions
diff --git a/src/declarative/debugger/qmldebug.cpp b/src/declarative/debugger/qmldebug.cpp
index b06a250..1403ffa 100644
--- a/src/declarative/debugger/qmldebug.cpp
+++ b/src/declarative/debugger/qmldebug.cpp
@@ -69,6 +69,7 @@ public:
void decode(QDataStream &, QmlDebugContextReference &);
void decode(QDataStream &, QmlDebugObjectReference &, bool simple);
+
static void remove(QmlEngineDebug *, QmlDebugEnginesQuery *);
static void remove(QmlEngineDebug *, QmlDebugRootContextQuery *);
static void remove(QmlEngineDebug *, QmlDebugObjectQuery *);
@@ -133,6 +134,7 @@ void QmlEngineDebugPrivate::remove(QmlEngineDebug *c, QmlDebugExpressionQuery *q
p->expressionQuery.remove(q->m_queryId);
}
+
Q_DECLARE_METATYPE(QmlDebugObjectReference);
void QmlEngineDebugPrivate::decode(QDataStream &ds, QmlDebugObjectReference &o,
bool simple)
@@ -345,6 +347,7 @@ QmlDebugPropertyWatch *QmlEngineDebug::addWatch(const QmlDebugPropertyReference
if (d->client->isConnected()) {
int queryId = d->getId();
watch->m_queryId = queryId;
+ watch->m_client = this;
watch->m_objectDebugId = property.objectDebugId();
watch->m_name = property.name();
d->watched.insert(queryId, watch);
@@ -373,6 +376,7 @@ QmlDebugObjectExpressionWatch *QmlEngineDebug::addWatch(const QmlDebugObjectRefe
if (d->client->isConnected()) {
int queryId = d->getId();
watch->m_queryId = queryId;
+ watch->m_client = this;
watch->m_objectDebugId = object.debugId();
watch->m_expr = expr;
d->watched.insert(queryId, watch);
@@ -395,6 +399,7 @@ QmlDebugWatch *QmlEngineDebug::addWatch(const QmlDebugObjectReference &object, Q
if (d->client->isConnected()) {
int queryId = d->getId();
watch->m_queryId = queryId;
+ watch->m_client = this;
watch->m_objectDebugId = object.debugId();
d->watched.insert(queryId, watch);
@@ -544,8 +549,13 @@ QmlDebugExpressionQuery *QmlEngineDebug::queryExpressionResult(int objectDebugId
}
QmlDebugWatch::QmlDebugWatch(QObject *parent)
-: QObject(parent), m_state(Waiting), m_queryId(-1), m_objectDebugId(-1)
+: QObject(parent), m_state(Waiting), m_queryId(-1), m_client(0), m_objectDebugId(-1)
+{
+}
+
+QmlDebugWatch::~QmlDebugWatch()
{
+ m_client->removeWatch(this);
}
int QmlDebugWatch::queryId() const
diff --git a/src/declarative/debugger/qmldebug_p.h b/src/declarative/debugger/qmldebug_p.h
index d7e4f5a..4bc54e8 100644
--- a/src/declarative/debugger/qmldebug_p.h
+++ b/src/declarative/debugger/qmldebug_p.h
@@ -106,6 +106,7 @@ public:
enum State { Waiting, Active, Inactive, Dead };
QmlDebugWatch(QObject *);
+ ~QmlDebugWatch();
int queryId() const;
int objectDebugId() const;
@@ -125,6 +126,7 @@ private:
void setState(State);
State m_state;
int m_queryId;
+ QmlEngineDebug *m_client;
int m_objectDebugId;
};