aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@theqtcompany.com>2015-10-15 16:29:03 +0200
committerhjk <hjk@theqtcompany.com>2015-10-15 17:11:50 +0000
commit5c64391fb4eb7c85634d08327e2cf82182260ac9 (patch)
tree4122ae3edfc70897955fbddfe8910999023113f2
parent6fc1e0fc36f0732e79375a0e105816eb17893962 (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.cpp38
-rw-r--r--src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.h2
-rw-r--r--src/qml/jsruntime/qv4engine.cpp1
-rw-r--r--tests/auto/qml/qv4debugger/tst_qv4debugger.cpp3
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);