aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/qml/debugger/qv4debugger/tst_qv4debugger.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2017-02-28 15:55:39 +0100
committerUlf Hermann <ulf.hermann@qt.io>2017-02-28 16:33:00 +0000
commit5a9fd4f49ec48c91c70699fc40af8f843c51b4ab (patch)
tree69b6e0bb3376d3abb38407d40d8f8e9936344c49 /tests/auto/qml/debugger/qv4debugger/tst_qv4debugger.cpp
parent8c864e52369ee4d55a1d9345215c8153144b5939 (diff)
V4 Debugger: Don't crash when stepping to the end of a script
The last instruction is a return, which leads to an invalid context. Don't try to save that context, but rather clear the current one. Change-Id: I468b7420c4ca0842209c9b00478f99cc4dc69726 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'tests/auto/qml/debugger/qv4debugger/tst_qv4debugger.cpp')
-rw-r--r--tests/auto/qml/debugger/qv4debugger/tst_qv4debugger.cpp30
1 files changed, 29 insertions, 1 deletions
diff --git a/tests/auto/qml/debugger/qv4debugger/tst_qv4debugger.cpp b/tests/auto/qml/debugger/qv4debugger/tst_qv4debugger.cpp
index 6793596174..7668c8b016 100644
--- a/tests/auto/qml/debugger/qv4debugger/tst_qv4debugger.cpp
+++ b/tests/auto/qml/debugger/qv4debugger/tst_qv4debugger.cpp
@@ -176,6 +176,7 @@ public:
, m_captureContextInfo(false)
, m_thrownValue(-1)
, collector(engine)
+ , m_resumeSpeed(QV4Debugger::FullThrottle)
, m_debugger(0)
{
}
@@ -214,7 +215,7 @@ public slots:
if (m_captureContextInfo)
captureContextInfo(debugger);
- debugger->resume(QV4Debugger::FullThrottle);
+ debugger->resume(m_resumeSpeed);
}
public:
@@ -280,6 +281,7 @@ public:
int context;
};
QVector<ExpressionRequest> m_expressionRequests;
+ QV4Debugger::Speed m_resumeSpeed;
QList<QJsonObject> m_expressionResults;
QList<QJsonArray> m_expressionRefs;
QV4Debugger *m_debugger;
@@ -324,6 +326,7 @@ private slots:
void breakInWith();
void evaluateExpression();
+ void stepToEndOfScript();
private:
QV4Debugger *debugger() const
@@ -758,6 +761,31 @@ void tst_qv4debugger::evaluateExpression()
}
}
+void tst_qv4debugger::stepToEndOfScript()
+{
+ QString script =
+ "var ret = 0;\n"
+ "ret += 4;\n"
+ "ret += 1;\n"
+ "ret += 5;\n";
+
+ debugger()->addBreakPoint("toEnd", 1);
+ m_debuggerAgent->m_resumeSpeed = QV4Debugger::StepOver;
+ evaluateJavaScript(script, "toEnd");
+ QVERIFY(m_debuggerAgent->m_wasPaused);
+ QCOMPARE(m_debuggerAgent->m_pauseReason, QV4Debugger::Step);
+ QCOMPARE(m_debuggerAgent->m_statesWhenPaused.count(), 5);
+ for (int i = 0; i < 4; ++i) {
+ QV4Debugger::ExecutionState state = m_debuggerAgent->m_statesWhenPaused.at(i);
+ QCOMPARE(state.fileName, QString("toEnd"));
+ QCOMPARE(state.lineNumber, i + 1);
+ }
+
+ QV4Debugger::ExecutionState state = m_debuggerAgent->m_statesWhenPaused.at(4);
+ QCOMPARE(state.fileName, QString("toEnd"));
+ QCOMPARE(state.lineNumber, -4); // A return instruction without proper line number.
+}
+
QTEST_MAIN(tst_qv4debugger)
#include "tst_qv4debugger.moc"