aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4globalobject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/jsruntime/qv4globalobject.cpp')
-rw-r--r--src/qml/jsruntime/qv4globalobject.cpp46
1 files changed, 25 insertions, 21 deletions
diff --git a/src/qml/jsruntime/qv4globalobject.cpp b/src/qml/jsruntime/qv4globalobject.cpp
index 3b1e0b1bae..4dcdb08415 100644
--- a/src/qml/jsruntime/qv4globalobject.cpp
+++ b/src/qml/jsruntime/qv4globalobject.cpp
@@ -355,6 +355,27 @@ EvalFunction::EvalFunction(ExecutionContext *scope)
ReturnedValue EvalFunction::evalCall(CallData *callData, bool directCall)
{
+ struct ContextStateSaver {
+ ExecutionContext *savedContext;
+ bool strictMode;
+ ExecutionContext::EvalCode *evalCode;
+ CompiledData::CompilationUnit *compilationUnit;
+
+ ContextStateSaver(ExecutionContext *context)
+ : savedContext(context)
+ , strictMode(context->strictMode)
+ , evalCode(context->currentEvalCode)
+ , compilationUnit(context->compilationUnit)
+ {}
+
+ ~ContextStateSaver()
+ {
+ savedContext->strictMode = strictMode;
+ savedContext->currentEvalCode = evalCode;
+ savedContext->compilationUnit = compilationUnit;
+ }
+ };
+
if (callData->argc < 1)
return Encode::undefined();
@@ -395,36 +416,19 @@ ReturnedValue EvalFunction::evalCall(CallData *callData, bool directCall)
return e->call(callData);
}
+ ExecutionContextSaver ctxSaver(parentContext);
+ ContextStateSaver stateSaver(ctx);
+
ExecutionContext::EvalCode evalCode;
evalCode.function = function;
evalCode.next = ctx->currentEvalCode;
ctx->currentEvalCode = &evalCode;
// set the correct strict mode flag on the context
- bool cstrict = ctx->strictMode;
ctx->strictMode = strictMode;
-
- CompiledData::CompilationUnit * const oldCompilationUnit = ctx->compilationUnit;
ctx->compilationUnit = function->compilationUnit;
- ScopedValue result(scope);
- try {
- result = function->code(ctx, function->codeData);
- } catch (...) {
- ctx->strictMode = cstrict;
- ctx->currentEvalCode = evalCode.next;
- ctx->compilationUnit = oldCompilationUnit;
- ctx->rethrowException();
- }
-
- ctx->strictMode = cstrict;
- ctx->currentEvalCode = evalCode.next;
- ctx->compilationUnit = oldCompilationUnit;
-
- while (engine->current != parentContext)
- engine->popContext();
-
- return result.asReturnedValue();
+ return function->code(ctx, function->codeData);
}