diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-06-25 11:53:41 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-07-03 08:08:23 +0000 |
commit | 6f79b7519f10ba24485769cf9bf2922e002bd46a (patch) | |
tree | f496f398e8dc452bfb876233244658a6ef911e47 | |
parent | b262605c806a6572f31cf9a50aab7b0e10cbc951 (diff) |
Add a newTarget parameter to the Construct runtime methods
This is required to be able to support the super() call.
Change-Id: I9998680341d701727ac1697187ad33481bdde422
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r-- | src/qml/compiler/qv4codegen.cpp | 5 | ||||
-rw-r--r-- | src/qml/jit/qv4baselinejit.cpp | 16 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtimeapi_p.h | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4vme_moth.cpp | 4 |
5 files changed, 22 insertions, 13 deletions
diff --git a/src/qml/compiler/qv4codegen.cpp b/src/qml/compiler/qv4codegen.cpp index cab99b0c21..9bc9567be6 100644 --- a/src/qml/compiler/qv4codegen.cpp +++ b/src/qml/compiler/qv4codegen.cpp @@ -2215,8 +2215,9 @@ bool Codegen::visit(NewExpression *ast) Reference base = expression(ast->expression); if (hasError) return false; - //### Maybe create a ConstructA that takes an accumulator? + base = base.storeOnStack(); + base.loadInAccumulator(); Instruction::Construct create; create.func = base.stackSlot(); @@ -2243,6 +2244,8 @@ bool Codegen::visit(NewMemberExpression *ast) if (hasError) return false; + base.loadInAccumulator(); + if (calldata.hasSpread) { Instruction::ConstructWithSpread create; create.func = base.stackSlot(); diff --git a/src/qml/jit/qv4baselinejit.cpp b/src/qml/jit/qv4baselinejit.cpp index ed98ca5f4c..23df04f127 100644 --- a/src/qml/jit/qv4baselinejit.cpp +++ b/src/qml/jit/qv4baselinejit.cpp @@ -517,9 +517,11 @@ void BaselineJIT::generate_CallWithSpread(int func, int thisObject, int argc, in void BaselineJIT::generate_Construct(int func, int argc, int argv) { STORE_IP(); - as->prepareCallWithArgCount(4); - as->passInt32AsArg(argc, 3); - as->passRegAsArg(argv, 2); + STORE_ACC(); + as->prepareCallWithArgCount(5); + as->passInt32AsArg(argc, 4); + as->passRegAsArg(argv, 3); + as->passAccumulatorAsArg(2); as->passRegAsArg(func, 1); as->passEngineAsArg(0); JIT_GENERATE_RUNTIME_CALL(Runtime::method_construct, Assembler::ResultInAccumulator); @@ -529,9 +531,11 @@ void BaselineJIT::generate_Construct(int func, int argc, int argv) void BaselineJIT::generate_ConstructWithSpread(int func, int argc, int argv) { STORE_IP(); - as->prepareCallWithArgCount(4); - as->passInt32AsArg(argc, 3); - as->passRegAsArg(argv, 2); + STORE_ACC(); + as->prepareCallWithArgCount(5); + as->passInt32AsArg(argc, 4); + as->passRegAsArg(argv, 3); + as->passAccumulatorAsArg(2); as->passRegAsArg(func, 1); as->passEngineAsArg(0); JIT_GENERATE_RUNTIME_CALL(Runtime::method_constructWithSpread, Assembler::ResultInAccumulator); diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index 0f3bd66ba4..8b042f12ff 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -1302,19 +1302,21 @@ ReturnedValue Runtime::method_callWithSpread(ExecutionEngine *engine, const Valu return static_cast<const FunctionObject &>(function).call(&thisObject, arguments.argv, arguments.argc); } -ReturnedValue Runtime::method_construct(ExecutionEngine *engine, const Value &function, Value *argv, int argc) +ReturnedValue Runtime::method_construct(ExecutionEngine *engine, const Value &function, const Value &/*newTarget*/, Value *argv, int argc) { if (!function.isFunctionObject()) return engine->throwTypeError(); + Q_ASSERT(function.sameValue(newTarget)); return static_cast<const FunctionObject &>(function).callAsConstructor(argv, argc); } -ReturnedValue Runtime::method_constructWithSpread(ExecutionEngine *engine, const Value &function, Value *argv, int argc) +ReturnedValue Runtime::method_constructWithSpread(ExecutionEngine *engine, const Value &function, const Value &/*newTarget*/, Value *argv, int argc) { Q_UNIMPLEMENTED(); if (!function.isFunctionObject()) return engine->throwTypeError(); + Q_ASSERT(function.sameValue(newTarget)); Scope scope(engine); CallArgs arguments = createSpreadArguments(scope, argv, argc); diff --git a/src/qml/jsruntime/qv4runtimeapi_p.h b/src/qml/jsruntime/qv4runtimeapi_p.h index ca98c50fd7..b4d9d329c4 100644 --- a/src/qml/jsruntime/qv4runtimeapi_p.h +++ b/src/qml/jsruntime/qv4runtimeapi_p.h @@ -102,8 +102,8 @@ struct ExceptionCheck<void (*)(QV4::NoThrowEngine *, A, B, C)> { F(ReturnedValue, callWithSpread, (ExecutionEngine *engine, const Value &func, const Value &thisObject, Value *argv, int argc)) \ \ /* construct */ \ - F(ReturnedValue, construct, (ExecutionEngine *engine, const Value &func, Value *argv, int argc)) \ - F(ReturnedValue, constructWithSpread, (ExecutionEngine *engine, const Value &func, Value *argv, int argc)) \ + F(ReturnedValue, construct, (ExecutionEngine *engine, const Value &func, const Value &newTarget, Value *argv, int argc)) \ + F(ReturnedValue, constructWithSpread, (ExecutionEngine *engine, const Value &func, const Value &newTarget, Value *argv, int argc)) \ \ /* load & store */ \ F(void, storeNameStrict, (ExecutionEngine *engine, int nameIndex, const Value &value)) \ diff --git a/src/qml/jsruntime/qv4vme_moth.cpp b/src/qml/jsruntime/qv4vme_moth.cpp index 2afd9b695a..719891b164 100644 --- a/src/qml/jsruntime/qv4vme_moth.cpp +++ b/src/qml/jsruntime/qv4vme_moth.cpp @@ -796,13 +796,13 @@ QV4::ReturnedValue VME::interpret(CppStackFrame &frame, const char *code) MOTH_BEGIN_INSTR(Construct) STORE_IP(); - acc = Runtime::method_construct(engine, STACK_VALUE(func), stack + argv, argc); + acc = Runtime::method_construct(engine, STACK_VALUE(func), ACC, stack + argv, argc); CHECK_EXCEPTION; MOTH_END_INSTR(Construct) MOTH_BEGIN_INSTR(ConstructWithSpread) STORE_IP(); - acc = Runtime::method_constructWithSpread(engine, STACK_VALUE(func), stack + argv, argc); + acc = Runtime::method_constructWithSpread(engine, STACK_VALUE(func), ACC, stack + argv, argc); CHECK_EXCEPTION; MOTH_END_INSTR(ConstructWithSpread) |