aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorAurindam Jana <[email protected]>2011-12-22 18:43:09 +0100
committerAurindam Jana <[email protected]>2012-01-09 10:53:19 +0100
commit641716bee3d91663de5d660c22fd27ffafaeeaa0 (patch)
tree89806db5eecabeac055e5838cec7d6d6207c3d0b /src/plugins
parentbcd9bbb6f5ff93895148db7d0db606aaebaebd76 (diff)
QmlDebugging: Implement RunToLine capability
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/debugger/qml/qmldebuggerclient.h3
-rw-r--r--src/plugins/debugger/qml/qmlengine.cpp13
-rw-r--r--src/plugins/debugger/qml/qmlv8debuggerclient.cpp31
-rw-r--r--src/plugins/debugger/qml/qmlv8debuggerclient.h2
-rw-r--r--src/plugins/debugger/qml/qscriptdebuggerclient.cpp24
-rw-r--r--src/plugins/debugger/qml/qscriptdebuggerclient.h2
6 files changed, 68 insertions, 7 deletions
diff --git a/src/plugins/debugger/qml/qmldebuggerclient.h b/src/plugins/debugger/qml/qmldebuggerclient.h
index 11eafe213cb..df93d70310d 100644
--- a/src/plugins/debugger/qml/qmldebuggerclient.h
+++ b/src/plugins/debugger/qml/qmldebuggerclient.h
@@ -34,6 +34,7 @@
#define QMLDEBUGGERCLIENT_H
#include "qmljsprivateapi.h"
+#include "debuggerengine.h"
namespace Debugger {
namespace Internal {
@@ -60,6 +61,8 @@ public:
virtual void executeNext() = 0;
virtual void executeStepI() = 0;
+ virtual void executeRunToLine(const ContextData &data) = 0;
+
virtual void continueInferior() = 0;
virtual void interruptInferior() = 0;
diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp
index d300f8685cd..4cad9eba62f 100644
--- a/src/plugins/debugger/qml/qmlengine.cpp
+++ b/src/plugins/debugger/qml/qmlengine.cpp
@@ -530,8 +530,13 @@ void QmlEngine::executeNextI()
void QmlEngine::executeRunToLine(const ContextData &data)
{
- Q_UNUSED(data)
- SDEBUG("FIXME: QmlEngine::executeRunToLine()");
+ QTC_ASSERT(state() == InferiorStopOk, qDebug() << state());
+ showStatusMessage(tr("Run to line %1 (%2) requested...").arg(data.lineNumber).arg(data.fileName), 5000);
+ resetLocation();
+ if (d->m_adapter.activeDebuggerClient())
+ d->m_adapter.activeDebuggerClient()->executeRunToLine(data);
+ notifyInferiorRunRequested();
+ notifyInferiorRunOk();
}
void QmlEngine::executeRunToFunction(const QString &functionName)
@@ -777,7 +782,9 @@ void QmlEngine::synchronizeWatchers()
unsigned QmlEngine::debuggerCapabilities() const
{
- return AddWatcherCapability|AddWatcherWhileRunningCapability;
+ return AddWatcherCapability
+ | AddWatcherWhileRunningCapability
+ | RunToLineCapability;
/*ReverseSteppingCapability | SnapshotCapability
| AutoDerefPointersCapability | DisassemblerCapability
| RegisterCapability | ShowMemoryCapability
diff --git a/src/plugins/debugger/qml/qmlv8debuggerclient.cpp b/src/plugins/debugger/qml/qmlv8debuggerclient.cpp
index b326a340b3e..03afa154ae0 100644
--- a/src/plugins/debugger/qml/qmlv8debuggerclient.cpp
+++ b/src/plugins/debugger/qml/qmlv8debuggerclient.cpp
@@ -138,6 +138,7 @@ public:
QmlEngine *engine;
QHash<BreakpointModelId, int> breakpoints;
QHash<int, BreakpointModelId> breakpointsSync;
+ QList<int> breakpointsTemp;
QScriptValue parser;
QScriptValue stringifier;
@@ -1019,6 +1020,19 @@ void QmlV8DebuggerClient::executeStepI()
d->continueDebugging(In);
}
+void QmlV8DebuggerClient::executeRunToLine(const ContextData &data)
+{
+ if (d->isOldService) {
+ d->setBreakpoint(QString(_(SCRIPT)), QFileInfo(data.fileName).fileName(),
+ data.lineNumber - 1);
+ } else {
+ d->setBreakpoint(QString(_(SCRIPTREGEXP)), QFileInfo(data.fileName).fileName(),
+ data.lineNumber - 1);
+ }
+ clearExceptionSelection();
+ d->continueDebugging(Continue);
+}
+
void QmlV8DebuggerClient::continueInferior()
{
clearExceptionSelection();
@@ -1282,11 +1296,16 @@ void QmlV8DebuggerClient::messageReceived(const QByteArray &data)
const QVariantMap breakpointData = resp.value(_(BODY)).toMap();
int index = breakpointData.value(_("breakpoint")).toInt();
- BreakpointModelId id = d->breakpointsSync.take(seq);
- d->breakpoints.insert(id, index);
+ if (d->breakpointsSync.contains(seq)) {
+ BreakpointModelId id = d->breakpointsSync.take(seq);
+ d->breakpoints.insert(id, index);
- if (d->engine->breakHandler()->state(id) != BreakpointInserted)
- d->engine->breakHandler()->notifyBreakpointInsertOk(id);
+ if (d->engine->breakHandler()->state(id) != BreakpointInserted)
+ d->engine->breakHandler()->notifyBreakpointInsertOk(id);
+
+ } else {
+ d->breakpointsTemp.append(index);
+ }
} else if (debugCommand == _(CHANGEBREAKPOINT)) {
@@ -1447,6 +1466,10 @@ void QmlV8DebuggerClient::messageReceived(const QByteArray &data)
}
if (d->engine->state() == InferiorRunOk) {
+ foreach (const QVariant &breakpointId, v8BreakpointIds) {
+ if (d->breakpointsTemp.contains(breakpointId.toInt()))
+ d->clearBreakpoint(breakpointId.toInt());
+ }
d->engine->inferiorSpontaneousStop();
d->backtrace();
} else if (d->engine->state() == InferiorStopOk) {
diff --git a/src/plugins/debugger/qml/qmlv8debuggerclient.h b/src/plugins/debugger/qml/qmlv8debuggerclient.h
index 944f1cda986..d663da15aef 100644
--- a/src/plugins/debugger/qml/qmlv8debuggerclient.h
+++ b/src/plugins/debugger/qml/qmlv8debuggerclient.h
@@ -73,6 +73,8 @@ public:
void executeNext();
void executeStepI();
+ void executeRunToLine(const ContextData &data);
+
void continueInferior();
void interruptInferior();
diff --git a/src/plugins/debugger/qml/qscriptdebuggerclient.cpp b/src/plugins/debugger/qml/qscriptdebuggerclient.cpp
index 19d6fe9285e..f8ad0c944f4 100644
--- a/src/plugins/debugger/qml/qscriptdebuggerclient.cpp
+++ b/src/plugins/debugger/qml/qscriptdebuggerclient.cpp
@@ -183,6 +183,17 @@ void QScriptDebuggerClient::executeStepI()
sendMessage(reply);
}
+void QScriptDebuggerClient::executeRunToLine(const ContextData &data)
+{
+ JSAgentBreakpointData bp;
+ bp.fileUrl = QUrl::fromLocalFile(data.fileName).toString().toUtf8();
+ bp.lineNumber = data.lineNumber;
+ bp.functionName = "TEMPORARY";
+ d->breakpoints.insert(bp);
+ synchronizeBreakpoints();
+ continueInferior();
+}
+
void QScriptDebuggerClient::continueInferior()
{
QByteArray reply;
@@ -398,6 +409,7 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
if (ideStackFrames.size() && ideStackFrames.back().function == QLatin1String("<global>"))
ideStackFrames.takeLast();
+
d->engine->stackHandler()->setFrames(ideStackFrames);
d->engine->watchHandler()->beginCycle();
@@ -478,6 +490,18 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
}
}
+ QList<JSAgentBreakpointData> breakpoints(d->breakpoints.toList());
+ foreach (const JSAgentBreakpointData &data, breakpoints) {
+ if (data.fileUrl == QUrl::fromLocalFile(file).toString().toUtf8() &&
+ data.lineNumber == line &&
+ data.functionName == "TEMPORARY") {
+ breakpoints.removeOne(data);
+ d->breakpoints = JSAgentBreakpoints::fromList(breakpoints);
+ synchronizeBreakpoints();
+ break;
+ }
+ }
+
d->logReceiveMessage(logString);
}
diff --git a/src/plugins/debugger/qml/qscriptdebuggerclient.h b/src/plugins/debugger/qml/qscriptdebuggerclient.h
index fe8b539db2e..ccae14680c9 100644
--- a/src/plugins/debugger/qml/qscriptdebuggerclient.h
+++ b/src/plugins/debugger/qml/qscriptdebuggerclient.h
@@ -59,6 +59,8 @@ public:
void executeNext();
void executeStepI();
+ void executeRunToLine(const ContextData &data);
+
void continueInferior();
void interruptInferior();