From 6d72378043ac836442dc4bd0f0e407062d161d9b Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Thu, 29 Nov 2012 14:35:18 +0100 Subject: [PATCH] Fix outgoing argument start position. Change-Id: Ie1b86746dc578ce479f5c072e2e1190826a7739c Reviewed-by: Lars Knoll --- moth/qv4isel_moth.cpp | 4 ++-- moth/qv4isel_moth_p.h | 5 ++++- moth/qv4vme_moth.cpp | 39 ++++++++++++++++++++++++++++++--------- 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/moth/qv4isel_moth.cpp b/moth/qv4isel_moth.cpp index 382b34e..d166789 100644 --- a/moth/qv4isel_moth.cpp +++ b/moth/qv4isel_moth.cpp @@ -201,7 +201,7 @@ void InstructionSelection::operator()(IR::Function *function) _function->code = VME::exec; _function->codeData = _code; - int locals = _function->tempCount - _function->locals.size() + _function->maxNumberOfArguments + 1; + int locals = frameSize(); assert(locals >= 0); Instruction::Push push; @@ -446,7 +446,7 @@ void InstructionSelection::prepareCallArgs(IR::ExprList *e, quint32 &argc, quint args = e->expr->asTemp()->index; } else if (e) { // We need to move all the temps into the function arg array - int argLocation = _function->tempCount - _function->locals.size(); + int argLocation = outgoingArgumentTempStart(); assert(argLocation >= 0); args = argLocation; while (e) { diff --git a/moth/qv4isel_moth_p.h b/moth/qv4isel_moth_p.h index 043958b..6fe5259 100644 --- a/moth/qv4isel_moth_p.h +++ b/moth/qv4isel_moth_p.h @@ -43,7 +43,10 @@ private: void callProperty(IR::Call *c, int targetTempIndex); void construct(IR::New *ctor, int targetTempIndex); void prepareCallArgs(IR::ExprList *, quint32 &, quint32 &); - int scratchTempIndex() { return _function->tempCount - _function->locals.size() + _function->maxNumberOfArguments; } + + int outgoingArgumentTempStart() const { return _function->tempCount; } + int scratchTempIndex() const { return outgoingArgumentTempStart() + _function->maxNumberOfArguments; } + int frameSize() const { return scratchTempIndex() + 1 - _function->locals.size(); } template inline ptrdiff_t addInstruction(const InstrData &data); diff --git a/moth/qv4vme_moth.cpp b/moth/qv4vme_moth.cpp index 5a0ba30..87d50a3 100644 --- a/moth/qv4vme_moth.cpp +++ b/moth/qv4vme_moth.cpp @@ -155,7 +155,11 @@ VM::Value VME::operator()(QQmlJS::VM::ExecutionContext *context, const uchar *co MOTH_END_INSTR(LoadString) MOTH_BEGIN_INSTR(LoadClosure) - TEMP(instr.targetTempIndex) = __qmljs_init_closure(instr.value, context); + VM::Value c = __qmljs_init_closure(instr.value, context); + TEMP(instr.targetTempIndex) = c; +#ifdef DO_TRACE_INSTR + qDebug() << "loaded:" << c.toString(context)->toQString(); +#endif MOTH_END_INSTR(LoadClosure) MOTH_BEGIN_INSTR(LoadName) @@ -197,18 +201,32 @@ VM::Value VME::operator()(QQmlJS::VM::ExecutionContext *context, const uchar *co MOTH_END_INSTR(Push) MOTH_BEGIN_INSTR(CallValue) - TRACE(Call, "argStart = %d, argc = %d, result temp index = %d", instr.args, instr.argc, instr.targetTempIndex); - VM::Value *args = stack.data() + instr.args; +#ifdef DO_TRACE_INSTR + if (Debugging::Debugger *debugger = context->engine->debugger) { + if (VM::FunctionObject *o = (TEMP(instr.destIndex)).asFunctionObject()) { + if (Debugging::FunctionDebugInfo *info = debugger->debugInfo(o)) { + QString n = debugger->name(o); + std::cerr << "*** Call to \"" << (n.isNull() ? "" : qPrintable(n)) << "\" defined @" << info->startLine << ":" << info->startColumn << std::endl; + } + } + } +#endif // DO_TRACE_INSTR + quint32 argStart = instr.args - context->variableEnvironment->varCount; + TRACE(Call, "value index = %d, argStart = %d, argc = %d, result temp index = %d", instr.destIndex, argStart, instr.argc, instr.targetTempIndex); + VM::Value *args = stack.data() + argStart; TEMP(instr.targetTempIndex) = __qmljs_call_value(context, VM::Value::undefinedValue(), TEMP(instr.destIndex), args, instr.argc); MOTH_END_INSTR(CallValue) MOTH_BEGIN_INSTR(CallProperty) - VM::Value *args = stack.data() + instr.args; - TEMP(instr.targetTempIndex) = __qmljs_call_property(context, TEMP(instr.baseTemp), instr.name, args, instr.argc); + quint32 argStart = instr.args - context->variableEnvironment->varCount; + VM::Value *args = stack.data() + argStart; + VM::Value base = TEMP(instr.baseTemp); + TEMP(instr.targetTempIndex) = __qmljs_call_property(context, base, instr.name, args, instr.argc); MOTH_END_INSTR(CallProperty) MOTH_BEGIN_INSTR(CallBuiltin) - VM::Value *args = stack.data() + instr.args; + quint32 argStart = instr.args - context->variableEnvironment->varCount; + VM::Value *args = stack.data() + argStart; void *buf; switch (instr.builtin) { case Instr::instr_callBuiltin::builtin_typeof: @@ -287,18 +305,21 @@ VM::Value VME::operator()(QQmlJS::VM::ExecutionContext *context, const uchar *co MOTH_END_INSTR(CallBuiltinDeleteValue) MOTH_BEGIN_INSTR(CreateValue) - VM::Value *args = stack.data() + instr.args; + quint32 argStart = instr.args - context->variableEnvironment->varCount; + VM::Value *args = stack.data() + argStart; TEMP(instr.targetTempIndex) = __qmljs_construct_value(context, TEMP(instr.func), args, instr.argc); MOTH_END_INSTR(CreateValue) MOTH_BEGIN_INSTR(CreateProperty) - VM::Value *args = stack.data() + instr.args; + quint32 argStart = instr.args - context->variableEnvironment->varCount; + VM::Value *args = stack.data() + argStart; TEMP(instr.targetTempIndex) = __qmljs_construct_property(context, TEMP(instr.base), instr.name, args, instr.argc); MOTH_END_INSTR(CreateProperty) MOTH_BEGIN_INSTR(CreateActivationProperty) TRACE(inline, "property name = %s, argc = %d", instr.name->toQString().toUtf8().constData(), instr.argc); - VM::Value *args = stack.data() + instr.args; + quint32 argStart = instr.args - context->variableEnvironment->varCount; + VM::Value *args = stack.data() + argStart; TEMP(instr.targetTempIndex) = __qmljs_construct_activation_property(context, instr.name, args, instr.argc); MOTH_END_INSTR(CreateActivationProperty) -- 2.7.4