aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2017-10-20 09:32:51 +0200
committerLars Knoll <lars.knoll@qt.io>2017-11-07 07:24:25 +0000
commit9ac383f8a5c33b1dba2e5226ebe8d540fcf2cb34 (patch)
tree269919a0b77854e0ae23121926c2882a8ba6fb38 /src/qml
parent957de0c8fb109ad6938d7a8673164cc94f346ecc (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.h12
-rw-r--r--src/qml/jsruntime/qv4runtime.cpp58
-rw-r--r--src/qml/jsruntime/qv4runtimeapi_p.h16
-rw-r--r--src/qml/jsruntime/qv4vme_moth.cpp56
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)