diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2016-12-07 14:24:04 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2016-12-09 12:51:51 +0000 |
commit | bff7302fc277d18b5bd4ad95d35b9e1bbc2be001 (patch) | |
tree | 8ba4cc517e513b0a519ebdab4b99ba1146960d8c /src/plugins/qmltooling/qmldbg_debugger/qv4debugjob.cpp | |
parent | 3dd96630a2823ff9723a399c84303f565abce455 (diff) |
V4 Debugger: Add an option to pass additional context for evaluate
Interpret the "context" option as an ID for a QObject whose QML context
is then injected when evaluating the expression. The QObject needs to
be tracked by some other debug service for this to work, e.g. the QML
debugger or the inspector.
Task-number: QTCREATORBUG-17177
Change-Id: I6a9e8b9ae23e8bb67ed1905a2ef73f7c4faeb990
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/plugins/qmltooling/qmldbg_debugger/qv4debugjob.cpp')
-rw-r--r-- | src/plugins/qmltooling/qmldbg_debugger/qv4debugjob.cpp | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/src/plugins/qmltooling/qmldbg_debugger/qv4debugjob.cpp b/src/plugins/qmltooling/qmldbg_debugger/qv4debugjob.cpp index 4e4048f6ad..6c1e353b4d 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qv4debugjob.cpp +++ b/src/plugins/qmltooling/qmldbg_debugger/qv4debugjob.cpp @@ -42,6 +42,7 @@ #include <private/qv4script_p.h> #include <private/qqmlcontext_p.h> #include <private/qv4qobjectwrapper_p.h> +#include <private/qqmldebugservice_p.h> #include <QtQml/qqmlengine.h> @@ -51,9 +52,10 @@ QV4DebugJob::~QV4DebugJob() { } -JavaScriptJob::JavaScriptJob(QV4::ExecutionEngine *engine, int frameNr, - const QString &script) : - engine(engine), frameNr(frameNr), script(script), resultIsException(false) +JavaScriptJob::JavaScriptJob(QV4::ExecutionEngine *engine, int frameNr, int context, + const QString &script) : + engine(engine), frameNr(frameNr), context(context), script(script), + resultIsException(false) {} void JavaScriptJob::run() @@ -64,7 +66,23 @@ void JavaScriptJob::run() QV4::ExecutionContext *ctx = engine->currentContext; QObject scopeObject; - if (frameNr < 0) { // Use QML context if available + + if (frameNr > 0) { + for (int i = 0; i < frameNr; ++i) { + ctx = engine->parentContext(ctx); + } + engine->pushContext(ctx); + ctx = engine->currentContext; + } + + if (context >= 0) { + QQmlContext *extraContext = qmlContext(QQmlDebugService::objectForId(context)); + if (extraContext) { + engine->pushContext(ctx->newQmlContext(QQmlContextData::get(extraContext), + &scopeObject)); + ctx = engine->currentContext; + } + } else if (frameNr < 0) { // Use QML context if available QQmlEngine *qmlEngine = engine->qmlEngine(); if (qmlEngine) { QQmlContext *qmlRootContext = qmlEngine->rootContext(); @@ -88,13 +106,6 @@ void JavaScriptJob::run() engine->pushContext(ctx->newWithContext(withContext->toObject(engine))); ctx = engine->currentContext; } - } else { - if (frameNr > 0) { - for (int i = 0; i < frameNr; ++i) { - ctx = engine->parentContext(ctx); - } - engine->pushContext(ctx); - } } QV4::Script script(ctx, this->script); @@ -224,8 +235,9 @@ const QString &ValueLookupJob::exceptionMessage() const } ExpressionEvalJob::ExpressionEvalJob(QV4::ExecutionEngine *engine, int frameNr, - const QString &expression, QV4DataCollector *collector) : - JavaScriptJob(engine, frameNr, expression), collector(collector) + int context, const QString &expression, + QV4DataCollector *collector) : + JavaScriptJob(engine, frameNr, context, expression), collector(collector) { } @@ -271,7 +283,7 @@ const QStringList &GatherSourcesJob::result() const } EvalJob::EvalJob(QV4::ExecutionEngine *engine, const QString &script) : - JavaScriptJob(engine, /*frameNr*/-1, script), result(false) + JavaScriptJob(engine, /*frameNr*/-1, /*context*/ -1, script), result(false) {} void EvalJob::handleResult(QV4::ScopedValue &result) |