aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4context.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2017-11-06 16:14:46 +0100
committerLars Knoll <lars.knoll@qt.io>2017-11-15 18:46:46 +0000
commit6b738e3224c26fcce148b569188e2a25520e54d6 (patch)
treebe505078357b95574d6b59f6832bfa78cf3a63e6 /src/qml/jsruntime/qv4context.cpp
parent557ea845157d4f6b757ec2eebbc71e1af9910cc6 (diff)
Don't copy unnamed arguments onto the JS stack
These can only be referenced through the arguments objects, and have so far messed up initialization of local variables. Change-Id: I3100520ed55c93204dd7953da8cc3d2b7d200d11 Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4context.cpp')
-rw-r--r--src/qml/jsruntime/qv4context.cpp16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/qml/jsruntime/qv4context.cpp b/src/qml/jsruntime/qv4context.cpp
index 86b1f0eb2c..00d816fe91 100644
--- a/src/qml/jsruntime/qv4context.cpp
+++ b/src/qml/jsruntime/qv4context.cpp
@@ -55,9 +55,12 @@ DEFINE_MANAGED_VTABLE(ExecutionContext);
DEFINE_MANAGED_VTABLE(CallContext);
DEFINE_MANAGED_VTABLE(CatchContext);
-Heap::CallContext *ExecutionContext::newCallContext(Heap::ExecutionContext *outer, Function *function, CallData *callData)
+Heap::CallContext *ExecutionContext::newCallContext(CppStackFrame *frame)
{
- uint nFormals = qMax(static_cast<uint>(callData->argc()), function->nFormals);
+ Function *function = frame->v4Function;
+ Heap::ExecutionContext *outer = static_cast<Heap::ExecutionContext *>(frame->context()->m());
+
+ uint nFormals = qMax(static_cast<uint>(frame->originalArgumentsCount), function->nFormals);
uint localsAndFormals = function->compiledFunction->nLocals + nFormals;
size_t requiredMemory = sizeof(CallContext::Data) - sizeof(Value) + sizeof(Value) * (localsAndFormals);
@@ -66,7 +69,7 @@ Heap::CallContext *ExecutionContext::newCallContext(Heap::ExecutionContext *oute
c->init();
c->outer.set(v4, outer);
- c->function.set(v4, static_cast<Heap::FunctionObject *>(callData->function.m()));
+ c->function.set(v4, static_cast<Heap::FunctionObject *>(frame->jsFrame->function.m()));
const CompiledData::Function *compiledFunction = function->compiledFunction;
uint nLocals = compiledFunction->nLocals;
@@ -75,8 +78,11 @@ Heap::CallContext *ExecutionContext::newCallContext(Heap::ExecutionContext *oute
// memory allocated from the JS heap is 0 initialized, so check if undefined is 0
Q_ASSERT(Primitive::undefinedValue().asReturnedValue() == 0);
- ::memcpy(c->locals.values + nLocals, &callData->args[0], nFormals * sizeof(Value));
- c->nArgs = callData->argc();
+ Value *args = c->locals.values + nLocals;
+ ::memcpy(args, frame->originalArguments, frame->originalArgumentsCount * sizeof(Value));
+ c->nArgs = frame->originalArgumentsCount;
+ for (uint i = frame->originalArgumentsCount; i < function->nFormals; ++i)
+ args[i] = Encode::undefined();
return c;
}