Arguments passed to functions should shadow the function name
Task-number: QTBUG-65140 Change-Id: I6c6b24f081b31ef0f16fec9b2024485acec11c2d Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
This commit is contained in:
parent
4a29f6881b
commit
4588e73020
|
|
@ -130,13 +130,15 @@ void ScanFunctions::checkName(const QStringRef &name, const SourceLocation &loc)
|
|||
}
|
||||
}
|
||||
}
|
||||
void ScanFunctions::checkForArguments(AST::FormalParameterList *parameters)
|
||||
|
||||
bool ScanFunctions::formalsContainName(AST::FormalParameterList *parameters, const QString &name)
|
||||
{
|
||||
while (parameters) {
|
||||
if (parameters->name == QLatin1String("arguments"))
|
||||
_context->usesArgumentsObject = Context::ArgumentsObjectNotUsed;
|
||||
if (parameters->name == name)
|
||||
return true;
|
||||
parameters = parameters->next;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ScanFunctions::visit(Program *ast)
|
||||
|
|
@ -398,9 +400,11 @@ void ScanFunctions::enterFunction(Node *ast, const QString &name, FormalParamete
|
|||
}
|
||||
|
||||
enterEnvironment(ast, FunctionCode);
|
||||
checkForArguments(formals);
|
||||
if (formalsContainName(formals, QStringLiteral("arguments")))
|
||||
_context->usesArgumentsObject = Context::ArgumentsObjectNotUsed;
|
||||
|
||||
if (!name.isEmpty())
|
||||
|
||||
if (!name.isEmpty() && !formalsContainName(formals, name))
|
||||
_context->addLocalVar(name, Context::ThisFunctionName, QQmlJS::AST::VariableDeclaration::FunctionScope);
|
||||
_context->formals = formals;
|
||||
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ protected:
|
|||
void checkDirectivePrologue(AST::SourceElements *ast);
|
||||
|
||||
void checkName(const QStringRef &name, const AST::SourceLocation &loc);
|
||||
void checkForArguments(AST::FormalParameterList *parameters);
|
||||
bool formalsContainName(AST::FormalParameterList *parameters, const QString &name);
|
||||
|
||||
bool visit(AST::Program *ast) override;
|
||||
void endVisit(AST::Program *) override;
|
||||
|
|
|
|||
|
|
@ -347,6 +347,7 @@ private slots:
|
|||
void manyArguments();
|
||||
void forInIterator();
|
||||
void localForInIterator();
|
||||
void shadowedFunctionName();
|
||||
|
||||
private:
|
||||
// static void propertyVarWeakRefCallback(v8::Persistent<v8::Value> object, void* parameter);
|
||||
|
|
@ -8423,6 +8424,20 @@ void tst_qqmlecmascript::localForInIterator()
|
|||
QCOMPARE(ret.toString(), QStringLiteral("3"));
|
||||
}
|
||||
|
||||
void tst_qqmlecmascript::shadowedFunctionName()
|
||||
{
|
||||
// verify that arguments shadow the function name
|
||||
QJSEngine engine;
|
||||
QJSValue v = engine.evaluate(QString::fromLatin1(
|
||||
"function f(f) { return f; }\n"
|
||||
"f(true)\n"
|
||||
));
|
||||
QVERIFY(!v.isError());
|
||||
QVERIFY(v.isBool());
|
||||
QCOMPARE(v.toBool(), true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
QTEST_MAIN(tst_qqmlecmascript)
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue