QML Debugging: Fix breakpoints/stepping in a with-statement.
authorErik Verbruggen <erik.verbruggen@digia.com>
Fri, 5 Dec 2014 12:58:22 +0000 (13:58 +0100)
committerErik Verbruggen <erik.verbruggen@theqtcompany.com>
Wed, 10 Dec 2014 14:33:44 +0000 (15:33 +0100)
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>
src/qml/jsruntime/qv4context_p.h
tests/auto/qml/qv4debugger/tst_qv4debugger.cpp

index c0ca4ae..99a982a 100644 (file)
@@ -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;
index fcbdcbc..4d155cf 100644 (file)
@@ -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 =