From e2ed4bd637d40879b7b820862fd8647c32389228 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 28 Apr 2015 19:18:40 +0200 Subject: [PATCH] Make QV4::Script GC safe Change-Id: I559458278cb6a0bbbc4da441034115aa4c72b058 Reviewed-by: Simon Hausmann --- src/qml/jsruntime/qv4script.cpp | 20 +++++++++----------- src/qml/jsruntime/qv4script_p.h | 7 +++---- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/qml/jsruntime/qv4script.cpp b/src/qml/jsruntime/qv4script.cpp index aec5d73..33efed8 100644 --- a/src/qml/jsruntime/qv4script.cpp +++ b/src/qml/jsruntime/qv4script.cpp @@ -188,7 +188,7 @@ Heap::FunctionObject *QmlBindingWrapper::createQmlCallableForFunction(QQmlContex } Script::Script(ExecutionEngine *v4, Object *qml, CompiledData::CompilationUnit *compilationUnit) - : line(0), column(0), scope(v4->rootContext()->d()), strictMode(false), inheritContext(true), parsed(false) + : line(0), column(0), scope(v4->rootContext()), strictMode(false), inheritContext(true), parsed(false) , qml(v4, qml), vmFunction(0), parseAsBinding(true) { parsed = true; @@ -214,7 +214,7 @@ void Script::parse() parsed = true; - ExecutionEngine *v4 = scope->engine; + ExecutionEngine *v4 = scope->engine(); Scope valueScope(v4); MemoryManager::GCBlocker gcBlocker(v4->memoryManager); @@ -285,7 +285,7 @@ ReturnedValue Script::run() if (!vmFunction) return Encode::undefined(); - QV4::ExecutionEngine *engine = scope->engine; + QV4::ExecutionEngine *engine = scope->engine(); QV4::Scope valueScope(engine); if (qml.isUndefined()) { @@ -293,15 +293,14 @@ ReturnedValue Script::run() ExecutionContextSaver ctxSaver(valueScope, scope); ContextStateSaver stateSaver(valueScope, scope); - scope->strictMode = vmFunction->isStrict(); - scope->lookups = vmFunction->compilationUnit->runtimeLookups; - scope->compilationUnit = vmFunction->compilationUnit; + scope->d()->strictMode = vmFunction->isStrict(); + scope->d()->lookups = vmFunction->compilationUnit->runtimeLookups; + scope->d()->compilationUnit = vmFunction->compilationUnit; return vmFunction->code(engine, vmFunction->codeData); } else { ScopedObject qmlObj(valueScope, qml.value()); - ScopedContext ctx(valueScope, scope); - ScopedFunctionObject f(valueScope, engine->memoryManager->alloc(ctx, vmFunction, qmlObj)); + ScopedFunctionObject f(valueScope, engine->memoryManager->alloc(scope, vmFunction, qmlObj)); ScopedCallData callData(valueScope); callData->thisObject = Primitive::undefinedValue(); return f->call(callData); @@ -376,11 +375,10 @@ ReturnedValue Script::qmlBinding() { if (!parsed) parse(); - ExecutionEngine *v4 = scope->engine; + ExecutionEngine *v4 = scope->engine(); Scope valueScope(v4); ScopedObject qmlObj(valueScope, qml.value()); - ScopedContext ctx(valueScope, scope); - ScopedObject v(valueScope, v4->memoryManager->alloc(ctx, vmFunction, qmlObj)); + ScopedObject v(valueScope, v4->memoryManager->alloc(scope, vmFunction, qmlObj)); return v.asReturnedValue(); } diff --git a/src/qml/jsruntime/qv4script_p.h b/src/qml/jsruntime/qv4script_p.h index d2d2b89..59a589a 100644 --- a/src/qml/jsruntime/qv4script_p.h +++ b/src/qml/jsruntime/qv4script_p.h @@ -111,11 +111,11 @@ struct Q_QML_EXPORT QmlBindingWrapper : FunctionObject { struct Q_QML_EXPORT Script { Script(ExecutionContext *scope, const QString &sourceCode, const QString &source = QString(), int line = 1, int column = 0) : sourceFile(source), line(line), column(column), sourceCode(sourceCode) - , scope(scope->d()), strictMode(false), inheritContext(false), parsed(false) + , scope(scope), strictMode(false), inheritContext(false), parsed(false) , vmFunction(0), parseAsBinding(false) {} Script(ExecutionEngine *engine, Object *qml, const QString &sourceCode, const QString &source = QString(), int line = 1, int column = 0) : sourceFile(source), line(line), column(column), sourceCode(sourceCode) - , scope(engine->rootContext()->d()), strictMode(false), inheritContext(true), parsed(false) + , scope(engine->rootContext()), strictMode(false), inheritContext(true), parsed(false) , qml(engine, qml), vmFunction(0), parseAsBinding(true) {} Script(ExecutionEngine *engine, Object *qml, CompiledData::CompilationUnit *compilationUnit); ~Script(); @@ -123,8 +123,7 @@ struct Q_QML_EXPORT Script { int line; int column; QString sourceCode; - // ### GC - Heap::ExecutionContext *scope; + ExecutionContext *scope; bool strictMode; bool inheritContext; bool parsed; -- 2.7.4