diff options
Diffstat (limited to 'src/qml/jsruntime/qv4globalobject.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4globalobject.cpp | 46 |
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); } |