Fix failing assertion in debug builds for JS that calls constants

For
    true()

we generate IR that looks like this:

    temp = true
    result = call temp()

and therefore the move at isel time has IR::Call as source and a temp
as base for the call. However constant propagation in the optimizer transforms
this to

    result = call true()

and that's a case we didn't handle in the IR visitor. Since we have
Runtime::callValue we can however handle this case as well and the run-time
will consequently produce the expected run-time error.

Change-Id: Ia94a8116388e66f9f339913307f68e33a5c18a19
Task-number: QTBUG-43819
Reviewed-by: Robin Burchell <robin.burchell@viroteck.net>
Reviewed-by: Jan Kundrát <jkt@kde.org>
Reviewed-by: Erik Verbruggen <erik.verbruggen@theqtcompany.com>
This commit is contained in:
Simon Hausmann 2015-01-13 16:59:22 +01:00 committed by Simon Hausmann
parent 88e87647c3
commit 0bba8d7411
3 changed files with 4 additions and 2 deletions

View File

@ -182,7 +182,7 @@ void IRDecoder::visitMove(IR::Move *s)
} else if (Subscript *ss = c->base->asSubscript()) {
callSubscript(ss->base, ss->index, c->args, s->target);
return;
} else if (c->base->asTemp() || c->base->asArgLocal()) {
} else if (c->base->asTemp() || c->base->asArgLocal() || c->base->asConst()) {
callValue(c->base, c->args, s->target);
return;
}

View File

@ -961,7 +961,7 @@ ReturnedValue Runtime::callElement(ExecutionContext *context, const ValueRef ind
ReturnedValue Runtime::callValue(ExecutionContext *context, const ValueRef func, CallData *callData)
{
if (!func->isObject())
return context->throwTypeError();
return context->throwTypeError(QStringLiteral("%1 is not a function").arg(func->toQStringNoThrow()));
return func->objectValue()->call(callData);
}

View File

@ -3140,6 +3140,8 @@ void tst_QJSEngine::callConstants()
" var one; one();\n"
" var two = null; two();\n"
"}\n");
QJSValue exceptionResult = engine.evaluate("true()");
QCOMPARE(exceptionResult.toString(), QString("TypeError: true is not a function"));
}
void tst_QJSEngine::installTranslatorFunctions()