OSDN Git Service

debugger: first shot at combined cpp/qml stepping
authorhjk <qtc-committer@nokia.com>
Fri, 14 Jan 2011 16:08:59 +0000 (17:08 +0100)
committerhjk <qtc-committer@nokia.com>
Fri, 14 Jan 2011 16:09:18 +0000 (17:09 +0100)
src/plugins/debugger/debuggerengine.h
src/plugins/debugger/gdb/gdbengine.cpp
src/plugins/debugger/gdb/gdbengine.h
src/plugins/debugger/qml/qmlcppengine.cpp
src/plugins/debugger/qml/qmlcppengine.h

index 6273a31..6b75834 100644 (file)
@@ -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();
index 1b29301..fe7a3ad 100644 (file)
@@ -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
 //
index ea35624..d9ab60b 100644 (file)
@@ -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;
 
     //
index 4acaa6c..4f106a9 100644 (file)
@@ -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;
@@ -220,6 +214,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();
 }
index 4772362..f538da0 100644 (file)
@@ -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;
 };