aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4functionobject.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-09-18 17:01:59 +0200
committerLars Knoll <lars.knoll@qt.io>2018-09-23 17:27:43 +0000
commita97d118bf55e1c44ded9bbcd143b0f0725db8268 (patch)
treee0f22b61ba294199758eaf25c7e4f3c71bae7470 /src/qml/jsruntime/qv4functionobject.cpp
parent3440b8f9c5b198be4124ee1defd69d807bb972c6 (diff)
Better inheritance structure for functions
Give Arrow functions their own representation. This also prepares for further optimizations especially for the instanceof operator. Change-Id: I1f70c0271169a237e1acdeb7fe855be957ba2ea5 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4functionobject.cpp')
-rw-r--r--src/qml/jsruntime/qv4functionobject.cpp24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/qml/jsruntime/qv4functionobject.cpp b/src/qml/jsruntime/qv4functionobject.cpp
index 8a674bc7fa..6fc2d45630 100644
--- a/src/qml/jsruntime/qv4functionobject.cpp
+++ b/src/qml/jsruntime/qv4functionobject.cpp
@@ -168,6 +168,8 @@ ReturnedValue FunctionObject::virtualCall(const FunctionObject *, const Value *,
Heap::FunctionObject *FunctionObject::createScriptFunction(ExecutionContext *scope, Function *function)
{
+ if (function->isArrowFunction())
+ return scope->engine()->memoryManager->allocate<ArrowFunction>(scope, function);
return scope->engine()->memoryManager->allocate<ScriptFunction>(scope, function);
}
@@ -213,6 +215,17 @@ bool FunctionObject::isBoundFunction() const
return d()->vtable() == BoundFunction::staticVTable();
}
+ReturnedValue FunctionObject::getHomeObject() const
+{
+ const MemberFunction *m = as<MemberFunction>();
+ if (m)
+ return m->d()->homeObject->asReturnedValue();
+ const ConstructorFunction *c = as<ConstructorFunction>();
+ if (c)
+ return c->d()->homeObject->asReturnedValue();
+ return Encode::undefined();
+}
+
QQmlSourceLocation FunctionObject::sourceLocation() const
{
return d()->function->sourceLocation();
@@ -489,7 +502,9 @@ ReturnedValue ScriptFunction::virtualCallAsConstructor(const FunctionObject *fo,
return result;
}
-ReturnedValue ScriptFunction::virtualCall(const FunctionObject *fo, const Value *thisObject, const Value *argv, int argc)
+DEFINE_OBJECT_VTABLE(ArrowFunction);
+
+ReturnedValue ArrowFunction::virtualCall(const FunctionObject *fo, const Value *thisObject, const Value *argv, int argc)
{
ExecutionEngine *engine = fo->engine();
CppStackFrame frame;
@@ -508,7 +523,7 @@ ReturnedValue ScriptFunction::virtualCall(const FunctionObject *fo, const Value
return result;
}
-void Heap::ScriptFunction::initNoConstructor(QV4::ExecutionContext *scope, Function *function, QV4::String *n)
+void Heap::ArrowFunction::init(QV4::ExecutionContext *scope, Function *function, QV4::String *n)
{
FunctionObject::init();
this->scope.set(scope->engine(), scope->d());
@@ -529,9 +544,8 @@ void Heap::ScriptFunction::initNoConstructor(QV4::ExecutionContext *scope, Funct
void Heap::ScriptFunction::init(QV4::ExecutionContext *scope, Function *function)
{
- initNoConstructor(scope, function, nullptr);
- if (function->isArrowFunction())
- return;
+ ArrowFunction::init(scope, function);
+ Q_ASSERT(!function->isArrowFunction());
Scope s(scope);
ScopedFunctionObject f(s, this);