From 1aef962e5ad98c7947d4316367e73d77917a4dac Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Fri, 14 Jan 2011 17:08:59 +0100
Subject: [PATCH] debugger: first shot at combined cpp/qml stepping

---
 src/plugins/debugger/debuggerengine.h     |  3 +++
 src/plugins/debugger/gdb/gdbengine.cpp    | 18 ++++++++++++++++
 src/plugins/debugger/gdb/gdbengine.h      |  3 +++
 src/plugins/debugger/qml/qmlcppengine.cpp | 26 ++++++++++++++---------
 src/plugins/debugger/qml/qmlcppengine.h   |  2 ++
 5 files changed, 42 insertions(+), 10 deletions(-)

diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h
index 6273a319ea8..6b758345e46 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 1b29301395a..fe7a3adee69 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 ea356246f54..d9ab60bf71e 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 4acaa6ca425..4f106a981dc 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 47723628dec..f538da03bee 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;
 };
-- 
GitLab