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/jsruntime/qv4runtime.cpp | |
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/jsruntime/qv4runtime.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 58 |
1 files changed, 41 insertions, 17 deletions
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); } |