aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4functionobject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/jsruntime/qv4functionobject.cpp')
-rw-r--r--src/qml/jsruntime/qv4functionobject.cpp14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/qml/jsruntime/qv4functionobject.cpp b/src/qml/jsruntime/qv4functionobject.cpp
index 36c5c4441a..716678d2f8 100644
--- a/src/qml/jsruntime/qv4functionobject.cpp
+++ b/src/qml/jsruntime/qv4functionobject.cpp
@@ -305,6 +305,7 @@ ReturnedValue FunctionPrototype::method_apply(const BuiltinFunction *b, CallData
return v4->throwTypeError();
} else {
callData->setArgc(0);
+ v4->jsStackTop = callData->args;
}
return o->call(callData);
@@ -312,16 +313,19 @@ ReturnedValue FunctionPrototype::method_apply(const BuiltinFunction *b, CallData
ReturnedValue FunctionPrototype::method_call(const BuiltinFunction *b, CallData *callData)
{
- if (!callData->thisObject.isFunctionObject()) {
- ExecutionEngine *e = b->engine();
- return e->throwTypeError();
- }
+ ExecutionEngine *engine = b->engine();
+ if (!callData->thisObject.isFunctionObject())
+ return engine->throwTypeError();
+
+ Q_ASSERT(engine->jsStackTop == callData->args + callData->argc());
+
callData->function = callData->thisObject;
callData->thisObject = callData->argc() ? callData->args[0] : Primitive::undefinedValue();
if (callData->argc()) {
callData->setArgc(callData->argc() - 1);
for (int i = 0, ei = callData->argc(); i < ei; ++i)
callData->args[i] = callData->args[i + 1];
+ --engine->jsStackTop;
}
return static_cast<FunctionObject &>(callData->function).call(callData);
}
@@ -354,12 +358,12 @@ ReturnedValue ScriptFunction::construct(const Managed *that, CallData *callData)
const ScriptFunction *f = static_cast<const ScriptFunction *>(that);
InternalClass *ic = f->classForConstructor();
+ callData->context = f->scope();
callData->thisObject = v4->memoryManager->allocObject<Object>(ic);
QV4::Function *v4Function = f->function();
Q_ASSERT(v4Function);
- callData->context = f->scope();
ReturnedValue result = v4Function->call(callData);
if (Q_UNLIKELY(v4->hasException))