diff options
author | Ulf Hermann <ulf.hermann@theqtcompany.com> | 2015-07-13 15:09:42 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@theqtcompany.com> | 2015-07-21 08:33:27 +0000 |
commit | 4d581ceb1d589d603224733275995d14c795a8c9 (patch) | |
tree | bb59d15b92ea1ebdc71ec38f6cf62c7a1f79d8dc /src/qml/debugger/qqmlenginedebugservice.cpp | |
parent | 134d980a7fcf61c5440019bcfb3fdfc39c3f5f3c (diff) |
Simplify object/id lookup in QQmlDebugService
By tracking object destruction we can avoid looping over all cached
objects to find out which ones are still OK and we don't have to
manually clear the cache anymore. Looking up objects by source location
is specific to the engine debug service and should be done there.
Change-Id: I7dab73a7bf9c17087784f1bd9c5aef513b31e2c1
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
Diffstat (limited to 'src/qml/debugger/qqmlenginedebugservice.cpp')
-rw-r--r-- | src/qml/debugger/qqmlenginedebugservice.cpp | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/src/qml/debugger/qqmlenginedebugservice.cpp b/src/qml/debugger/qqmlenginedebugservice.cpp index 0a3ddc6db5..ac49d99f09 100644 --- a/src/qml/debugger/qqmlenginedebugservice.cpp +++ b/src/qml/debugger/qqmlenginedebugservice.cpp @@ -48,6 +48,7 @@ #include <QtCore/qdebug.h> #include <QtCore/qmetaobject.h> +#include <QtCore/qfileinfo.h> #include <private/qmetaobject_p.h> QT_BEGIN_NAMESPACE @@ -427,6 +428,27 @@ void QQmlEngineDebugService::messageReceived(const QByteArray &message) QMetaObject::invokeMethod(this, "processMessage", Qt::QueuedConnection, Q_ARG(QByteArray, message)); } +/*! + Returns a list of objects matching the given filename, line and column. +*/ +QList<QObject*> QQmlEngineDebugService::objectForLocationInfo(const QString &filename, + int lineNumber, int columnNumber) +{ + QList<QObject *> objects; + const QHash<int, QObject *> &hash = objectsForIds(); + for (QHash<int, QObject *>::ConstIterator i = hash.constBegin(); i != hash.constEnd(); ++i) { + QQmlData *ddata = QQmlData::get(i.value()); + if (ddata && ddata->outerContext) { + if (QFileInfo(ddata->outerContext->urlString()).fileName() == filename && + ddata->lineNumber == lineNumber && + ddata->columnNumber >= columnNumber) { + objects << i.value(); + } + } + } + return objects; +} + void QQmlEngineDebugService::processMessage(const QByteArray &message) { QQmlDebugStream ds(message); @@ -500,8 +522,7 @@ void QQmlEngineDebugService::processMessage(const QByteArray &message) ds >> file >> lineNumber >> columnNumber >> recurse >> dumpProperties; - QList<QObject*> objects = QQmlDebugService::objectForLocationInfo( - file, lineNumber, columnNumber); + QList<QObject*> objects = objectForLocationInfo(file, lineNumber, columnNumber); rs << QByteArray("FETCH_OBJECTS_FOR_LOCATION_R") << queryId << objects.count(); |