зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1096376 - Disallow duplicated parameter when rest parameter is present in non-strict mode. r=jorendorff
This commit is contained in:
Родитель
ccf2a28b15
Коммит
31be31c228
|
@ -1626,6 +1626,7 @@ Parser<ParseHandler>::functionArguments(FunctionSyntaxKind kind, FunctionType ty
|
||||||
bool hasDefaults = false;
|
bool hasDefaults = false;
|
||||||
Node duplicatedArg = null();
|
Node duplicatedArg = null();
|
||||||
Node list = null();
|
Node list = null();
|
||||||
|
bool disallowDuplicateArgs = false;
|
||||||
|
|
||||||
if (type == Getter) {
|
if (type == Getter) {
|
||||||
report(ParseError, false, null(), JSMSG_ACCESSOR_WRONG_ARGS, "getter", "no", "s");
|
report(ParseError, false, null(), JSMSG_ACCESSOR_WRONG_ARGS, "getter", "no", "s");
|
||||||
|
@ -1647,6 +1648,7 @@ Parser<ParseHandler>::functionArguments(FunctionSyntaxKind kind, FunctionType ty
|
||||||
case TOK_LC:
|
case TOK_LC:
|
||||||
{
|
{
|
||||||
/* See comment below in the TOK_NAME case. */
|
/* See comment below in the TOK_NAME case. */
|
||||||
|
disallowDuplicateArgs = true;
|
||||||
if (duplicatedArg) {
|
if (duplicatedArg) {
|
||||||
report(ParseError, false, duplicatedArg, JSMSG_BAD_DUP_ARGS);
|
report(ParseError, false, duplicatedArg, JSMSG_BAD_DUP_ARGS);
|
||||||
return false;
|
return false;
|
||||||
|
@ -1719,6 +1721,12 @@ Parser<ParseHandler>::functionArguments(FunctionSyntaxKind kind, FunctionType ty
|
||||||
report(ParseError, false, null(), JSMSG_NO_REST_NAME);
|
report(ParseError, false, null(), JSMSG_NO_REST_NAME);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
disallowDuplicateArgs = true;
|
||||||
|
if (duplicatedArg) {
|
||||||
|
// Has duplicated args before the rest parameter.
|
||||||
|
report(ParseError, false, duplicatedArg, JSMSG_BAD_DUP_ARGS);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
goto TOK_NAME;
|
goto TOK_NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1729,7 +1737,6 @@ Parser<ParseHandler>::functionArguments(FunctionSyntaxKind kind, FunctionType ty
|
||||||
funbox->setStart(tokenStream);
|
funbox->setStart(tokenStream);
|
||||||
|
|
||||||
RootedPropertyName name(context, tokenStream.currentName());
|
RootedPropertyName name(context, tokenStream.currentName());
|
||||||
bool disallowDuplicateArgs = funbox->hasDestructuringArgs || hasDefaults;
|
|
||||||
if (!defineArg(funcpn, name, disallowDuplicateArgs, &duplicatedArg))
|
if (!defineArg(funcpn, name, disallowDuplicateArgs, &duplicatedArg))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -1747,6 +1754,7 @@ Parser<ParseHandler>::functionArguments(FunctionSyntaxKind kind, FunctionType ty
|
||||||
report(ParseError, false, null(), JSMSG_REST_WITH_DEFAULT);
|
report(ParseError, false, null(), JSMSG_REST_WITH_DEFAULT);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
disallowDuplicateArgs = true;
|
||||||
if (duplicatedArg) {
|
if (duplicatedArg) {
|
||||||
report(ParseError, false, duplicatedArg, JSMSG_BAD_DUP_ARGS);
|
report(ParseError, false, duplicatedArg, JSMSG_BAD_DUP_ARGS);
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
// Make sure duplicated name is allowed in non-strict.
|
||||||
|
function f0(a, a) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// SyntaxError should be thrown if rest parameter name is duplicated.
|
||||||
|
assertThrowsInstanceOf(() => eval(`
|
||||||
|
function f1(a, ...a) {
|
||||||
|
}
|
||||||
|
`), SyntaxError);
|
||||||
|
|
||||||
|
// SyntaxError should be thrown if there is a duplicated parameter.
|
||||||
|
assertThrowsInstanceOf(() => eval(`
|
||||||
|
function f2(a, a, ...b) {
|
||||||
|
}
|
||||||
|
`), SyntaxError);
|
||||||
|
|
||||||
|
reportCompare(0, 0, 'ok');
|
Загрузка…
Ссылка в новой задаче