diff options
author | Duncan Cunningham <[email protected]> | 2013-07-31 17:12:24 -0500 |
---|---|---|
committer | The Qt Project <[email protected]> | 2013-08-05 17:00:05 +0200 |
commit | ce65fb47ed53d8ce2a00cdd399bbe8a28c4fb10d (patch) | |
tree | 06baeaa3f2182bf6e856151e591f00d7629ec017 /src/qml/debugger/qqmldebugservice.cpp | |
parent | 0316506d9ddbc3ca9f26f880b9e7fb5d5b0fec36 (diff) |
Fix crash in QQmlDebugService::objectForLocationInfo()
Fixed crash in QQmlDebugService::objectForLocationInfo() where it
was using QObject pointers in the object reference id hash
table that had been deleted. Now objectForLocationInfo() checks if
the QObject has been deleted and removes it from the object
reference hash before trying to look up the filename, line number,
and column number.
Change-Id: Iba7be7c490e97a2e7685685b0c6e501cfe1e833e
Reviewed-by: Alan Alpert (Personal) <[email protected]>
Reviewed-by: Aurindam Jana <[email protected]>
Diffstat (limited to 'src/qml/debugger/qqmldebugservice.cpp')
-rw-r--r-- | src/qml/debugger/qqmldebugservice.cpp | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/src/qml/debugger/qqmldebugservice.cpp b/src/qml/debugger/qqmldebugservice.cpp index f9a8090da2..f036dd9d69 100644 --- a/src/qml/debugger/qqmldebugservice.cpp +++ b/src/qml/debugger/qqmldebugservice.cpp @@ -215,25 +215,25 @@ QList<QObject*> QQmlDebugService::objectForLocationInfo(const QString &filename, { ObjectReferenceHash *hash = objectReferenceHash(); QList<QObject*> objects; - QHash<int, QObject *>::Iterator iter; - for (iter = hash->ids.begin(); iter != hash->ids.end(); ++iter) { - QQmlData *ddata = QQmlData::get(iter.value()); - if (!ddata || !ddata->outerContext) - continue; - //column number may be different due to qmlrewriter - if (QFileInfo(ddata->outerContext->urlString).fileName() == filename && - ddata->lineNumber == lineNumber && - ddata->columnNumber >= columnNumber) { - QHash<QObject *, ObjectReference>::Iterator objIter = - hash->objects.find(*iter); - Q_ASSERT(objIter != hash->objects.end()); - - if (objIter->object == 0) { - hash->ids.erase(iter); - hash->objects.erase(objIter); - } else { - objects << *iter; + QHash<int, QObject *>::Iterator iter = hash->ids.begin(); + while (iter != hash->ids.end()) { + QHash<QObject *, ObjectReference>::Iterator objIter = + hash->objects.find(*iter); + Q_ASSERT(objIter != hash->objects.end()); + + if (objIter->object == 0) { + iter = hash->ids.erase(iter); + hash->objects.erase(objIter); + } else { + QQmlData *ddata = QQmlData::get(iter.value()); + if (ddata && ddata->outerContext) { + if (QFileInfo(ddata->outerContext->urlString).fileName() == filename && + ddata->lineNumber == lineNumber && + ddata->columnNumber >= columnNumber) { + objects << *iter; + } } + ++iter; } } return objects; |