aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@digia.com>2014-12-05 13:58:22 +0100
committerErik Verbruggen <erik.verbruggen@theqtcompany.com>2014-12-10 15:33:44 +0100
commit5586af99c15af8fef27bedfbf84a05d107b4320c (patch)
treeb4c58e777442855dff5cede6ddf3b95f6e7ae00c
parente55d89bc29bdb800ddc2cf6be49ac36ca65e2682 (diff)
QML Debugging: Fix breakpoints/stepping in a with-statement.
Also fix the stack-trace generation, otherwise the debugger engine would report a breakpoint hit on the wrong line. Change-Id: I6eb4b508fbdca64d03badd8f9312a05c78781ded Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
-rw-r--r--src/qml/jsruntime/qv4context_p.h8
-rw-r--r--tests/auto/qml/qv4debugger/tst_qv4debugger.cpp18
2 files changed, 25 insertions, 1 deletions
diff --git a/src/qml/jsruntime/qv4context_p.h b/src/qml/jsruntime/qv4context_p.h
index c0ca4aec19..99a982aa7f 100644
--- a/src/qml/jsruntime/qv4context_p.h
+++ b/src/qml/jsruntime/qv4context_p.h
@@ -149,6 +149,7 @@ struct Q_QML_EXPORT ExecutionContext : public Managed
inline CallContext *asCallContext();
inline const CallContext *asCallContext() const;
inline const CatchContext *asCatchContext() const;
+ inline const WithContext *asWithContext() const;
inline FunctionObject *getFunctionObject() const;
@@ -232,12 +233,17 @@ inline const CatchContext *ExecutionContext::asCatchContext() const
return d()->type == Type_CatchContext ? static_cast<const CatchContext *>(this) : 0;
}
+inline const WithContext *ExecutionContext::asWithContext() const
+{
+ return d()->type == Type_WithContext ? static_cast<const WithContext *>(this) : 0;
+}
+
inline FunctionObject *ExecutionContext::getFunctionObject() const
{
for (const ExecutionContext *it = this; it; it = it->d()->parent) {
if (const CallContext *callCtx = it->asCallContext())
return callCtx->d()->function;
- else if (it->asCatchContext())
+ else if (it->asCatchContext() || it->asWithContext())
continue; // look in the parent context for a FunctionObject
else
break;
diff --git a/tests/auto/qml/qv4debugger/tst_qv4debugger.cpp b/tests/auto/qml/qv4debugger/tst_qv4debugger.cpp
index fcbdcbc201..4d155cf012 100644
--- a/tests/auto/qml/qv4debugger/tst_qv4debugger.cpp
+++ b/tests/auto/qml/qv4debugger/tst_qv4debugger.cpp
@@ -287,6 +287,7 @@ private slots:
// exceptions:
void pauseOnThrow();
void breakInCatch();
+ void breakInWith();
void evaluateExpression();
@@ -632,6 +633,23 @@ void tst_qv4debugger::breakInCatch()
QCOMPARE(state.lineNumber, 4);
}
+void tst_qv4debugger::breakInWith()
+{
+ QString script =
+ "with (42) {\n"
+ " console.log('give the answer');\n"
+ "}\n";
+
+ m_debuggerAgent->addBreakPoint("breakInWith", 2);
+ evaluateJavaScript(script, "breakInWith");
+ QVERIFY(m_debuggerAgent->m_wasPaused);
+ QCOMPARE(m_debuggerAgent->m_pauseReason, BreakPoint);
+ QCOMPARE(m_debuggerAgent->m_statesWhenPaused.count(), 1);
+ QV4::Debugging::Debugger::ExecutionState state = m_debuggerAgent->m_statesWhenPaused.first();
+ QCOMPARE(state.fileName, QString("breakInWith"));
+ QCOMPARE(state.lineNumber, 2);
+}
+
void tst_qv4debugger::evaluateExpression()
{
QString script =