diff options
author | Ulf Hermann <ulf.hermann@theqtcompany.com> | 2015-10-15 16:29:03 +0200 |
---|---|---|
committer | hjk <hjk@theqtcompany.com> | 2015-10-15 17:11:50 +0000 |
commit | 5c64391fb4eb7c85634d08327e2cf82182260ac9 (patch) | |
tree | 4122ae3edfc70897955fbddfe8910999023113f2 | |
parent | 6fc1e0fc36f0732e79375a0e105816eb17893962 (diff) |
Only set V4 debugger when service is enabled
Otherwise different debug services could steal each other's debugers.
Change-Id: Ic0a50333d21c7d20a7124240ea598f8446400ae3
Reviewed-by: hjk <hjk@theqtcompany.com>
-rw-r--r-- | src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp | 38 | ||||
-rw-r--r-- | src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 1 | ||||
-rw-r--r-- | tests/auto/qml/qv4debugger/tst_qv4debugger.cpp | 3 |
4 files changed, 34 insertions, 10 deletions
diff --git a/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp b/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp index 306c3c4d1a..5233a09992 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp +++ b/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp @@ -34,6 +34,7 @@ #include "qv4debugservice.h" #include "qqmlengine.h" #include <private/qv4engine_p.h> +#include <private/qv4isel_moth_p.h> #include <private/qv4function_p.h> #include <private/qqmldebugconnector_p.h> @@ -621,8 +622,10 @@ void QV4DebugServiceImpl::engineAboutToBeAdded(QQmlEngine *engine) QV4::ExecutionEngine *ee = QV8Engine::getV4(engine->handle()); if (QQmlDebugConnector *server = QQmlDebugConnector::instance()) { if (ee) { + ee->iselFactory.reset(new QV4::Moth::ISelFactory); QV4::Debugging::V4Debugger *debugger = new QV4::Debugging::V4Debugger(ee); - ee->setDebugger(debugger); + if (state() == Enabled) + ee->setDebugger(debugger); debuggerMap.insert(debuggerIndex++, debugger); debuggerAgent.addDebugger(debugger); debuggerAgent.moveToThread(server->thread()); @@ -639,21 +642,38 @@ void QV4DebugServiceImpl::engineAboutToBeRemoved(QQmlEngine *engine) const QV4::ExecutionEngine *ee = QV8Engine::getV4(engine->handle()); if (ee) { QV4::Debugging::V4Debugger *debugger - = static_cast<QV4::Debugging::V4Debugger *>(ee->debugger); - typedef QMap<int, QV4::Debugging::V4Debugger *>::const_iterator DebuggerMapIterator; - const DebuggerMapIterator end = debuggerMap.constEnd(); - for (DebuggerMapIterator i = debuggerMap.constBegin(); i != end; ++i) { - if (i.value() == debugger) { - debuggerMap.remove(i.key()); - break; + = qobject_cast<QV4::Debugging::V4Debugger *>(ee->debugger); + if (debugger) { + typedef QMap<int, QV4::Debugging::V4Debugger *>::const_iterator DebuggerMapIterator; + const DebuggerMapIterator end = debuggerMap.constEnd(); + for (DebuggerMapIterator i = debuggerMap.constBegin(); i != end; ++i) { + if (i.value() == debugger) { + debuggerMap.remove(i.key()); + break; + } } + debuggerAgent.removeDebugger(debugger); } - debuggerAgent.removeDebugger(debugger); } } QQmlConfigurableDebugService<QV4DebugService>::engineAboutToBeRemoved(engine); } +void QV4DebugServiceImpl::stateAboutToBeChanged(State state) +{ + QMutexLocker lock(&m_configMutex); + if (state == Enabled) { + typedef QMap<int, QV4::Debugging::V4Debugger *>::const_iterator DebuggerMapIterator; + const DebuggerMapIterator end = debuggerMap.constEnd(); + for (DebuggerMapIterator i = debuggerMap.constBegin(); i != end; ++i) { + QV4::ExecutionEngine *ee = i.value()->engine(); + if (!ee->debugger) + ee->setDebugger(i.value()); + } + } + QQmlConfigurableDebugService<QV4DebugService>::stateAboutToBeChanged(state); +} + void QV4DebugServiceImpl::signalEmitted(const QString &signal) { //This function is only called by QQmlBoundSignal diff --git a/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.h b/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.h index c4920404a2..273e5ffd62 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.h +++ b/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.h @@ -73,6 +73,8 @@ public: void engineAboutToBeAdded(QQmlEngine *engine); void engineAboutToBeRemoved(QQmlEngine *engine); + void stateAboutToBeChanged(State state); + void signalEmitted(const QString &signal); void send(QJsonObject v8Payload); diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index 2732f360b3..82d94f569e 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -522,7 +522,6 @@ void ExecutionEngine::setDebugger(Debugging::Debugger *debugger_) { Q_ASSERT(!debugger); debugger = debugger_; - iselFactory.reset(new Moth::ISelFactory); } void ExecutionEngine::enableProfiler() diff --git a/tests/auto/qml/qv4debugger/tst_qv4debugger.cpp b/tests/auto/qml/qv4debugger/tst_qv4debugger.cpp index 902ad50be7..39a1fbc173 100644 --- a/tests/auto/qml/qv4debugger/tst_qv4debugger.cpp +++ b/tests/auto/qml/qv4debugger/tst_qv4debugger.cpp @@ -41,6 +41,7 @@ #include <private/qv4debugging_p.h> #include <private/qv8engine_p.h> #include <private/qv4objectiterator_p.h> +#include <private/qv4isel_moth_p.h> using namespace QV4; using namespace QV4::Debugging; @@ -317,6 +318,7 @@ void tst_qv4debugger::init() m_javaScriptThread = new QThread; m_engine = new TestEngine; m_v4 = m_engine->v4Engine(); + m_v4->iselFactory.reset(new QV4::Moth::ISelFactory); m_v4->setDebugger(new V4Debugger(m_v4)); m_engine->moveToThread(m_javaScriptThread); m_javaScriptThread->start(); @@ -464,6 +466,7 @@ void tst_qv4debugger::conditionalBreakPointInQml() QQmlEngine engine; QV4::ExecutionEngine *v4 = QV8Engine::getV4(&engine); V4Debugger *v4Debugger = new V4Debugger(v4); + v4->iselFactory.reset(new QV4::Moth::ISelFactory); v4->setDebugger(v4Debugger); QScopedPointer<QThread> debugThread(new QThread); |