diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-06-30 19:19:18 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-07-03 08:09:05 +0000 |
commit | 6d8dbba4624c8a453ba13ff009f011f2946422bb (patch) | |
tree | ec1aec45c122a31d7e5c1c19daa9ba5d4f824355 /src/qml/jit | |
parent | deaa99f66ddedc2ea79e6902c665925b04665e68 (diff) |
Add support for super calls
Implement super call support for class constructor
functions.
Change-Id: I3c64276234689cf4f644b095e0fc8ca1c634ac53
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jit')
-rw-r--r-- | src/qml/jit/qv4baselinejit.cpp | 9 | ||||
-rw-r--r-- | src/qml/jit/qv4baselinejit_p.h | 1 | ||||
-rw-r--r-- | src/qml/jit/qv4jithelpers.cpp | 9 | ||||
-rw-r--r-- | src/qml/jit/qv4jithelpers_p.h | 1 |
4 files changed, 20 insertions, 0 deletions
diff --git a/src/qml/jit/qv4baselinejit.cpp b/src/qml/jit/qv4baselinejit.cpp index 23df04f127..b52350a729 100644 --- a/src/qml/jit/qv4baselinejit.cpp +++ b/src/qml/jit/qv4baselinejit.cpp @@ -787,6 +787,15 @@ void BaselineJIT::generate_ConvertThisToObject() as->checkException(); } +void BaselineJIT::generate_LoadSuperConstructor() +{ + as->prepareCallWithArgCount(2); + as->passRegAsArg(CallData::Function, 1); + as->passEngineAsArg(0); + JIT_GENERATE_RUNTIME_CALL(Helpers::loadSuperConstructor, Assembler::ResultInAccumulator); + as->checkException(); +} + void BaselineJIT::generate_ToObject() { STORE_ACC(); diff --git a/src/qml/jit/qv4baselinejit_p.h b/src/qml/jit/qv4baselinejit_p.h index 9fa4aa2cda..26da3d5da3 100644 --- a/src/qml/jit/qv4baselinejit_p.h +++ b/src/qml/jit/qv4baselinejit_p.h @@ -159,6 +159,7 @@ public: void generate_CreateUnmappedArgumentsObject() override; void generate_CreateRestParameter(int argIndex) override; void generate_ConvertThisToObject() override; + void generate_LoadSuperConstructor() override; void generate_ToObject() override; void generate_Jump(int offset) override; void generate_JumpTrue(int offset) override; diff --git a/src/qml/jit/qv4jithelpers.cpp b/src/qml/jit/qv4jithelpers.cpp index f644d8c782..23e3095a85 100644 --- a/src/qml/jit/qv4jithelpers.cpp +++ b/src/qml/jit/qv4jithelpers.cpp @@ -69,6 +69,15 @@ ReturnedValue loadGlobalLookup(ExecutionEngine *engine, Function *f, int index) return l->globalGetter(l, engine); } +ReturnedValue loadSuperConstructor(ExecutionEngine *engine, const Value *t) +{ + if (!t->isObject()) { + engine->throwTypeError(); + return Encode::undefined(); + } + return static_cast<const Object *>(t)->getPrototypeOf()->asReturnedValue(); +} + ReturnedValue toObject(ExecutionEngine *engine, const Value &obj) { if (obj.isObject()) diff --git a/src/qml/jit/qv4jithelpers_p.h b/src/qml/jit/qv4jithelpers_p.h index bb10d5722b..e0dfdc47d9 100644 --- a/src/qml/jit/qv4jithelpers_p.h +++ b/src/qml/jit/qv4jithelpers_p.h @@ -66,6 +66,7 @@ namespace Helpers { void convertThisToObject(ExecutionEngine *engine, Value *t); ReturnedValue loadGlobalLookup(ExecutionEngine *engine, Function *f, int index); +ReturnedValue loadSuperConstructor(ExecutionEngine *engine, const Value *t); ReturnedValue toObject(ExecutionEngine *engine, const Value &obj); ReturnedValue exp(const Value &base, const Value &exp); ReturnedValue getLookup(ExecutionEngine *engine, Function *f, int index, const Value &base); |