aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2017-08-10 08:51:09 +0200
committerLars Knoll <lars.knoll@qt.io>2017-08-10 10:42:13 +0000
commit1109b9df83b78fa8703c063f117b365a21fdccb1 (patch)
tree178c772640d82aec920389e97f6360b9a9206f58 /src/qml/jsruntime
parent13f603aba593282493ef8d033a91c6dbac931a9f (diff)
Remove one more layer of function calls when entering JS functions
Change-Id: I7d8b2e16d2eacf5e0eafb8b8574de51527fd0ac2 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jsruntime')
-rw-r--r--src/qml/jsruntime/qv4context.cpp4
-rw-r--r--src/qml/jsruntime/qv4context_p.h2
-rw-r--r--src/qml/jsruntime/qv4function.cpp23
-rw-r--r--src/qml/jsruntime/qv4function_p.h8
-rw-r--r--src/qml/jsruntime/qv4vme_moth.cpp6
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();
}