From d7f364f915cbbfd337e0b74c1d52545b053400fc Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 28 Jan 2015 10:20:01 +0100 Subject: [PATCH] Debugger: Generalize Locals&Expression tree item parsing An intermediate step to move the engines one by one to direct WatchItem construction. Change-Id: I563582498c4eeb3d604dfa046722133ab6d24650 Reviewed-by: hjk --- src/plugins/debugger/watchdata.cpp | 33 ++++++++++++++++++++++++------ src/plugins/debugger/watchdata.h | 12 +++++++++++ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/plugins/debugger/watchdata.cpp b/src/plugins/debugger/watchdata.cpp index 338c8e1f7cb..13ed74260d7 100644 --- a/src/plugins/debugger/watchdata.cpp +++ b/src/plugins/debugger/watchdata.cpp @@ -585,9 +585,11 @@ static void decodeArray(QList *list, const WatchData &tmplate, } } -void parseWatchData(const QSet &expandedINames, - const WatchData &data0, const GdbMi &item, - QList *list) +void parseChildrenData(const QSet &expandedINames, + const WatchData &data0, const GdbMi &item, + std::function itemHandler, + std::function &, const WatchData &, const GdbMi &)> childHandler, + std::function arrayDecoder) { //qDebug() << "HANDLE CHILDREN: " << data0.toString() << item.toString(); WatchData data = data0; @@ -640,7 +642,7 @@ void parseWatchData(const QSet &expandedINames, setWatchDataValueEditable(data, item["valueeditable"]); data.updateChildCount(item["numchild"]); //qDebug() << "\nAPPEND TO LIST: " << data.toString() << "\n"; - list->append(data); + itemHandler(data); bool ok = false; qulonglong addressBase = item["addrbase"].data().toULongLong(&ok, 0); @@ -657,7 +659,7 @@ void parseWatchData(const QSet &expandedINames, int encoding = item["arrayencoding"].toInt(); childtemplate.iname = data.iname + '.'; childtemplate.address = addressBase; - decodeArray(list, childtemplate, mi.data(), encoding); + arrayDecoder(childtemplate, mi.data(), encoding); } else { for (int i = 0, n = children.children().size(); i != n; ++i) { const GdbMi &child = children.children().at(i); @@ -687,11 +689,30 @@ void parseWatchData(const QSet &expandedINames, int encoding = child["keyencoded"].toInt(); data1.name = decodeData(key, encoding); } - parseWatchData(expandedINames, data1, child, list); + childHandler(expandedINames, data1, child); } } } +void parseWatchData(const QSet &expandedINames, + const WatchData &data0, const GdbMi &input, + QList *list) +{ + auto itemHandler = [list](const WatchData &data) { + list->append(data); + }; + auto childHandler = [list](const QSet &expandedINames, + const WatchData &innerData, const GdbMi &innerInput) { + parseWatchData(expandedINames, innerData, innerInput, list); + }; + auto arrayDecoder = [list](const WatchData &childTemplate, + const QByteArray &encodedData, int encoding) { + decodeArray(list, childTemplate, encodedData, encoding); + }; + + parseChildrenData(expandedINames, data0, input, itemHandler, childHandler, arrayDecoder); +} + } // namespace Internal } // namespace Debugger diff --git a/src/plugins/debugger/watchdata.h b/src/plugins/debugger/watchdata.h index 733d79974ab..55391d96ed2 100644 --- a/src/plugins/debugger/watchdata.h +++ b/src/plugins/debugger/watchdata.h @@ -34,6 +34,8 @@ #include #include +#include + namespace Debugger { namespace Internal { @@ -151,6 +153,16 @@ public: qint32 source; // Originated from dumper or symbol evaluation? (CDB only) }; +void parseChildrenData(const QSet &expandedINames, + const WatchData &parent, const GdbMi &child, + std::function itemHandler, + std::function &, + const WatchData &, + const GdbMi &)> childHandler, + std::function arrayDecoder); + void parseWatchData(const QSet &expandedINames, const WatchData &parent, const GdbMi &child, QList *insertions);