From bc9e86ef5813f6c2b28a2e10324cf0a2401e53df Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Fri, 9 May 2014 13:10:16 +0200 Subject: V4: support calling constants. Consider: function f() { var a; a(); } Here the constant propagation will propagate the value for a (undefined) to the call site. This was not yet handled, resulting in Q_UNIMPLEMENTED warnings when running a debug build. Change-Id: I5f85f681d975b54df7a9e00bd5b50e6f4350139a Reviewed-by: Simon Hausmann --- src/qml/compiler/qv4isel_p.cpp | 6 +++--- src/qml/jit/qv4isel_masm.cpp | 11 ++++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/qml/compiler/qv4isel_p.cpp b/src/qml/compiler/qv4isel_p.cpp index f5cb1905c5..1aa0c4dad8 100644 --- a/src/qml/compiler/qv4isel_p.cpp +++ b/src/qml/compiler/qv4isel_p.cpp @@ -239,7 +239,7 @@ void IRDecoder::visitExp(IR::Exp *s) // These are calls where the result is ignored. if (c->base->asName()) { callBuiltin(c, 0); - } else if (c->base->asTemp() || c->base->asArgLocal()) { + } else if (c->base->asTemp() || c->base->asArgLocal() || c->base->asConst()) { callValue(c->base, c->args, 0); } else if (Member *member = c->base->asMember()) { Q_ASSERT(member->base->asTemp() || member->base->asArgLocal()); @@ -247,10 +247,10 @@ void IRDecoder::visitExp(IR::Exp *s) } else if (Subscript *s = c->base->asSubscript()) { callSubscript(s->base, s->index, c->args, 0); } else { - Q_UNIMPLEMENTED(); + Q_UNREACHABLE(); } } else { - Q_UNIMPLEMENTED(); + Q_UNREACHABLE(); } } diff --git a/src/qml/jit/qv4isel_masm.cpp b/src/qml/jit/qv4isel_masm.cpp index 8d732ce657..b9cbc72b7f 100644 --- a/src/qml/jit/qv4isel_masm.cpp +++ b/src/qml/jit/qv4isel_masm.cpp @@ -532,9 +532,14 @@ void InstructionSelection::callValue(IR::Expr *value, IR::ExprList *args, IR::Ex Q_ASSERT(value); prepareCallData(args, 0); - generateFunctionCall(result, Runtime::callValue, Assembler::ContextRegister, - Assembler::Reference(value), - baseAddressForCallData()); + if (value->asConst()) + generateFunctionCall(result, Runtime::callValue, Assembler::ContextRegister, + Assembler::PointerToValue(value), + baseAddressForCallData()); + else + generateFunctionCall(result, Runtime::callValue, Assembler::ContextRegister, + Assembler::Reference(value), + baseAddressForCallData()); } void InstructionSelection::loadThisObject(IR::Expr *temp) -- cgit v1.2.3