diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index e0428f8cf5642d1986b7ffe53b4c602bff530d01..88c17306e59f80a547bb2c68df3dc52532832637 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -65,6 +65,8 @@ BreakHandler::BreakHandler(Debugger::DebuggerEngine *engine) //m_emptyIcon(_(":/debugger/images/debugger_empty_14.png")), m_watchpointIcon(_(":/debugger/images/watchpoint.png")), m_engine(engine), + m_bp(0), + m_masterList(false), m_lastFound(0), m_lastFoundQueried(false) { @@ -73,6 +75,11 @@ BreakHandler::BreakHandler(Debugger::DebuggerEngine *engine) BreakHandler::~BreakHandler() { + if (m_bp && m_masterList) { + qDeleteAll(*m_bp); + m_bp->clear(); + delete m_bp; + } clear(); } @@ -97,20 +104,20 @@ bool BreakHandler::hasPendingBreakpoints() const BreakpointData *BreakHandler::at(int index) const { QTC_ASSERT(index < size(), return 0); - return m_bp.at(index); + QTC_ASSERT(m_bp,/**/); + return m_bp->at(index); } void BreakHandler::removeAt(int index) { + QTC_ASSERT(m_bp,/**/); BreakpointData *data = at(index); - m_bp.removeAt(index); + m_bp->removeAt(index); delete data; } void BreakHandler::clear() { - qDeleteAll(m_bp); - m_bp.clear(); m_enabled.clear(); m_disabled.clear(); m_removed.clear(); @@ -119,9 +126,10 @@ void BreakHandler::clear() BreakpointData *BreakHandler::findSimilarBreakpoint(const BreakpointData *needle) const { + QTC_ASSERT(m_bp, /**/); // Search a breakpoint we might refer to. for (int index = 0; index != size(); ++index) { - BreakpointData *data = m_bp[index]; + BreakpointData *data = (*m_bp)[index]; if (data->isSimilarTo(needle)) return data; } @@ -516,8 +524,9 @@ void BreakHandler::reinsertBreakpoint(BreakpointData *data) void BreakHandler::append(BreakpointData *data) { + QTC_ASSERT(m_bp,/**/); data->m_handler = this; - m_bp.append(data); + m_bp->append(data); m_inserted.append(data); } @@ -554,8 +563,9 @@ Breakpoints BreakHandler::takeDisabledBreakpoints() void BreakHandler::removeBreakpointHelper(int index) { - BreakpointData *data = m_bp.at(index); - m_bp.removeAt(index); + QTC_ASSERT(m_bp,/**/); + BreakpointData *data = m_bp->at(index); + m_bp->removeAt(index); data->removeMarker(); m_removed.append(data); } @@ -570,7 +580,8 @@ void BreakHandler::removeBreakpoint(int index) void BreakHandler::removeBreakpoint(BreakpointData *data) { - removeBreakpointHelper(m_bp.indexOf(data)); + QTC_ASSERT(m_bp,/**/); + removeBreakpointHelper(m_bp->indexOf(data)); emit layoutChanged(); } @@ -614,7 +625,8 @@ void BreakHandler::removeAllBreakpoints() BreakpointData *BreakHandler::findBreakpoint(quint64 address) const { - foreach (BreakpointData *data, m_bp) + QTC_ASSERT(m_bp,/**/); + foreach (BreakpointData *data, *m_bp) if (data->address == address) return data; return 0; @@ -623,7 +635,8 @@ BreakpointData *BreakHandler::findBreakpoint(quint64 address) const BreakpointData *BreakHandler::findBreakpoint(const QString &fileName, int lineNumber, bool useMarkerPosition) { - foreach (BreakpointData *data, m_bp) + QTC_ASSERT(m_bp,/**/); + foreach (BreakpointData *data, *m_bp) if (data->isLocatedAt(fileName, lineNumber, useMarkerPosition)) return data; return 0; @@ -633,15 +646,14 @@ void BreakHandler::toggleBreakpoint(const QString &fileName, int lineNumber, quint64 address /* = 0 */) { BreakpointData *data = 0; - do { - if (address) { - data = findBreakpoint(address); - break; - } + + if (address) { + data = findBreakpoint(address); + } else { data = findBreakpoint(fileName, lineNumber, true); if (!data) data = findBreakpoint(fileName, lineNumber, false); - } while (false); + } if (data) { removeBreakpoint(data); @@ -667,9 +679,19 @@ void BreakHandler::saveSessionData() saveBreakpoints(); } +void BreakHandler::initMasterList() +{ + if (m_bp) { + delete m_bp; + } + m_masterList = true; + m_bp = new Breakpoints; +} + void BreakHandler::loadSessionData() { QTC_ASSERT(m_engine->isSessionEngine(), return); + initMasterList(); loadBreakpoints(); updateMarkers(); } @@ -697,23 +719,33 @@ bool BreakHandler::isActive() const return m_engine->isActive(); } +bool BreakHandler::isMasterList() const +{ + return m_masterList; +} + void BreakHandler::initializeFromTemplate(BreakHandler *other) { - QTC_ASSERT(m_bp.isEmpty(), /**/); - foreach (BreakpointData *data, other->m_bp) { - append(data->clone()); - data->removeMarker(); + QTC_ASSERT(other->isMasterList(), /**/); + QTC_ASSERT(!isMasterList(), /**/); + QTC_ASSERT(other->m_bp,/**/); + + m_bp = other->m_bp; + foreach(BreakpointData *data, *m_bp) { + if (m_engine->acceptsBreakpoint(data)) + data->m_handler = this; } - updateMarkers(); + } void BreakHandler::storeToTemplate(BreakHandler *other) { - other->removeAllBreakpoints(); - foreach (const BreakpointData *data, m_bp) - other->append(data->clone()); - removeAllBreakpoints(); - other->updateMarkers(); + QTC_ASSERT(m_bp,/**/); + foreach (BreakpointData *data, *m_bp) { + data->m_handler = other; + } + m_bp = 0; + other->saveSessionData(); } diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h index 9a9aa30289c79e498f5d249e9b5c8fe21756988e..26e4e0eea6e478fb17bcfa7ba4c6fd77dca10444 100644 --- a/src/plugins/debugger/breakhandler.h +++ b/src/plugins/debugger/breakhandler.h @@ -64,11 +64,11 @@ public: QAbstractItemModel *model() { return this; } BreakpointData *at(int index) const; - int size() const { return m_bp.size(); } + int size() const { return m_bp?m_bp->size():0; } bool hasPendingBreakpoints() const; void removeAt(int index); // This also deletes the marker. void clear(); // This also deletes all the marker. - int indexOf(BreakpointData *data) { return m_bp.indexOf(data); } + int indexOf(BreakpointData *data) { return m_bp?m_bp->indexOf(data):-1; } // Find a breakpoint matching approximately the data in needle. BreakpointData *findSimilarBreakpoint(const BreakpointData *needle) const; BreakpointData *findBreakpointByNumber(int bpNumber) const; @@ -76,6 +76,7 @@ public: bool watchPointAt(quint64 address) const; void updateMarkers(); bool isActive() const; + bool isMasterList() const; Breakpoints insertedBreakpoints() const; void takeInsertedBreakPoint(BreakpointData *); @@ -121,6 +122,8 @@ private: void removeBreakpointHelper(int index); void append(BreakpointData *data); + void initMasterList(); + const QIcon m_breakpointIcon; const QIcon m_disabledBreakpointIcon; const QIcon m_pendingBreakPointIcon; @@ -128,12 +131,14 @@ private: const QIcon m_watchpointIcon; Debugger::DebuggerEngine *m_engine; // Not owned. - Breakpoints m_bp; + Breakpoints *m_bp; Breakpoints m_inserted; // Lately inserted breakpoints. Breakpoints m_removed; // Lately removed breakpoints. Breakpoints m_enabled; // Lately enabled breakpoints. Breakpoints m_disabled; // Lately disabled breakpoints. + bool m_masterList; + // Hack for BreakWindow::findSimilarBreakpoint mutable BreakpointData *m_lastFound; mutable bool m_lastFoundQueried; diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index 59a77d55cc0a075a20e183fdf206193a3ad5f135..39ab69eb98ab68d0f875f06016690ccca389dde4 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -1696,6 +1696,11 @@ void DebuggerEngine::attemptBreakpointSynchronization() { } +bool DebuggerEngine::acceptsBreakpoint(const BreakpointData *) +{ + return true; +} + void DebuggerEngine::selectThread(int) { } diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h index 2753a6545b0704551bfb1497d7bf3bb43814295c..199d7c6626060fde3456a0879b6c4ce42c423d10 100644 --- a/src/plugins/debugger/debuggerengine.h +++ b/src/plugins/debugger/debuggerengine.h @@ -130,6 +130,7 @@ class StackFrame; class SourceFilesHandler; class ThreadsHandler; class WatchHandler; +class BreakpointData; struct WatchUpdateFlags { @@ -183,6 +184,7 @@ public: virtual void updateAll(); virtual void attemptBreakpointSynchronization(); + virtual bool acceptsBreakpoint(const Internal::BreakpointData *); virtual void selectThread(int index); virtual void assignValueInDebugger(const Internal::WatchData *w, const QString &expr, const QVariant &value); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index b00dbc9287266ff3cff28fa0ad933fabfa2f3f8e..14b0400a893233b2f321d0102f847715a639480f 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -2608,6 +2608,11 @@ void GdbEngine::attemptBreakpointSynchronization() handler->updateMarkers(); } +bool GdbEngine::acceptsBreakpoint(const Internal::BreakpointData *br) +{ + return !( br->fileName.endsWith(QLatin1String("js")) || br->fileName.endsWith(QLatin1String("qml")) ); +} + ////////////////////////////////////////////////////////////////////// // diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index 210b1c678174aa3c5dcc80a4395f55faf1a03844..bc9a357af7fd5c43bae0477e26983241b2efae2e 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -309,6 +309,7 @@ private: ////////// Inferior Management ////////// // This should be always the last call in a function. Q_SLOT virtual void attemptBreakpointSynchronization(); + bool acceptsBreakpoint(const Internal::BreakpointData *br); virtual void executeStep(); virtual void executeStepOut(); diff --git a/src/plugins/debugger/qml/qmlcppengine.cpp b/src/plugins/debugger/qml/qmlcppengine.cpp index 90489310c9bc1ee953f98fc4ecf5482f1dbe1862..6b232a69e57b20c201bef26686c3af64d47c10d6 100644 --- a/src/plugins/debugger/qml/qmlcppengine.cpp +++ b/src/plugins/debugger/qml/qmlcppengine.cpp @@ -222,6 +222,11 @@ void QmlCppEngine::attemptBreakpointSynchronization() static_cast<DebuggerEngine*>(d->m_qmlEngine)->attemptBreakpointSynchronization(); } +bool QmlCppEngine::acceptsBreakpoint(const Internal::BreakpointData *br) +{ + return d->m_cppEngine->acceptsBreakpoint(br) || d->m_qmlEngine->acceptsBreakpoint(br); +} + void QmlCppEngine::selectThread(int index) { d->m_cppEngine->selectThread(index); diff --git a/src/plugins/debugger/qml/qmlcppengine.h b/src/plugins/debugger/qml/qmlcppengine.h index 9bdf2a6781bf399f5cea19b7766b805735a62e43..d3bb72056d3c4c65e5a94925e1f55b907c58e372 100644 --- a/src/plugins/debugger/qml/qmlcppengine.h +++ b/src/plugins/debugger/qml/qmlcppengine.h @@ -52,6 +52,7 @@ public: virtual void updateAll(); virtual void attemptBreakpointSynchronization(); + virtual bool acceptsBreakpoint(const Internal::BreakpointData *br); virtual void selectThread(int index); virtual void assignValueInDebugger(const Internal::WatchData *w, const QString &expr, const QVariant &value); diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index a0b2be774689582a77551da5549c1afa28701cc4..be920e5dc9dff0678bd4f91d7744b42a1f6df7ec 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -460,6 +460,11 @@ void QmlEngine::attemptBreakpointSynchronization() } } +bool QmlEngine::acceptsBreakpoint(const Internal::BreakpointData *br) +{ + return (br->fileName.endsWith(QLatin1String("qml")) || br->fileName.endsWith(QLatin1String("js"))); +} + void QmlEngine::loadSymbols(const QString &moduleName) { Q_UNUSED(moduleName) diff --git a/src/plugins/debugger/qml/qmlengine.h b/src/plugins/debugger/qml/qmlengine.h index 5f12e25eee55ca3ac3e68ae40437339517b111c0..6a4c9c639b2316f7d1e49a5483b2c083e2f589b5 100644 --- a/src/plugins/debugger/qml/qmlengine.h +++ b/src/plugins/debugger/qml/qmlengine.h @@ -93,6 +93,7 @@ private: void selectThread(int index); void attemptBreakpointSynchronization(); + bool acceptsBreakpoint(const Internal::BreakpointData *br); void assignValueInDebugger(const Internal::WatchData *w, const QString &expr, const QVariant &value); void loadSymbols(const QString &moduleName);