From 109b4d19e2c677c3eafaf6b4a9df605cb3aeb481 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Tue, 4 Aug 2009 13:14:08 +0200 Subject: Do not crash if using popContext() while the current context have not been pushed Reviewed-by: Kent Hansen --- src/script/api/qscriptengine.cpp | 5 +++++ tests/auto/qscriptcontext/tst_qscriptcontext.cpp | 8 ++------ tests/auto/qscriptengine/tst_qscriptengine.cpp | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp index 97d8061..bebb972 100644 --- a/src/script/api/qscriptengine.cpp +++ b/src/script/api/qscriptengine.cpp @@ -2369,6 +2369,11 @@ QScriptContext *QScriptEngine::pushContext() void QScriptEngine::popContext() { Q_D(QScriptEngine); + if (d->currentFrame->returnPC() != 0 || d->currentFrame->codeBlock() != 0 + || d->currentFrame->returnValueRegister() != 0 || !currentContext()->parentContext()) { + qWarning("QScriptEngine::popContext() doesn't match with pushContext()"); + return; + } JSC::RegisterFile ®isterFile = d->currentFrame->interpreter()->registerFile(); JSC::Register *const newEnd = d->currentFrame->registers() - JSC::RegisterFile::CallFrameHeaderSize - d->currentFrame->argumentCount(); d->currentFrame->scopeChain()->pop()->deref(); diff --git a/tests/auto/qscriptcontext/tst_qscriptcontext.cpp b/tests/auto/qscriptcontext/tst_qscriptcontext.cpp index 7a363ac..87db0ad 100644 --- a/tests/auto/qscriptcontext/tst_qscriptcontext.cpp +++ b/tests/auto/qscriptcontext/tst_qscriptcontext.cpp @@ -487,12 +487,8 @@ void tst_QScriptContext::pushAndPopContext() QCOMPARE(eng.currentContext(), topLevel); // popping the top-level context is not allowed - QEXPECT_FAIL("", "Crashes", Continue); -#if 1 - QVERIFY(false); -#else - eng.popContext() -#endif + QTest::ignoreMessage(QtWarningMsg, "QScriptEngine::popContext() doesn't match with pushContext()"); + eng.popContext(); QCOMPARE(eng.currentContext(), topLevel); { diff --git a/tests/auto/qscriptengine/tst_qscriptengine.cpp b/tests/auto/qscriptengine/tst_qscriptengine.cpp index 0b16980..f7bac56 100644 --- a/tests/auto/qscriptengine/tst_qscriptengine.cpp +++ b/tests/auto/qscriptengine/tst_qscriptengine.cpp @@ -193,9 +193,9 @@ void tst_QScriptEngine::pushPopContext() eng.popContext(); eng.popContext(); - QEXPECT_FAIL("", "cannot pop more context than it pushes", Abort); - QVERIFY(false); + QTest::ignoreMessage(QtWarningMsg, "QScriptEngine::popContext() doesn't match with pushContext()"); eng.popContext(); // ignored + QTest::ignoreMessage(QtWarningMsg, "QScriptEngine::popContext() doesn't match with pushContext()"); eng.popContext(); // ignored } -- cgit v0.12