From 23f3fcbabc4959c5d05d821b25776f6344d9b42b Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 13 Oct 2015 16:58:04 +0200 Subject: QmlDebug: Split QV4::Debugging::Debugger ... into a pure interface and a QV4::Debugging::V4Debugger implementation. This is in preparation of a second implementation of this interface to be used with 'native mixed' debugging. Change-Id: I3078dcfe4bdee392a2d13ef43a55ca993e7b88d8 Reviewed-by: Ulf Hermann --- .../qmldbg_debugger/qv4datacollector.cpp | 7 +-- .../qmltooling/qmldbg_debugger/qv4datacollector.h | 14 +++--- .../qmldbg_debugger/qv4debuggeragent.cpp | 53 +++++++++++----------- .../qmltooling/qmldbg_debugger/qv4debuggeragent.h | 14 +++--- .../qmltooling/qmldbg_debugger/qv4debugservice.cpp | 39 ++++++++-------- .../qmltooling/qmldbg_debugger/qv4debugservice.h | 6 +-- 6 files changed, 68 insertions(+), 65 deletions(-) (limited to 'src/plugins/qmltooling') diff --git a/src/plugins/qmltooling/qmldbg_debugger/qv4datacollector.cpp b/src/plugins/qmltooling/qmldbg_debugger/qv4datacollector.cpp index db8c1feb92..4cca1900de 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qv4datacollector.cpp +++ b/src/plugins/qmltooling/qmldbg_debugger/qv4datacollector.cpp @@ -208,13 +208,13 @@ QV4DataCollector::Ref QV4DataCollector::addScriptRef(const QString &scriptName) return ref; } -void QV4DataCollector::collectScope(QJsonObject *dict, QV4::Debugging::Debugger *debugger, +void QV4DataCollector::collectScope(QJsonObject *dict, QV4::Debugging::V4Debugger *debugger, int frameNr, int scopeNr) { QStringList names; Refs refs; - if (debugger->state() == QV4::Debugging::Debugger::Paused) { + if (debugger->state() == QV4::Debugging::V4Debugger::Paused) { RefHolder holder(this, &refs); ArgumentCollectJob argumentsJob(m_engine, this, &names, frameNr, scopeNr); debugger->runInEngine(&argumentsJob); @@ -359,7 +359,8 @@ void GatherSourcesJob::run() sources.append(fileName); } - QV4::Debugging::Debugger *debugger = engine->debugger; + QV4::Debugging::V4Debugger *debugger + = static_cast(engine->debugger); emit debugger->sourcesCollected(debugger, sources, seq); } diff --git a/src/plugins/qmltooling/qmldbg_debugger/qv4datacollector.h b/src/plugins/qmltooling/qmldbg_debugger/qv4datacollector.h index fb78c1614a..d0e4a4ad18 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qv4datacollector.h +++ b/src/plugins/qmltooling/qmldbg_debugger/qv4datacollector.h @@ -60,7 +60,7 @@ public: Ref addFunctionRef(const QString &functionName); Ref addScriptRef(const QString &scriptName); - void collectScope(QJsonObject *dict, QV4::Debugging::Debugger *debugger, int frameNr, + void collectScope(QJsonObject *dict, QV4::Debugging::V4Debugger *debugger, int frameNr, int scopeNr); QV4::ExecutionEngine *engine() const { return m_engine; } @@ -101,7 +101,7 @@ private: QV4DataCollector::Refs *m_previousRefs; }; -class ExpressionEvalJob: public QV4::Debugging::Debugger::JavaScriptJob +class ExpressionEvalJob: public QV4::Debugging::V4Debugger::JavaScriptJob { QV4DataCollector *collector; QString exception; @@ -113,7 +113,7 @@ public: const QString &exceptionMessage() const; }; -class GatherSourcesJob: public QV4::Debugging::Debugger::Job +class GatherSourcesJob: public QV4::Debugging::V4Debugger::Job { QV4::ExecutionEngine *engine; const int seq; @@ -123,7 +123,7 @@ public: void run(); }; -class ArgumentCollectJob: public QV4::Debugging::Debugger::Job +class ArgumentCollectJob: public QV4::Debugging::V4Debugger::Job { QV4::ExecutionEngine *engine; QV4DataCollector *collector; @@ -137,7 +137,7 @@ public: void run(); }; -class LocalCollectJob: public QV4::Debugging::Debugger::Job +class LocalCollectJob: public QV4::Debugging::V4Debugger::Job { QV4::ExecutionEngine *engine; QV4DataCollector *collector; @@ -151,7 +151,7 @@ public: void run(); }; -class ThisCollectJob: public QV4::Debugging::Debugger::Job +class ThisCollectJob: public QV4::Debugging::V4Debugger::Job { QV4::ExecutionEngine *engine; QV4DataCollector *collector; @@ -165,7 +165,7 @@ public: bool myRun(); }; -class ExceptionCollectJob: public QV4::Debugging::Debugger::Job +class ExceptionCollectJob: public QV4::Debugging::V4Debugger::Job { QV4::ExecutionEngine *engine; QV4DataCollector *collector; diff --git a/src/plugins/qmltooling/qmldbg_debugger/qv4debuggeragent.cpp b/src/plugins/qmltooling/qmldbg_debugger/qv4debuggeragent.cpp index 7f22b16e45..e33595c629 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qv4debuggeragent.cpp +++ b/src/plugins/qmltooling/qmldbg_debugger/qv4debuggeragent.cpp @@ -44,7 +44,7 @@ QV4DebuggerAgent::QV4DebuggerAgent(QV4DebugServiceImpl *debugService) : m_breakOnThrow(false), m_debugService(debugService) {} -QV4::Debugging::Debugger *QV4DebuggerAgent::firstDebugger() const +QV4::Debugging::V4Debugger *QV4DebuggerAgent::firstDebugger() const { // Currently only 1 single engine is supported, so: if (m_debuggers.isEmpty()) @@ -56,13 +56,13 @@ QV4::Debugging::Debugger *QV4DebuggerAgent::firstDebugger() const bool QV4DebuggerAgent::isRunning() const { // Currently only 1 single engine is supported, so: - if (QV4::Debugging::Debugger *debugger = firstDebugger()) - return debugger->state() == QV4::Debugging::Debugger::Running; + if (QV4::Debugging::V4Debugger *debugger = firstDebugger()) + return debugger->state() == QV4::Debugging::V4Debugger::Running; else return false; } -void QV4DebuggerAgent::debuggerPaused(QV4::Debugging::Debugger *debugger, +void QV4DebuggerAgent::debuggerPaused(QV4::Debugging::V4Debugger *debugger, QV4::Debugging::PauseReason reason) { Q_UNUSED(reason); @@ -105,7 +105,7 @@ void QV4DebuggerAgent::debuggerPaused(QV4::Debugging::Debugger *debugger, m_debugService->send(event); } -void QV4DebuggerAgent::sourcesCollected(QV4::Debugging::Debugger *debugger, +void QV4DebuggerAgent::sourcesCollected(QV4::Debugging::V4Debugger *debugger, const QStringList &sources, int requestSequenceNr) { QJsonArray body; @@ -118,7 +118,7 @@ void QV4DebuggerAgent::sourcesCollected(QV4::Debugging::Debugger *debugger, QJsonObject response; response[QLatin1String("success")] = true; - response[QLatin1String("running")] = debugger->state() == QV4::Debugging::Debugger::Running; + response[QLatin1String("running")] = debugger->state() == QV4::Debugging::V4Debugger::Running; response[QLatin1String("body")] = body; response[QLatin1String("command")] = QStringLiteral("scripts"); response[QLatin1String("request_seq")] = requestSequenceNr; @@ -126,7 +126,7 @@ void QV4DebuggerAgent::sourcesCollected(QV4::Debugging::Debugger *debugger, m_debugService->send(response); } -void QV4DebuggerAgent::addDebugger(QV4::Debugging::Debugger *debugger) +void QV4DebuggerAgent::addDebugger(QV4::Debugging::V4Debugger *debugger) { Q_ASSERT(!m_debuggers.contains(debugger)); m_debuggers << debugger; @@ -139,54 +139,55 @@ void QV4DebuggerAgent::addDebugger(QV4::Debugging::Debugger *debugger) connect(debugger, SIGNAL(destroyed(QObject*)), this, SLOT(handleDebuggerDeleted(QObject*))); - connect(debugger, SIGNAL(sourcesCollected(QV4::Debugging::Debugger*,QStringList,int)), - this, SLOT(sourcesCollected(QV4::Debugging::Debugger*,QStringList,int)), + connect(debugger, SIGNAL(sourcesCollected(QV4::Debugging::V4Debugger*,QStringList,int)), + this, SLOT(sourcesCollected(QV4::Debugging::V4Debugger*,QStringList,int)), Qt::QueuedConnection); - connect(debugger, SIGNAL(debuggerPaused(QV4::Debugging::Debugger*,QV4::Debugging::PauseReason)), - this, SLOT(debuggerPaused(QV4::Debugging::Debugger*,QV4::Debugging::PauseReason)), + connect(debugger, + SIGNAL(debuggerPaused(QV4::Debugging::V4Debugger*,QV4::Debugging::PauseReason)), + this, SLOT(debuggerPaused(QV4::Debugging::V4Debugger*,QV4::Debugging::PauseReason)), Qt::QueuedConnection); } -void QV4DebuggerAgent::removeDebugger(QV4::Debugging::Debugger *debugger) +void QV4DebuggerAgent::removeDebugger(QV4::Debugging::V4Debugger *debugger) { m_debuggers.removeAll(debugger); disconnect(debugger, SIGNAL(destroyed(QObject*)), this, SLOT(handleDebuggerDeleted(QObject*))); - disconnect(debugger, SIGNAL(sourcesCollected(QV4::Debugging::Debugger*,QStringList,int)), - this, SLOT(sourcesCollected(QV4::Debugging::Debugger*,QStringList,int))); + disconnect(debugger, SIGNAL(sourcesCollected(QV4::Debugging::V4Debugger*,QStringList,int)), + this, SLOT(sourcesCollected(QV4::Debugging::V4Debugger*,QStringList,int))); disconnect(debugger, - SIGNAL(debuggerPaused(QV4::Debugging::Debugger*,QV4::Debugging::PauseReason)), + SIGNAL(debuggerPaused(QV4::Debugging::V4Debugger*,QV4::Debugging::PauseReason)), this, - SLOT(debuggerPaused(QV4::Debugging::Debugger*,QV4::Debugging::PauseReason))); + SLOT(debuggerPaused(QV4::Debugging::V4Debugger*,QV4::Debugging::PauseReason))); } void QV4DebuggerAgent::handleDebuggerDeleted(QObject *debugger) { - m_debuggers.removeAll(static_cast(debugger)); + m_debuggers.removeAll(static_cast(debugger)); } -void QV4DebuggerAgent::pause(QV4::Debugging::Debugger *debugger) const +void QV4DebuggerAgent::pause(QV4::Debugging::V4Debugger *debugger) const { debugger->pause(); } void QV4DebuggerAgent::pauseAll() const { - foreach (QV4::Debugging::Debugger *debugger, m_debuggers) + foreach (QV4::Debugging::V4Debugger *debugger, m_debuggers) pause(debugger); } void QV4DebuggerAgent::resumeAll() const { - foreach (QV4::Debugging::Debugger *debugger, m_debuggers) - if (debugger->state() == QV4::Debugging::Debugger::Paused) - debugger->resume(QV4::Debugging::Debugger::FullThrottle); + foreach (QV4::Debugging::V4Debugger *debugger, m_debuggers) + if (debugger->state() == QV4::Debugging::V4Debugger::Paused) + debugger->resume(QV4::Debugging::V4Debugger::FullThrottle); } int QV4DebuggerAgent::addBreakPoint(const QString &fileName, int lineNumber, bool enabled, const QString &condition) { if (enabled) - foreach (QV4::Debugging::Debugger *debugger, m_debuggers) + foreach (QV4::Debugging::V4Debugger *debugger, m_debuggers) debugger->addBreakPoint(fileName, lineNumber, condition); int id = m_breakPoints.size(); @@ -203,7 +204,7 @@ void QV4DebuggerAgent::removeBreakPoint(int id) m_breakPoints.remove(id); if (breakPoint.enabled) - foreach (QV4::Debugging::Debugger *debugger, m_debuggers) + foreach (QV4::Debugging::V4Debugger *debugger, m_debuggers) debugger->removeBreakPoint(breakPoint.fileName, breakPoint.lineNr); } @@ -221,7 +222,7 @@ void QV4DebuggerAgent::enableBreakPoint(int id, bool onoff) return; breakPoint.enabled = onoff; - foreach (QV4::Debugging::Debugger *debugger, m_debuggers) { + foreach (QV4::Debugging::V4Debugger *debugger, m_debuggers) { if (onoff) debugger->addBreakPoint(breakPoint.fileName, breakPoint.lineNr, breakPoint.condition); else @@ -244,7 +245,7 @@ void QV4DebuggerAgent::setBreakOnThrow(bool onoff) { if (onoff != m_breakOnThrow) { m_breakOnThrow = onoff; - foreach (QV4::Debugging::Debugger *debugger, m_debuggers) + foreach (QV4::Debugging::V4Debugger *debugger, m_debuggers) debugger->setBreakOnThrow(onoff); } } diff --git a/src/plugins/qmltooling/qmldbg_debugger/qv4debuggeragent.h b/src/plugins/qmltooling/qmldbg_debugger/qv4debuggeragent.h index 6126eea772..eafb408e7a 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qv4debuggeragent.h +++ b/src/plugins/qmltooling/qmldbg_debugger/qv4debuggeragent.h @@ -46,13 +46,13 @@ class QV4DebuggerAgent : public QObject public: QV4DebuggerAgent(QV4DebugServiceImpl *m_debugService); - QV4::Debugging::Debugger *firstDebugger() const; + QV4::Debugging::V4Debugger *firstDebugger() const; bool isRunning() const; - void addDebugger(QV4::Debugging::Debugger *debugger); - void removeDebugger(QV4::Debugging::Debugger *debugger); + void addDebugger(QV4::Debugging::V4Debugger *debugger); + void removeDebugger(QV4::Debugging::V4Debugger *debugger); - void pause(QV4::Debugging::Debugger *debugger) const; + void pause(QV4::Debugging::V4Debugger *debugger) const; void pauseAll() const; void resumeAll() const; int addBreakPoint(const QString &fileName, int lineNumber, bool enabled = true, const QString &condition = QString()); @@ -65,13 +65,13 @@ public: void setBreakOnThrow(bool onoff); public slots: - void debuggerPaused(QV4::Debugging::Debugger *debugger, QV4::Debugging::PauseReason reason); - void sourcesCollected(QV4::Debugging::Debugger *debugger, const QStringList &sources, + void debuggerPaused(QV4::Debugging::V4Debugger *debugger, QV4::Debugging::PauseReason reason); + void sourcesCollected(QV4::Debugging::V4Debugger *debugger, const QStringList &sources, int requestSequenceNr); void handleDebuggerDeleted(QObject *debugger); private: - QList m_debuggers; + QList m_debuggers; struct BreakPoint { QString fileName; diff --git a/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp b/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp index 0fb6df7fd2..306c3c4d1a 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp +++ b/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp @@ -270,7 +270,7 @@ public: int toFrame = arguments.value(QStringLiteral("toFrame")).toInt(fromFrame + 10); // no idea what the bottom property is for, so we'll ignore it. - QV4::Debugging::Debugger *debugger = debugService->debuggerAgent.firstDebugger(); + QV4::Debugging::V4Debugger *debugger = debugService->debuggerAgent.firstDebugger(); QJsonArray frameArray; QVector frames = debugger->stackTrace(toFrame); @@ -307,7 +307,7 @@ public: const int frameNr = arguments.value(QStringLiteral("number")).toInt( debugService->selectedFrame()); - QV4::Debugging::Debugger *debugger = debugService->debuggerAgent.firstDebugger(); + QV4::Debugging::V4Debugger *debugger = debugService->debuggerAgent.firstDebugger(); QVector frames = debugger->stackTrace(frameNr + 1); if (frameNr < 0 || frameNr >= frames.size()) { createErrorResponse(QStringLiteral("frame command has invalid frame number")); @@ -340,7 +340,7 @@ public: debugService->selectedFrame()); const int scopeNr = arguments.value(QStringLiteral("number")).toInt(0); - QV4::Debugging::Debugger *debugger = debugService->debuggerAgent.firstDebugger(); + QV4::Debugging::V4Debugger *debugger = debugService->debuggerAgent.firstDebugger(); QVector frames = debugger->stackTrace(frameNr + 1); if (frameNr < 0 || frameNr >= frames.size()) { createErrorResponse(QStringLiteral("scope command has invalid frame number")); @@ -398,10 +398,10 @@ public: // decypher the payload: QJsonObject arguments = req.value(QStringLiteral("arguments")).toObject(); - QV4::Debugging::Debugger *debugger = debugService->debuggerAgent.firstDebugger(); + QV4::Debugging::V4Debugger *debugger = debugService->debuggerAgent.firstDebugger(); if (arguments.empty()) { - debugger->resume(QV4::Debugging::Debugger::FullThrottle); + debugger->resume(QV4::Debugging::V4Debugger::FullThrottle); } else { QJsonObject arguments = req.value(QStringLiteral("arguments")).toObject(); QString stepAction = arguments.value(QStringLiteral("stepaction")).toString(); @@ -410,11 +410,11 @@ public: qWarning() << "Step count other than 1 is not supported."; if (stepAction == QStringLiteral("in")) { - debugger->resume(QV4::Debugging::Debugger::StepIn); + debugger->resume(QV4::Debugging::V4Debugger::StepIn); } else if (stepAction == QStringLiteral("out")) { - debugger->resume(QV4::Debugging::Debugger::StepOut); + debugger->resume(QV4::Debugging::V4Debugger::StepOut); } else if (stepAction == QStringLiteral("next")) { - debugger->resume(QV4::Debugging::Debugger::StepOver); + debugger->resume(QV4::Debugging::V4Debugger::StepOver); } else { createErrorResponse(QStringLiteral("continue command has invalid stepaction")); return; @@ -506,7 +506,7 @@ public: } // do it: - QV4::Debugging::Debugger *debugger = debugService->debuggerAgent.firstDebugger(); + QV4::Debugging::V4Debugger *debugger = debugService->debuggerAgent.firstDebugger(); GatherSourcesJob job(debugger->engine(), requestSequenceNr()); debugger->runInEngine(&job); @@ -549,8 +549,8 @@ public: virtual void handleRequest() { - QV4::Debugging::Debugger *debugger = debugService->debuggerAgent.firstDebugger(); - if (debugger->state() == QV4::Debugging::Debugger::Paused) { + QV4::Debugging::V4Debugger *debugger = debugService->debuggerAgent.firstDebugger(); + if (debugger->state() == QV4::Debugging::V4Debugger::Paused) { QJsonObject arguments = req.value(QStringLiteral("arguments")).toObject(); QString expression = arguments.value(QStringLiteral("expression")).toString(); const int frame = arguments.value(QStringLiteral("frame")).toInt(0); @@ -621,8 +621,8 @@ void QV4DebugServiceImpl::engineAboutToBeAdded(QQmlEngine *engine) QV4::ExecutionEngine *ee = QV8Engine::getV4(engine->handle()); if (QQmlDebugConnector *server = QQmlDebugConnector::instance()) { if (ee) { - ee->enableDebugger(); - QV4::Debugging::Debugger *debugger = ee->debugger; + QV4::Debugging::V4Debugger *debugger = new QV4::Debugging::V4Debugger(ee); + ee->setDebugger(debugger); debuggerMap.insert(debuggerIndex++, debugger); debuggerAgent.addDebugger(debugger); debuggerAgent.moveToThread(server->thread()); @@ -638,8 +638,9 @@ void QV4DebugServiceImpl::engineAboutToBeRemoved(QQmlEngine *engine) if (engine){ const QV4::ExecutionEngine *ee = QV8Engine::getV4(engine->handle()); if (ee) { - QV4::Debugging::Debugger *debugger = ee->debugger; - typedef QMap::const_iterator DebuggerMapIterator; + QV4::Debugging::V4Debugger *debugger + = static_cast(ee->debugger); + typedef QMap::const_iterator DebuggerMapIterator; const DebuggerMapIterator end = debuggerMap.constEnd(); for (DebuggerMapIterator i = debuggerMap.constBegin(); i != end; ++i) { if (i.value() == debugger) { @@ -769,7 +770,7 @@ void QV4DebugServiceImpl::clearHandles(QV4::ExecutionEngine *engine) } QJsonObject QV4DebugServiceImpl::buildFrame(const QV4::StackFrame &stackFrame, int frameNr, - QV4::Debugging::Debugger *debugger) + QV4::Debugging::V4Debugger *debugger) { QV4DataCollector::Ref ref; @@ -787,7 +788,7 @@ QJsonObject QV4DebugServiceImpl::buildFrame(const QV4::StackFrame &stackFrame, i frame[QLatin1String("column")] = stackFrame.column; QJsonArray scopes; - if (debugger->state() == QV4::Debugging::Debugger::Paused) { + if (debugger->state() == QV4::Debugging::V4Debugger::Paused) { RefHolder holder(theCollector.data(), &collectedRefs); bool foundThis = false; ThisCollectJob job(debugger->engine(), theCollector.data(), frameNr, &foundThis); @@ -837,7 +838,7 @@ int QV4DebugServiceImpl::encodeScopeType(QV4::Heap::ExecutionContext::ContextTyp } QJsonObject QV4DebugServiceImpl::buildScope(int frameNr, int scopeNr, - QV4::Debugging::Debugger *debugger) + QV4::Debugging::V4Debugger *debugger) { QJsonObject scope; @@ -845,7 +846,7 @@ QJsonObject QV4DebugServiceImpl::buildScope(int frameNr, int scopeNr, RefHolder holder(theCollector.data(), &collectedRefs); theCollector->collectScope(&object, debugger, frameNr, scopeNr); - if (debugger->state() == QV4::Debugging::Debugger::Paused) { + if (debugger->state() == QV4::Debugging::V4Debugger::Paused) { QVector scopeTypes = QV4DataCollector::getScopeTypes(debugger->engine(), frameNr); scope[QLatin1String("type")] = encodeScopeType(scopeTypes[scopeNr]); diff --git a/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.h b/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.h index 6c2950de8c..c4920404a2 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.h +++ b/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.h @@ -76,13 +76,13 @@ public: void signalEmitted(const QString &signal); void send(QJsonObject v8Payload); - QJsonObject buildScope(int frameNr, int scopeNr, QV4::Debugging::Debugger *debugger); + QJsonObject buildScope(int frameNr, int scopeNr, QV4::Debugging::V4Debugger *debugger); QJsonArray buildRefs(); QJsonValue lookup(QV4DataCollector::Ref refId); QJsonValue toRef(QV4DataCollector::Ref ref); QJsonObject buildFrame(const QV4::StackFrame &stackFrame, int frameNr, - QV4::Debugging::Debugger *debugger); + QV4::Debugging::V4Debugger *debugger); int selectedFrame() const; void selectFrame(int frameNr); @@ -107,7 +107,7 @@ private: int encodeScopeType(QV4::Heap::ExecutionContext::ContextType scopeType); QStringList breakOnSignals; - QMap debuggerMap; + QMap debuggerMap; static int debuggerIndex; static int sequence; const int version; -- cgit v1.2.3