From b7521acd2c77f9f7ace8d49cf1e11affe2ccbd21 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Tue, 18 Aug 2015 11:14:56 +0200 Subject: V4 debugger: Fix expression evaluation We need to collect the refs in the debugService's list in order for them to show up on addRefs() and we need to generate proper error responses if either the debugger is not stopped or the evaluation throws an exception. Task-number: QTBUG-47797 Task-number: QTBUG-47816 Change-Id: I98f17c1f3976859ee50b9bfac41091276ff60982 Reviewed-by: Simon Hausmann --- .../qmltooling/qmldbg_debugger/qv4debugservice.cpp | 51 ++++++++++++---------- 1 file changed, 27 insertions(+), 24 deletions(-) (limited to 'src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp') diff --git a/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp b/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp index 6b68f9518e..89820c9f56 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp +++ b/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp @@ -549,31 +549,29 @@ public: virtual void handleRequest() { - //decypher the payload: - QJsonObject arguments = req.value(QStringLiteral("arguments")).toObject(); - QString expression = arguments.value(QStringLiteral("expression")).toString(); - const int frame = arguments.value(QStringLiteral("frame")).toInt(0); - QV4::Debugging::Debugger *debugger = debugService->debuggerAgent.firstDebugger(); - Q_ASSERT(debugger->state() == QV4::Debugging::Debugger::Paused); - - QV4DataCollector *collector = debugService->collector(); - QV4DataCollector::Refs refs; - RefHolder holder(collector, &refs); - Q_ASSERT(debugger->state() == QV4::Debugging::Debugger::Paused); - - ExpressionEvalJob job(debugger->engine(), frame, expression, collector); - debugger->runInEngine(&job); - - Q_ASSERT(refs.size() == 1); - - // response: - addCommand(); - addRequestSequence(); - addSuccess(true); - addRunning(); - addBody(collector->lookupRef(refs.first())); - addRefs(); + if (debugger->state() == QV4::Debugging::Debugger::Paused) { + QJsonObject arguments = req.value(QStringLiteral("arguments")).toObject(); + QString expression = arguments.value(QStringLiteral("expression")).toString(); + const int frame = arguments.value(QStringLiteral("frame")).toInt(0); + + QV4DataCollector *collector = debugService->collector(); + RefHolder holder(collector, debugService->refs()); + ExpressionEvalJob job(debugger->engine(), frame, expression, collector); + debugger->runInEngine(&job); + if (job.hasExeption()) { + createErrorResponse(job.exceptionMessage()); + } else { + addCommand(); + addRequestSequence(); + addSuccess(true); + addRunning(); + addBody(collector->lookupRef(debugService->refs()->last())); + addRefs(); + } + } else { + createErrorResponse(QStringLiteral("Debugger has to be paused for evaluate to work.")); + } } }; } // anonymous namespace @@ -894,6 +892,11 @@ QV4DataCollector *QV4DebugServiceImpl::collector() const return theCollector.data(); } +QV4DataCollector::Refs *QV4DebugServiceImpl::refs() +{ + return &collectedRefs; +} + void QV4DebugServiceImpl::selectFrame(int frameNr) { theSelectedFrame = frameNr; -- cgit v1.2.3