diff options
Diffstat (limited to 'src/script/api')
-rw-r--r-- | src/script/api/qscriptengine.cpp | 18 | ||||
-rw-r--r-- | src/script/api/qscriptengine_p.h | 1 |
2 files changed, 16 insertions, 3 deletions
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp index f60d0af..97d8061 100644 --- a/src/script/api/qscriptengine.cpp +++ b/src/script/api/qscriptengine.cpp @@ -417,9 +417,12 @@ public: TimeoutCheckerProxy(const JSC::TimeoutChecker& originalChecker) : JSC::TimeoutChecker(originalChecker) , m_shouldProcessEvents(false) + , m_shouldAbortEvaluation(false) {} void setShouldProcessEvents(bool shouldProcess) { m_shouldProcessEvents = shouldProcess; } + void setShouldAbort(bool shouldAbort) { m_shouldAbortEvaluation = shouldAbort; } + bool shouldAbort() { return m_shouldAbortEvaluation; } virtual bool didTimeOut(JSC::ExecState* exec) { @@ -429,11 +432,12 @@ public: if (m_shouldProcessEvents) QCoreApplication::processEvents(); - return false; + return m_shouldAbortEvaluation; } private: bool m_shouldProcessEvents; + bool m_shouldAbortEvaluation; }; static int toDigit(char c) @@ -2278,6 +2282,12 @@ QScriptValue QScriptEngine::evaluate(const QString &program, const QString &file JSC::JSValue exceptionValue; JSC::JSValue result = exec->interpreter()->execute(evalNode.get(), exec, thisObject, exec->scopeChain(), &exceptionValue); + if (dynamic_cast<QScript::TimeoutCheckerProxy*>(d->globalData->timeoutChecker)->shouldAbort()) { + if (d->abortResult.isError()) + exec->setException(d->scriptValueToJSCValue(d->abortResult)); + return d->abortResult; + } + if (exceptionValue) { exec->setException(exceptionValue); return d->scriptValueFromJSCValue(exceptionValue); @@ -3541,8 +3551,10 @@ bool QScriptEngine::isEvaluating() const */ void QScriptEngine::abortEvaluation(const QScriptValue &result) { - qWarning("QScriptEngine::abortEvaluation() not implemented"); - Q_UNUSED(result); + Q_D(QScriptEngine); + + dynamic_cast<QScript::TimeoutCheckerProxy*>(d->globalData->timeoutChecker)->setShouldAbort(true); + d->abortResult = result; } #ifndef QT_NO_QOBJECT diff --git a/src/script/api/qscriptengine_p.h b/src/script/api/qscriptengine_p.h index f6d7700..cb56cae 100644 --- a/src/script/api/qscriptengine_p.h +++ b/src/script/api/qscriptengine_p.h @@ -225,6 +225,7 @@ public: QHash<JSC::JSCell*, QBasicAtomicInt> keepAliveValues; QHash<int, QScriptTypeInfo*> m_typeInfos; int processEventsInterval; + QScriptValue abortResult; QSet<QString> importedExtensions; QSet<QString> extensionsBeingImported; |