From 2780ff6f2281c5e0bfe79a3f3e15abae18f008f4 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 1 Mar 2011 19:16:24 +0100 Subject: [PATCH] debugger: refactor watch point lookup In preparation of bitfield watch points. --- src/plugins/debugger/breakhandler.cpp | 25 +++++-------------------- src/plugins/debugger/breakhandler.h | 4 +--- src/plugins/debugger/breakpoint.cpp | 3 ++- src/plugins/debugger/breakpoint.h | 3 +++ src/plugins/debugger/watchhandler.cpp | 16 ++++++++++------ src/plugins/debugger/watchwindow.cpp | 10 +++++++++- 6 files changed, 30 insertions(+), 31 deletions(-) diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index 4a74896f74c..81109826f48 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -240,33 +240,18 @@ const BreakpointParameters &BreakHandler::breakpointData(BreakpointId id) const return it->data; } -BreakpointId BreakHandler::findWatchpointByAddress(quint64 address) const +BreakpointId BreakHandler::findWatchpoint(const BreakpointParameters &data) const { ConstIterator it = m_storage.constBegin(), et = m_storage.constEnd(); for ( ; it != et; ++it) - if (it->data.isWatchpoint() && it->data.address == address) + if (it->data.isWatchpoint() + && it->data.address == data.address + && it->data.size == data.size + && it->data.bitpos == data.bitpos) return it.key(); return BreakpointId(); } -void BreakHandler::setWatchpointByAddress(quint64 address) -{ - const int id = findWatchpointByAddress(address); - if (id) { - qDebug() << "WATCHPOINT EXISTS"; - // removeBreakpoint(index); - return; - } - BreakpointParameters data(Watchpoint); - data.address = address; - appendBreakpoint(data); -} - -bool BreakHandler::hasWatchpointAt(quint64 address) const -{ - return findWatchpointByAddress(address); -} - void BreakHandler::saveBreakpoints() { const QString one = _("1"); diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h index 4c191953a71..ce3cbfdbb8a 100644 --- a/src/plugins/debugger/breakhandler.h +++ b/src/plugins/debugger/breakhandler.h @@ -80,12 +80,10 @@ public: // Find a breakpoint matching approximately the data in needle. BreakpointId findSimilarBreakpoint(const BreakpointResponse &needle) const; BreakpointId findBreakpointByNumber(int bpNumber) const; - BreakpointId findWatchpointByAddress(quint64 address) const; + BreakpointId findWatchpoint(const BreakpointParameters &data) const; BreakpointId findBreakpointByFunction(const QString &functionName) const; BreakpointId findBreakpointByIndex(const QModelIndex &index) const; BreakpointIds findBreakpointsByIndex(const QList &list) const; - void setWatchpointByAddress(quint64 address); - bool hasWatchpointAt(quint64 address) const; void updateMarkers(); static QIcon breakpointIcon(); diff --git a/src/plugins/debugger/breakpoint.cpp b/src/plugins/debugger/breakpoint.cpp index 7dd21a7bc87..36530bd3d85 100644 --- a/src/plugins/debugger/breakpoint.cpp +++ b/src/plugins/debugger/breakpoint.cpp @@ -53,7 +53,8 @@ namespace Internal { BreakpointParameters::BreakpointParameters(BreakpointType t) : type(t), enabled(true), pathUsage(BreakpointPathUsageEngineDefault), - ignoreCount(0), lineNumber(0), address(0), threadSpec(-1), + ignoreCount(0), lineNumber(0), address(0), size(0), + bitpos(0), bitsize(0), threadSpec(-1), tracepoint(false) {} diff --git a/src/plugins/debugger/breakpoint.h b/src/plugins/debugger/breakpoint.h index 722adbacc50..92af630ea99 100644 --- a/src/plugins/debugger/breakpoint.h +++ b/src/plugins/debugger/breakpoint.h @@ -107,6 +107,9 @@ public: int ignoreCount; //!< Ignore count associated with breakpoint. int lineNumber; //!< Line in source file. quint64 address; //!< Address for watchpoints. + uint size; //!< Size of watched area for watchpoints. + uint bitpos; //!< Location of watched bitfield within watched area. + uint bitsize; //!< Size of watched bitfield within watched area. int threadSpec; //!< Thread specification. QString functionName; QString module; //!< module for file name diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 2b895963ed6..2fe3481810d 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -724,17 +724,21 @@ QVariant WatchModel::data(const QModelIndex &idx, int role) const return pointerValue(data.value); return QVariant(quint64(0)); - case LocalsIsWatchpointAtAddressRole: - return engine()->breakHandler() - ->hasWatchpointAt(data.coreAddress()); + case LocalsIsWatchpointAtAddressRole: { + BreakpointParameters bp(Watchpoint); + bp.address = data.coreAddress(); + return engine()->breakHandler()->findWatchpoint(bp) != 0; + } case LocalsAddressRole: return data.coreAddress(); case LocalsIsWatchpointAtPointerValueRole: - if (isPointerType(data.type)) - return engine()->breakHandler() - ->hasWatchpointAt(pointerValue(data.value)); + if (isPointerType(data.type)) { + BreakpointParameters bp(Watchpoint); + bp.address = pointerValue(data.value); + return engine()->breakHandler()->findWatchpoint(bp) != 0; + } return false; default: diff --git a/src/plugins/debugger/watchwindow.cpp b/src/plugins/debugger/watchwindow.cpp index 430fb96eff9..deb6a737c04 100644 --- a/src/plugins/debugger/watchwindow.cpp +++ b/src/plugins/debugger/watchwindow.cpp @@ -654,7 +654,15 @@ void WatchWindow::setModelData void WatchWindow::setWatchpoint(quint64 address) { - breakHandler()->setWatchpointByAddress(address); + BreakpointParameters data(Watchpoint); + data.address = address; + BreakpointId id = breakHandler()->findWatchpoint(data); + if (id) { + qDebug() << "WATCHPOINT EXISTS"; + // removeBreakpoint(index); + return; + } + breakHandler()->appendBreakpoint(data); } } // namespace Internal