diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h index 6273a319ea888760c24661c7dd9a2d854405e54f..6b758345e468dc3929ab75a886f3cb3e1bc157cb 100644 --- a/src/plugins/debugger/debuggerengine.h +++ b/src/plugins/debugger/debuggerengine.h @@ -244,6 +244,9 @@ public: bool isMasterEngine() const; DebuggerEngine *masterEngine() const; + virtual bool prepareForQmlBreak() { return false; } + virtual void handlePrepareForQmlBreak() {} + signals: void stateChanged(const DebuggerState &state); void updateViewsRequested(); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 1b29301395aedb44980d8586228377b055eda5fc..fe7a3adee6944315898e7766789cfe3b61de8df3 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -4502,6 +4502,24 @@ void GdbEngine::handleRemoteSetupFailed(const QString &message) m_gdbAdapter->handleRemoteSetupFailed(message); } +bool GdbEngine::prepareForQmlBreak() +{ + QTC_ASSERT(isSlaveEngine(), return false); + postCommand("-break-insert -t qscriptfunction.cpp:82", + NeedsStop, CB(handleQmlBreakpoint)); + return true; +} + +void GdbEngine::handleQmlBreakpoint(const GdbResponse &response) +{ + if (response.resultClass == GdbResultDone) { + qDebug() << "RESPONSE: " << response.toString(); + } + QTC_ASSERT(masterEngine(), return); + masterEngine()->handlePrepareForQmlBreak(); +} + + // // Factory // diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index ea356246f548857d9f06fe0069f8ca702fe00b44..d9ab60bf71e1894911a955a0cd1fef06ebf92905 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -517,6 +517,9 @@ private: ////////// View & Data Stuff ////////// void setLocals(const QList<GdbMi> &locals); void handleStackListArgumentsClassic(const GdbResponse &response); + bool prepareForQmlBreak(); + void handleQmlBreakpoint(const GdbResponse &response); + QSet<QByteArray> m_processedNames; // diff --git a/src/plugins/debugger/qml/qmlcppengine.cpp b/src/plugins/debugger/qml/qmlcppengine.cpp index 4acaa6ca425ec494e1038a6269bd6bf8bfc88855..4f106a981dc6e6cc07fc1fb55c875fedfa6ba62a 100644 --- a/src/plugins/debugger/qml/qmlcppengine.cpp +++ b/src/plugins/debugger/qml/qmlcppengine.cpp @@ -1,17 +1,11 @@ -#include "qmlcppengine.h" -#include "debuggerstartparameters.h" -#include "qmlengine.h" -#include "debuggermainwindow.h" -#include "debuggercore.h" -#include <qmljseditor/qmljseditorconstants.h> +#include "qmlcppengine.h" -#include <coreplugin/editormanager/editormanager.h> -#include <coreplugin/editormanager/ieditor.h> +#include "debuggercore.h" +#include "debuggerstartparameters.h" #include <utils/qtcassert.h> -#include <QtCore/QTimer> namespace Debugger { namespace Internal { @@ -63,7 +57,7 @@ QmlCppEngine::QmlCppEngine(const DebuggerStartParameters &sp) d->m_cppEngine = createGdbEngine(sp, this); } else { QString errorMessage; - d->m_cppEngine = Debugger::Internal::createCdbEngine(sp, this, &errorMessage); + d->m_cppEngine = createCdbEngine(sp, this, &errorMessage); if (!d->m_cppEngine) { qWarning("%s", qPrintable(errorMessage)); return; @@ -219,6 +213,18 @@ void QmlCppEngine::detachDebugger() } void QmlCppEngine::executeStep() +{ + if (d->m_activeEngine == d->m_qmlEngine) { + QTC_ASSERT(d->m_cppEngine->state() == InferiorRunOk, /**/); + if (d->m_cppEngine->prepareForQmlBreak()) + return; // Wait for call back. + } + + notifyInferiorRunRequested(); + d->m_activeEngine->executeStep(); +} + +void QmlCppEngine::handlePrepareForQmlBreak() { notifyInferiorRunRequested(); d->m_activeEngine->executeStep(); diff --git a/src/plugins/debugger/qml/qmlcppengine.h b/src/plugins/debugger/qml/qmlcppengine.h index 47723628dec2d633fb5cd37ff9703321ba8d82a5..f538da03bee42b0b42c534062d7c4ce0988bf5fc 100644 --- a/src/plugins/debugger/qml/qmlcppengine.h +++ b/src/plugins/debugger/qml/qmlcppengine.h @@ -94,6 +94,8 @@ private: void setState(DebuggerState newState, bool forced = false); void slaveEngineStateChanged(DebuggerEngine *slaveEngine, DebuggerState state); + virtual void handlePrepareForQmlBreak(); + private: QScopedPointer<QmlCppEnginePrivate> d; };