diff options
-rw-r--r-- | src/qml/jsruntime/qv4context.cpp | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4context_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4function.cpp | 23 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4function_p.h | 8 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4vme_moth.cpp | 6 |
5 files changed, 17 insertions, 26 deletions
diff --git a/src/qml/jsruntime/qv4context.cpp b/src/qml/jsruntime/qv4context.cpp index c04323c8ef..96f668f168 100644 --- a/src/qml/jsruntime/qv4context.cpp +++ b/src/qml/jsruntime/qv4context.cpp @@ -55,7 +55,7 @@ DEFINE_MANAGED_VTABLE(ExecutionContext); DEFINE_MANAGED_VTABLE(CallContext); DEFINE_MANAGED_VTABLE(CatchContext); -Heap::CallContext *ExecutionContext::newCallContext(Heap::ExecutionContext *outer, Function *function, CallData *callData) +Heap::CallContext *ExecutionContext::newCallContext(Heap::ExecutionContext *outer, Function *function, CallData *callData, const FunctionObject *f) { uint nFormals = qMax(static_cast<uint>(callData->argc), function->nFormals); uint localsAndFormals = function->compiledFunction->nLocals + sizeof(CallData)/sizeof(Value) - 1 + nFormals; @@ -68,6 +68,8 @@ Heap::CallContext *ExecutionContext::newCallContext(Heap::ExecutionContext *oute c->v4Function = function; c->outer.set(v4, outer); + if (f) + c->function.set(v4, f->d()); const CompiledData::Function *compiledFunction = function->compiledFunction; uint nLocals = compiledFunction->nLocals; diff --git a/src/qml/jsruntime/qv4context_p.h b/src/qml/jsruntime/qv4context_p.h index 697007c75b..d93511ba00 100644 --- a/src/qml/jsruntime/qv4context_p.h +++ b/src/qml/jsruntime/qv4context_p.h @@ -192,7 +192,7 @@ struct Q_QML_EXPORT ExecutionContext : public Managed Q_MANAGED_TYPE(ExecutionContext) V4_INTERNALCLASS(ExecutionContext) - static Heap::CallContext *newCallContext(Heap::ExecutionContext *outer, Function *f, CallData *callData); + static Heap::CallContext *newCallContext(Heap::ExecutionContext *outer, Function *function, CallData *callData, const FunctionObject *f); Heap::ExecutionContext *newWithContext(Heap::Object *with); Heap::CatchContext *newCatchContext(Heap::String *exceptionVarName, ReturnedValue exceptionValue); diff --git a/src/qml/jsruntime/qv4function.cpp b/src/qml/jsruntime/qv4function.cpp index 78fb46327a..6a07c49478 100644 --- a/src/qml/jsruntime/qv4function.cpp +++ b/src/qml/jsruntime/qv4function.cpp @@ -45,7 +45,6 @@ #include "qv4engine_p.h" #include "qv4lookup_p.h" #include <private/qv4mm_p.h> -#include <private/qqmljavascriptexpression_p.h> QT_BEGIN_NAMESPACE @@ -119,26 +118,4 @@ void Function::updateInternalClass(ExecutionEngine *engine, const QList<QByteArr canUseSimpleCall = false; } - -// Do a call with this execution context as the outer scope -ReturnedValue Function::call(const FunctionObject *f, CallData *callData, Heap::ExecutionContext *context, Function *function) -{ - ExecutionEngine *engine = context->internalClass->engine; - - if (!function->canUseSimpleCall) { - context = ExecutionContext::newCallContext(context, function, callData); - if (f) - static_cast<Heap::CallContext *>(context)->function.set(engine, f->d()); - } - - ReturnedValue res = function->execute(context, callData, f); - - if (function->hasQmlDependencies) { - Q_ASSERT(context->type == Heap::ExecutionContext::Type_QmlContext); - QQmlPropertyCapture::registerQmlDependencies(static_cast<Heap::QmlContext *>(context), engine, function->compiledFunction); - } - - return res; -} - QT_END_NAMESPACE diff --git a/src/qml/jsruntime/qv4function_p.h b/src/qml/jsruntime/qv4function_p.h index 750db8c496..1cfd15bbce 100644 --- a/src/qml/jsruntime/qv4function_p.h +++ b/src/qml/jsruntime/qv4function_p.h @@ -104,7 +104,13 @@ struct Q_QML_EXPORT Function { } private: - static ReturnedValue call(const FunctionObject *f, CallData *callData, Heap::ExecutionContext *context, Function *function); + static ReturnedValue call(const FunctionObject *f, CallData *callData, Heap::ExecutionContext *context, Function *function) + { + if (!function->canUseSimpleCall) + context = ExecutionContext::newCallContext(context, function, callData, f); + + return function->execute(context, callData, f); + } }; diff --git a/src/qml/jsruntime/qv4vme_moth.cpp b/src/qml/jsruntime/qv4vme_moth.cpp index 13f22368ca..cfcda9731c 100644 --- a/src/qml/jsruntime/qv4vme_moth.cpp +++ b/src/qml/jsruntime/qv4vme_moth.cpp @@ -52,6 +52,7 @@ #include <private/qv4lookup_p.h> #include <private/qv4string_p.h> #include <private/qv4profiling_p.h> +#include <private/qqmljavascriptexpression_p.h> #include <iostream> #include "qv4alloca_p.h" @@ -1118,5 +1119,10 @@ functionExit: engine->currentStackFrame = frame.parent; engine->jsStackTop = jsStackTop; + if (function->hasQmlDependencies) { + Q_ASSERT(context->type == Heap::ExecutionContext::Type_QmlContext); + QQmlPropertyCapture::registerQmlDependencies(static_cast<Heap::QmlContext *>(context), engine, function->compiledFunction); + } + return accumulator.asReturnedValue(); } |