diff --git a/src/plugins/debugger/disassembleragent.cpp b/src/plugins/debugger/disassembleragent.cpp index 5b5d148a5a762ba9dac80e9f5b9612bd0381a3b3..6d9e9c6336b58b79bbdc8a5e0dfb675b7fc49708 100644 --- a/src/plugins/debugger/disassembleragent.cpp +++ b/src/plugins/debugger/disassembleragent.cpp @@ -67,7 +67,7 @@ namespace Internal { /////////////////////////////////////////////////////////////////////// // -// DisassemblerAgent +// FrameKey // /////////////////////////////////////////////////////////////////////// @@ -86,38 +86,45 @@ public: bool FrameKey::matches(const Location &loc) const { return loc.address() >= startAddress - && loc.address() < endAddress - && loc.fileName() == fileName && loc.functionName() == functionName; + && loc.address() <= endAddress + && loc.fileName() == fileName + && loc.functionName() == functionName; } typedef QPair<FrameKey, DisassemblerLines> CacheEntry; + +/////////////////////////////////////////////////////////////////////// +// +// DisassemblerAgentPrivate +// +/////////////////////////////////////////////////////////////////////// + class DisassemblerAgentPrivate { public: DisassemblerAgentPrivate(); ~DisassemblerAgentPrivate(); void configureMimeType(); + DisassemblerLines contentsAtCurrentLocation() const; public: QPointer<TextEditor::ITextEditor> editor; Location location; - bool tryMixed; QPointer<DebuggerEngine> engine; ITextMark *locationMark; QList<ITextMark *> breakpointMarks; - QList<CacheEntry> cache; - QString mimeType; - bool m_resetLocationScheduled; + bool tryMixed; + bool resetLocationScheduled; }; DisassemblerAgentPrivate::DisassemblerAgentPrivate() : editor(0), - tryMixed(true), mimeType(_("text/x-qtcreator-generic-asm")), - m_resetLocationScheduled(false) + tryMixed(true), + resetLocationScheduled(false) { locationMark = new ITextMark; locationMark->setIcon(debuggerCore()->locationMarkIcon()); @@ -134,6 +141,23 @@ DisassemblerAgentPrivate::~DisassemblerAgentPrivate() delete locationMark; } +DisassemblerLines DisassemblerAgentPrivate::contentsAtCurrentLocation() const +{ + for (int i = 0, n = cache.size(); i != n; ++i) { + const CacheEntry &entry = cache.at(i); + if (entry.first.matches(location)) + return entry.second; + } + return DisassemblerLines(); +} + + +/////////////////////////////////////////////////////////////////////// +// +// DisassemblerAgent +// +/////////////////////////////////////////////////////////////////////// + /*! \class Debugger::Internal::DisassemblerAgent @@ -169,15 +193,15 @@ void DisassemblerAgent::cleanup() void DisassemblerAgent::scheduleResetLocation() { - d->m_resetLocationScheduled = true; + d->resetLocationScheduled = true; } void DisassemblerAgent::resetLocation() { if (!d->editor) return; - if (d->m_resetLocationScheduled) { - d->m_resetLocationScheduled = false; + if (d->resetLocationScheduled) { + d->resetLocationScheduled = false; d->editor->markableInterface()->removeMark(d->locationMark); } } @@ -216,7 +240,7 @@ void DisassemblerAgent::setLocation(const Location &loc) .arg(loc.functionName(), QDir::toNativeSeparators(loc.fileName())); d->engine->showMessage(msg); setContentsToEditor(d->cache.at(index).second); - d->m_resetLocationScheduled = false; // In case reset from previous run still pending. + d->resetLocationScheduled = false; // In case reset from previous run still pending. } else { d->engine->fetchDisassembler(this); } @@ -322,10 +346,7 @@ void DisassemblerAgent::setContentsToEditor(const DisassemblerLines &contents) void DisassemblerAgent::updateLocationMarker() { QTC_ASSERT(d->editor, return); - - const int index = indexOf(d->location); - const DisassemblerLines contents = index != -1 ? - d->cache.at(index).second : DisassemblerLines(); + const DisassemblerLines contents = d->contentsAtCurrentLocation(); int lineNumber = contents.lineForAddress(d->location.address()); if (d->location.needsMarker()) { d->editor->markableInterface()->removeMark(d->locationMark); @@ -353,9 +374,7 @@ void DisassemblerAgent::updateBreakpointMarkers() if (ids.isEmpty()) return; - const int index = indexOf(d->location); - const DisassemblerLines contents = index != -1 ? - d->cache.at(index).second : DisassemblerLines(); + const DisassemblerLines contents = d->contentsAtCurrentLocation(); foreach (TextEditor::ITextMark *marker, d->breakpointMarks) d->editor->markableInterface()->removeMark(marker); d->breakpointMarks.clear();