aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4vme_moth.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/jsruntime/qv4vme_moth.cpp')
-rw-r--r--src/qml/jsruntime/qv4vme_moth.cpp93
1 files changed, 58 insertions, 35 deletions
diff --git a/src/qml/jsruntime/qv4vme_moth.cpp b/src/qml/jsruntime/qv4vme_moth.cpp
index b3b9842ba9..3e9f329c9a 100644
--- a/src/qml/jsruntime/qv4vme_moth.cpp
+++ b/src/qml/jsruntime/qv4vme_moth.cpp
@@ -54,6 +54,7 @@
#include <private/qv4regexpobject_p.h>
#include <private/qv4string_p.h>
#include <private/qv4profiling_p.h>
+#include <private/qv4jscall_p.h>
#include <private/qqmljavascriptexpression_p.h>
#include <iostream>
@@ -509,14 +510,15 @@ QV4::ReturnedValue VME::exec(CallData *callData, QV4::Function *function)
Value *jsStackTop = engine->jsStackTop;
- Q_ASSERT(engine->jsStackTop >= callData->args + callData->argc() - 1);
- Value *stack = engine->jsStackTop;
- engine->jsStackTop += sizeof(CallData)/sizeof(Value) - 1 + qMax(callData->argc(), int(function->compiledFunction->nRegisters));
- memcpy(stack, callData, sizeof(CallData) - sizeof(Value) + callData->argc()*sizeof(Value));
- // clear out remaining arguments and local registers
- callData = reinterpret_cast<CallData *>(stack);
- for (Value *v = callData->args + callData->argc(); v < engine->jsStackTop; ++v)
- *v = Encode::undefined();
+ Q_ASSERT(engine->jsStackTop == callData->args + callData->argc());
+ Value *stack = reinterpret_cast<Value *>(callData);
+ int stackSpaceToAdd = int(function->compiledFunction->nRegisters) - callData->argc();
+ if (stackSpaceToAdd > 0) {
+ // clear out remaining arguments and local registers
+ for (int i = 0; i < stackSpaceToAdd; ++i)
+ engine->jsStackTop[i] = Encode::undefined();
+ engine->jsStackTop += stackSpaceToAdd;
+ }
CppStackFrame frame;
frame.parent = engine->currentStackFrame;
@@ -743,60 +745,78 @@ QV4::ReturnedValue VME::exec(CallData *callData, QV4::Function *function)
MOTH_BEGIN_INSTR(CallValue)
STORE_IP();
STORE_ACC();
- QV4::CallData *cData = reinterpret_cast<QV4::CallData *>(stack + callData);
- Q_ASSERT(cData->args + cData->argc() <= engine->jsStackTop);
- acc = Runtime::method_callValue(engine, accumulator, cData);
+ {
+ Scope scope(engine);
+ JSCall cData(scope, stack + argv, argc);
+ Q_ASSERT(cData->args + cData->argc() == engine->jsStackTop);
+ acc = Runtime::method_callValue(engine, accumulator, cData);
+ }
CHECK_EXCEPTION;
MOTH_END_INSTR(CallValue)
MOTH_BEGIN_INSTR(CallProperty)
STORE_IP();
- QV4::CallData *cData = reinterpret_cast<QV4::CallData *>(stack + callData);
- Q_ASSERT(cData->args + cData->argc() <= engine->jsStackTop);
- cData->thisObject = STACK_VALUE(base);
- acc = Runtime::method_callProperty(engine, name, cData);
+ {
+ 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);
+ }
CHECK_EXCEPTION;
MOTH_END_INSTR(CallProperty)
MOTH_BEGIN_INSTR(CallPropertyLookup)
STORE_IP();
- QV4::CallData *cData = reinterpret_cast<QV4::CallData *>(stack + callData);
- Q_ASSERT(cData->args + cData->argc() <= engine->jsStackTop);
- cData->thisObject = STACK_VALUE(base);
- acc = Runtime::method_callPropertyLookup(engine, lookupIndex, cData);
+ {
+ 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);
+ }
CHECK_EXCEPTION;
MOTH_END_INSTR(CallPropertyLookup)
MOTH_BEGIN_INSTR(CallElement)
STORE_IP();
- QV4::CallData *cData = reinterpret_cast<QV4::CallData *>(stack + callData);
- Q_ASSERT(cData->args + cData->argc() <= engine->jsStackTop);
- cData->thisObject = STACK_VALUE(base);
- acc = Runtime::method_callElement(engine, STACK_VALUE(index), cData);
+ {
+ 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);
+ }
CHECK_EXCEPTION;
MOTH_END_INSTR(CallElement)
MOTH_BEGIN_INSTR(CallName)
STORE_IP();
- QV4::CallData *cData = reinterpret_cast<QV4::CallData *>(stack + callData);
- Q_ASSERT(cData->args + cData->argc() <= engine->jsStackTop);
- acc = Runtime::method_callName(engine, name, cData);
+ {
+ Scope scope(engine);
+ JSCall cData(scope, stack + argv, argc);
+ Q_ASSERT(cData->args + cData->argc() == engine->jsStackTop);
+ acc = Runtime::method_callName(engine, name, cData);
+ }
CHECK_EXCEPTION;
MOTH_END_INSTR(CallName)
MOTH_BEGIN_INSTR(CallPossiblyDirectEval)
STORE_IP();
- QV4::CallData *cData = reinterpret_cast<QV4::CallData *>(stack + callData);
- Q_ASSERT(cData->args + cData->argc() <= engine->jsStackTop);
- acc = Runtime::method_callPossiblyDirectEval(engine, cData);
+ {
+ Scope scope(engine);
+ JSCall cData(scope, stack + argv, argc);
+ Q_ASSERT(cData->args + cData->argc() == engine->jsStackTop);
+ acc = Runtime::method_callPossiblyDirectEval(engine, cData);
+ }
CHECK_EXCEPTION;
MOTH_END_INSTR(CallPossiblyDirectEval)
MOTH_BEGIN_INSTR(CallGlobalLookup)
STORE_IP();
- QV4::CallData *cData = reinterpret_cast<QV4::CallData *>(stack + callData);
- Q_ASSERT(cData->args + cData->argc() <= engine->jsStackTop);
- acc = Runtime::method_callGlobalLookup(engine, index, cData);
+ {
+ Scope scope(engine);
+ JSCall cData(scope, stack + argv, argc);
+ Q_ASSERT(cData->args + cData->argc() == engine->jsStackTop);
+ acc = Runtime::method_callGlobalLookup(engine, index, cData);
+ }
CHECK_EXCEPTION;
MOTH_END_INSTR(CallGlobalLookup)
@@ -943,9 +963,12 @@ QV4::ReturnedValue VME::exec(CallData *callData, QV4::Function *function)
MOTH_BEGIN_INSTR(Construct)
STORE_IP();
- QV4::CallData *cData = reinterpret_cast<QV4::CallData *>(stack + callData);
- Q_ASSERT(cData->args + cData->argc() <= engine->jsStackTop);
- acc = Runtime::method_construct(engine, STACK_VALUE(func), cData);
+ {
+ 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);
+ }
CHECK_EXCEPTION;
MOTH_END_INSTR(Construct)