diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-09-18 17:01:59 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-09-23 17:27:43 +0000 |
commit | a97d118bf55e1c44ded9bbcd143b0f0725db8268 (patch) | |
tree | e0f22b61ba294199758eaf25c7e4f3c71bae7470 /src/qml/jsruntime/qv4functionobject.cpp | |
parent | 3440b8f9c5b198be4124ee1defd69d807bb972c6 (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.cpp | 24 |
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); |