diff options
author | Lars Knoll <lars.knoll@qt.io> | 2017-10-20 09:32:51 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2017-11-07 07:24:25 +0000 |
commit | 9ac383f8a5c33b1dba2e5226ebe8d540fcf2cb34 (patch) | |
tree | 269919a0b77854e0ae23121926c2882a8ba6fb38 /src/qml | |
parent | 957de0c8fb109ad6938d7a8673164cc94f346ecc (diff) |
Move the construction of the JSCall frame into the runtime
The VME shouldn't have to care about this part
Change-Id: I9e49353dce29912f5a222b7ed1b42ace2aa8cebd
Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
Diffstat (limited to 'src/qml')
-rw-r--r-- | src/qml/jsruntime/qv4jscall_p.h | 12 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 58 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtimeapi_p.h | 16 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4vme_moth.cpp | 56 |
4 files changed, 69 insertions, 73 deletions
diff --git a/src/qml/jsruntime/qv4jscall_p.h b/src/qml/jsruntime/qv4jscall_p.h index 18dfdc102b..bf85d75fdf 100644 --- a/src/qml/jsruntime/qv4jscall_p.h +++ b/src/qml/jsruntime/qv4jscall_p.h @@ -93,6 +93,18 @@ struct JSCall { ptr->setArgc(argc); memcpy(ptr->args, argv, argc*sizeof(Value)); } + JSCall(const Scope &scope, ReturnedValue function, Value *argv, int argc, Value *thisObject = 0) + { + int size = int(offsetof(QV4::CallData, args)/sizeof(QV4::Value)) + argc; + ptr = reinterpret_cast<CallData *>(scope.engine->jsStackTop); + scope.engine->jsStackTop += size; + ptr->function = function; + ptr->context = Encode::undefined(); + ptr->accumulator = Encode::undefined(); + ptr->thisObject = thisObject ? thisObject->asReturnedValue() : Encode::undefined(); + ptr->setArgc(argc); + memcpy(ptr->args, argv, argc*sizeof(Value)); + } CallData *operator->() { return ptr; diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index 7bc2315610..08bffeb2ce 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -967,21 +967,26 @@ uint Runtime::method_compareIn(ExecutionEngine *engine, const Value &left, const } -ReturnedValue Runtime::method_callGlobalLookup(ExecutionEngine *engine, uint index, CallData *callData) +ReturnedValue Runtime::method_callGlobalLookup(ExecutionEngine *engine, uint index, Value *argv, int argc) { - callData->thisObject = Encode::undefined(); - Lookup *l = engine->currentStackFrame->v4Function->compilationUnit->runtimeLookups + index; - callData->function = l->globalGetter(l, engine); + ReturnedValue function = l->globalGetter(l, engine); + Scope scope(engine); + JSCall callData(scope, function, argv, argc); + Q_ASSERT(callData->args + callData->argc() == engine->jsStackTop); + if (!callData->function.isFunctionObject()) return engine->throwTypeError(); return static_cast<FunctionObject &>(callData->function).call(callData); } -ReturnedValue Runtime::method_callPossiblyDirectEval(ExecutionEngine *engine, CallData *callData) +ReturnedValue Runtime::method_callPossiblyDirectEval(ExecutionEngine *engine, Value *argv, int argc) { - callData->thisObject = Encode::undefined(); + Scope scope(engine); + JSCall callData(scope, argv, argc); + Q_ASSERT(callData->args + callData->argc() == engine->jsStackTop); + ExecutionContext &ctx = static_cast<ExecutionContext &>(engine->currentStackFrame->jsFrame->context); callData->function = ctx.getPropertyAndBase(engine->id_eval(), &callData->thisObject); if (engine->hasException) @@ -1003,9 +1008,12 @@ ReturnedValue Runtime::method_callPossiblyDirectEval(ExecutionEngine *engine, Ca return f.call(callData); } -ReturnedValue Runtime::method_callName(ExecutionEngine *engine, int nameIndex, CallData *callData) +ReturnedValue Runtime::method_callName(ExecutionEngine *engine, int nameIndex, Value *argv, int argc) { - callData->thisObject = Encode::undefined(); + Scope scope(engine); + JSCall callData(scope, argv, argc); + Q_ASSERT(callData->args + callData->argc() == engine->jsStackTop); + callData->function = engine->currentStackFrame->v4Function->compilationUnit->runtimeStrings[nameIndex]; ExecutionContext &ctx = static_cast<ExecutionContext &>(engine->currentStackFrame->jsFrame->context); @@ -1027,9 +1035,12 @@ ReturnedValue Runtime::method_callName(ExecutionEngine *engine, int nameIndex, C return f.call(callData); } -ReturnedValue Runtime::method_callProperty(ExecutionEngine *engine, int nameIndex, CallData *callData) +ReturnedValue Runtime::method_callProperty(ExecutionEngine *engine, Value *base, int nameIndex, Value *argv, int argc) { - Q_ASSERT(engine->jsStackTop >= callData->args + callData->argc()); + Scope scope(engine); + JSCall callData(scope, argv, argc, base); + Q_ASSERT(callData->args + callData->argc() == engine->jsStackTop); + if (!callData->thisObject.isObject()) { Q_ASSERT(!callData->thisObject.isEmpty()); if (callData->thisObject.isNullOrUndefined()) { @@ -1058,8 +1069,12 @@ ReturnedValue Runtime::method_callProperty(ExecutionEngine *engine, int nameInde return f.call(callData); } -ReturnedValue Runtime::method_callPropertyLookup(ExecutionEngine *engine, uint index, CallData *callData) +ReturnedValue Runtime::method_callPropertyLookup(ExecutionEngine *engine, Value *base, uint index, Value *argv, int argc) { + Scope scope(engine); + JSCall callData(scope, argv, argc, base); + Q_ASSERT(callData->args + callData->argc() == engine->jsStackTop); + Q_ASSERT(engine->jsStackTop >= callData->args + callData->argc()); Lookup *l = engine->currentStackFrame->v4Function->compilationUnit->runtimeLookups + index; callData->function = l->getter(l, engine, callData->thisObject); @@ -1071,8 +1086,12 @@ ReturnedValue Runtime::method_callPropertyLookup(ExecutionEngine *engine, uint i return f.call(callData); } -ReturnedValue Runtime::method_callElement(ExecutionEngine *engine, const Value &index, CallData *callData) +ReturnedValue Runtime::method_callElement(ExecutionEngine *engine, Value *base, const Value &index, Value *argv, int argc) { + Scope scope(engine); + JSCall callData(scope, argv, argc, base); + Q_ASSERT(callData->args + callData->argc() == engine->jsStackTop); + callData->thisObject = callData->thisObject.toObject(engine); callData->function = index.toString(engine); if (engine->hasException) @@ -1085,23 +1104,28 @@ ReturnedValue Runtime::method_callElement(ExecutionEngine *engine, const Value & return static_cast<FunctionObject &>(callData->function).call(callData); } -ReturnedValue Runtime::method_callValue(ExecutionEngine *engine, const Value &func, CallData *callData) +ReturnedValue Runtime::method_callValue(ExecutionEngine *engine, const Value &func, Value *argv, int argc) { - callData->thisObject = Encode::undefined(); - callData->function = func; if (!func.isFunctionObject()) return engine->throwTypeError(QStringLiteral("%1 is not a function").arg(func.toQStringNoThrow())); + Scope scope(engine); + JSCall callData(scope, func.asReturnedValue(), argv, argc); + Q_ASSERT(callData->args + callData->argc() == engine->jsStackTop); + return static_cast<FunctionObject &>(callData->function).call(callData); } -ReturnedValue Runtime::method_construct(ExecutionEngine *engine, const Value &func, CallData *callData) +ReturnedValue Runtime::method_construct(ExecutionEngine *engine, const Value &func, Value *argv, int argc) { - callData->function = func; if (!func.isFunctionObject()) return engine->throwTypeError(); + Scope scope(engine); + JSCall callData(scope, func.asReturnedValue(), argv, argc); + Q_ASSERT(callData->args + callData->argc() == engine->jsStackTop); + return static_cast<FunctionObject &>(callData->function).construct(callData); } diff --git a/src/qml/jsruntime/qv4runtimeapi_p.h b/src/qml/jsruntime/qv4runtimeapi_p.h index 7d32a81bc2..ea31dfd08b 100644 --- a/src/qml/jsruntime/qv4runtimeapi_p.h +++ b/src/qml/jsruntime/qv4runtimeapi_p.h @@ -92,16 +92,16 @@ struct ExceptionCheck<void (*)(QV4::NoThrowEngine *, A, B, C)> { #define FOR_EACH_RUNTIME_METHOD(F) \ /* call */ \ - F(ReturnedValue, callGlobalLookup, (ExecutionEngine *engine, uint index, CallData *callData)) \ - F(ReturnedValue, callName, (ExecutionEngine *engine, int nameIndex, CallData *callData)) \ - F(ReturnedValue, callProperty, (ExecutionEngine *engine, int nameIndex, CallData *callData)) \ - F(ReturnedValue, callPropertyLookup, (ExecutionEngine *engine, uint index, CallData *callData)) \ - F(ReturnedValue, callElement, (ExecutionEngine *engine, const Value &index, CallData *callData)) \ - F(ReturnedValue, callValue, (ExecutionEngine *engine, const Value &func, CallData *callData)) \ - F(ReturnedValue, callPossiblyDirectEval, (ExecutionEngine *engine, CallData *callData)) \ + F(ReturnedValue, callGlobalLookup, (ExecutionEngine *engine, uint index, Value *argv, int argc)) \ + F(ReturnedValue, callName, (ExecutionEngine *engine, int nameIndex, Value *argv, int argc)) \ + F(ReturnedValue, callProperty, (ExecutionEngine *engine, Value *base, int nameIndex, Value *argv, int argc)) \ + F(ReturnedValue, callPropertyLookup, (ExecutionEngine *engine, Value *base, uint index, Value *argv, int argc)) \ + F(ReturnedValue, callElement, (ExecutionEngine *engine, Value *base, const Value &index, Value *argv, int argc)) \ + F(ReturnedValue, callValue, (ExecutionEngine *engine, const Value &func, Value *argv, int argc)) \ + F(ReturnedValue, callPossiblyDirectEval, (ExecutionEngine *engine, Value *argv, int argc)) \ \ /* construct */ \ - F(ReturnedValue, construct, (ExecutionEngine *engine, const Value &func, CallData *callData)) \ + F(ReturnedValue, construct, (ExecutionEngine *engine, const Value &func, 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 3e9f329c9a..282f71fb2e 100644 --- a/src/qml/jsruntime/qv4vme_moth.cpp +++ b/src/qml/jsruntime/qv4vme_moth.cpp @@ -745,78 +745,43 @@ QV4::ReturnedValue VME::exec(CallData *callData, QV4::Function *function) MOTH_BEGIN_INSTR(CallValue) STORE_IP(); STORE_ACC(); - { - Scope scope(engine); - JSCall cData(scope, stack + argv, argc); - Q_ASSERT(cData->args + cData->argc() == engine->jsStackTop); - acc = Runtime::method_callValue(engine, accumulator, cData); - } + acc = Runtime::method_callValue(engine, accumulator, stack + argv, argc); CHECK_EXCEPTION; MOTH_END_INSTR(CallValue) MOTH_BEGIN_INSTR(CallProperty) STORE_IP(); - { - Scope scope(engine); - JSCall cData(scope, stack + argv, argc, stack + base); - Q_ASSERT(cData->args + cData->argc() == engine->jsStackTop); - acc = Runtime::method_callProperty(engine, name, cData); - } + acc = Runtime::method_callProperty(engine, stack + base, name, stack + argv, argc); CHECK_EXCEPTION; MOTH_END_INSTR(CallProperty) MOTH_BEGIN_INSTR(CallPropertyLookup) STORE_IP(); - { - Scope scope(engine); - JSCall cData(scope, stack + argv, argc, stack + base); - Q_ASSERT(cData->args + cData->argc() == engine->jsStackTop); - acc = Runtime::method_callPropertyLookup(engine, lookupIndex, cData); - } + acc = Runtime::method_callPropertyLookup(engine, stack + base, lookupIndex, stack + argv, argc); CHECK_EXCEPTION; MOTH_END_INSTR(CallPropertyLookup) MOTH_BEGIN_INSTR(CallElement) STORE_IP(); - { - Scope scope(engine); - JSCall cData(scope, stack + argv, argc, stack + base); - Q_ASSERT(cData->args + cData->argc() == engine->jsStackTop); - acc = Runtime::method_callElement(engine, STACK_VALUE(index), cData); - } + acc = Runtime::method_callElement(engine, stack + base, STACK_VALUE(index), stack + argv, argc); CHECK_EXCEPTION; MOTH_END_INSTR(CallElement) MOTH_BEGIN_INSTR(CallName) STORE_IP(); - { - Scope scope(engine); - JSCall cData(scope, stack + argv, argc); - Q_ASSERT(cData->args + cData->argc() == engine->jsStackTop); - acc = Runtime::method_callName(engine, name, cData); - } + acc = Runtime::method_callName(engine, name, stack + argv, argc); CHECK_EXCEPTION; MOTH_END_INSTR(CallName) MOTH_BEGIN_INSTR(CallPossiblyDirectEval) STORE_IP(); - { - Scope scope(engine); - JSCall cData(scope, stack + argv, argc); - Q_ASSERT(cData->args + cData->argc() == engine->jsStackTop); - acc = Runtime::method_callPossiblyDirectEval(engine, cData); - } + acc = Runtime::method_callPossiblyDirectEval(engine, stack + argv, argc); CHECK_EXCEPTION; MOTH_END_INSTR(CallPossiblyDirectEval) MOTH_BEGIN_INSTR(CallGlobalLookup) STORE_IP(); - { - Scope scope(engine); - JSCall cData(scope, stack + argv, argc); - Q_ASSERT(cData->args + cData->argc() == engine->jsStackTop); - acc = Runtime::method_callGlobalLookup(engine, index, cData); - } + acc = Runtime::method_callGlobalLookup(engine, index, stack + argv, argc); CHECK_EXCEPTION; MOTH_END_INSTR(CallGlobalLookup) @@ -963,12 +928,7 @@ QV4::ReturnedValue VME::exec(CallData *callData, QV4::Function *function) MOTH_BEGIN_INSTR(Construct) STORE_IP(); - { - Scope scope(engine); - JSCall cData(scope, stack + argv, argc); - Q_ASSERT(cData->args + cData->argc() == engine->jsStackTop); - acc = Runtime::method_construct(engine, STACK_VALUE(func), cData); - } + acc = Runtime::method_construct(engine, STACK_VALUE(func), stack + argv, argc); CHECK_EXCEPTION; MOTH_END_INSTR(Construct) |