From 6d8dbba4624c8a453ba13ff009f011f2946422bb Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Sat, 30 Jun 2018 19:19:18 +0200 Subject: Add support for super calls Implement super call support for class constructor functions. Change-Id: I3c64276234689cf4f644b095e0fc8ca1c634ac53 Reviewed-by: Simon Hausmann --- src/qml/jit/qv4baselinejit.cpp | 9 +++++++++ src/qml/jit/qv4baselinejit_p.h | 1 + src/qml/jit/qv4jithelpers.cpp | 9 +++++++++ src/qml/jit/qv4jithelpers_p.h | 1 + 4 files changed, 20 insertions(+) (limited to 'src/qml/jit') 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(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); -- cgit v1.2.3