diff options
Diffstat (limited to 'src/qml/jsruntime/qv4script.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4script.cpp | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/src/qml/jsruntime/qv4script.cpp b/src/qml/jsruntime/qv4script.cpp index bec5f0bfe8..d2d21d4fd5 100644 --- a/src/qml/jsruntime/qv4script.cpp +++ b/src/qml/jsruntime/qv4script.cpp @@ -67,8 +67,8 @@ struct QmlBindingWrapper : FunctionObject { vtbl = &static_vtbl; function = f; - function->ref(); - usesArgumentsObject = function->usesArgumentsObject; + function->compilationUnit->ref(); + usesArgumentsObject = function->usesArgumentsObject(); needsActivation = function->needsActivation(); defineReadonlyProperty(scope->engine->id_length, Value::fromInt32(1)); @@ -163,14 +163,13 @@ void Script::parse() inheritedLocals.append(*i ? (*i)->toQString() : QString()); RuntimeCodegen cg(scope, strictMode); - V4IR::Function *globalIRCode = cg(sourceFile, sourceCode, program, &module, - parseAsBinding ? QQmlJS::Codegen::QmlBinding : QQmlJS::Codegen::EvalCode, inheritedLocals); - QScopedPointer<EvalInstructionSelection> isel(v4->iselFactory->create(v4, &module)); + cg(sourceFile, sourceCode, program, &module, + parseAsBinding ? QQmlJS::Codegen::QmlBinding : QQmlJS::Codegen::EvalCode, inheritedLocals); + QScopedPointer<EvalInstructionSelection> isel(v4->iselFactory->create(v4->executableAllocator, &module)); if (inheritContext) isel->setUseFastLookups(false); - if (globalIRCode) { - vmFunction = isel->vmFunction(globalIRCode); - } + QV4::CompiledData::CompilationUnit *compilationUnit = isel->compile(); + vmFunction = compilationUnit->linkToEngine(v4); } if (!vmFunction) @@ -191,20 +190,34 @@ Value Script::run() TemporaryAssignment<Function*> savedGlobalCode(engine->globalCode, vmFunction); bool strict = scope->strictMode; - Lookup *lookups = scope->lookups; + Lookup *oldLookups = scope->lookups; + CompiledData::CompilationUnit * const oldCompilationUnit = scope->compilationUnit; + const CompiledData::Function * const oldCompiledFunction = scope->compiledFunction; + String ** const oldRuntimeStrings = scope->runtimeStrings; - scope->strictMode = vmFunction->isStrict; - scope->lookups = vmFunction->lookups; + scope->strictMode = vmFunction->isStrict(); + scope->lookups = vmFunction->compilationUnit->runtimeLookups; + scope->compilationUnit = vmFunction->compilationUnit; + scope->compiledFunction = vmFunction->compiledFunction; + scope->runtimeStrings = vmFunction->compilationUnit->runtimeStrings; QV4::Value result; try { result = vmFunction->code(scope, vmFunction->codeData); } catch (Exception &e) { scope->strictMode = strict; - scope->lookups = lookups; + scope->lookups = oldLookups; + scope->compilationUnit = oldCompilationUnit; + scope->compiledFunction = oldCompiledFunction; + scope->runtimeStrings = oldRuntimeStrings; throw; } + scope->lookups = oldLookups; + scope->compilationUnit = oldCompilationUnit; + scope->compiledFunction = oldCompiledFunction; + scope->runtimeStrings = oldRuntimeStrings; + return result; } else { |