Skip to content

Commit

Permalink
[[FIX]] Disallow dups in non-simple parameter list
Browse files Browse the repository at this point in the history
Re-use the `(hasSimpleParams)` property of the `funct` object (recently
introduced to implement ES2016 restrictions on the "use strict"
directive) to honor the early error for duplicate parameters.
  • Loading branch information
jugglinmike committed Jan 14, 2019
1 parent 030d6b4 commit 4a5a4a5
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 7 deletions.
11 changes: 10 additions & 1 deletion src/scope-manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -542,6 +542,15 @@ var scopeManager = function(state, predefined, exported, declared) {
validateParams: function(isArrow) {
var isStrict = state.isStrict();
var currentFunctParamScope = _currentFunctBody["(parent)"];
// From ECMAScript 2017:
//
// > 14.1.2Static Semantics: Early Errors
// >
// > [...]
// > - It is a Syntax Error if IsSimpleParameterList of
// > FormalParameterList is false and BoundNames of FormalParameterList
// > contains any duplicate elements.
var isSimple = state.funct['(hasSimpleParams)'];

if (!currentFunctParamScope["(params)"]) {
return;
Expand All @@ -551,7 +560,7 @@ var scopeManager = function(state, predefined, exported, declared) {
var label = currentFunctParamScope["(labels)"][labelName];

if (label.duplicated) {
if (isStrict || isArrow) {
if (isStrict || isArrow || !isSimple) {
warning("E011", label["(token)"], labelName);
} else if (state.option.shadow !== true) {
warning("W004", label["(token)"], labelName);
Expand Down
6 changes: 0 additions & 6 deletions tests/test262/expectations.txt
Original file line number Diff line number Diff line change
Expand Up @@ -618,8 +618,6 @@ test/language/expressions/object/method-definition/async-super-call-param.js(str
test/language/expressions/object/method-definition/generator-param-init-yield.js(default)
test/language/expressions/object/method-definition/generator-prop-name-yield-expr.js(default)
test/language/expressions/object/method-definition/generator-prop-name-yield-id.js(default)
test/language/expressions/object/method-definition/gen-meth-dflt-params-duplicates.js(default)
test/language/expressions/object/method-definition/meth-dflt-params-duplicates.js(default)
test/language/expressions/object/method-definition/name-param-id-yield.js(default)
test/language/expressions/object/method-definition/name-param-init-yield.js(default)
test/language/expressions/object/method-definition/name-prop-name-yield-expr.js(default)
Expand Down Expand Up @@ -2561,7 +2559,6 @@ test/built-ins/Function/prototype/toString/async-method-class-statement.js(stric
test/built-ins/Function/prototype/toString/async-method-object.js(default)
test/built-ins/Function/prototype/toString/async-method-object.js(strict mode)

test/language/expressions/generators/dflt-params-duplicates.js(default)
test/language/expressions/generators/dflt-params-ref-later.js(default)
test/language/expressions/generators/dflt-params-ref-later.js(strict mode)
test/language/expressions/generators/dflt-params-ref-self.js(default)
Expand Down Expand Up @@ -3608,7 +3605,6 @@ test/language/expressions/async-generator/yield-star-sync-return.js(default)
test/language/expressions/async-generator/yield-star-sync-return.js(strict mode)
test/language/expressions/async-generator/yield-star-sync-throw.js(default)
test/language/expressions/async-generator/yield-star-sync-throw.js(strict mode)
test/language/expressions/function/dflt-params-duplicates.js(default)
test/language/expressions/function/dflt-params-ref-later.js(default)
test/language/expressions/function/dflt-params-ref-later.js(strict mode)
test/language/expressions/function/dflt-params-ref-self.js(default)
Expand Down Expand Up @@ -5989,7 +5985,6 @@ test/language/statements/for/dstr-const-obj-ptrn-rest-obj-nested-rest.js(default
test/language/statements/for/dstr-const-obj-ptrn-rest-obj-nested-rest.js(strict mode)
test/language/statements/for/dstr-const-obj-ptrn-rest-obj-own-property.js(default)
test/language/statements/for/dstr-const-obj-ptrn-rest-obj-own-property.js(strict mode)
test/language/statements/function/dflt-params-duplicates.js(default)
test/language/statements/function/dflt-params-ref-later.js(default)
test/language/statements/function/dflt-params-ref-later.js(strict mode)
test/language/statements/function/dflt-params-ref-self.js(default)
Expand All @@ -6000,7 +5995,6 @@ test/language/statements/function/params-trailing-comma-multiple.js(default)
test/language/statements/function/params-trailing-comma-multiple.js(strict mode)
test/language/statements/function/params-trailing-comma-single.js(default)
test/language/statements/function/params-trailing-comma-single.js(strict mode)
test/language/statements/generators/dflt-params-duplicates.js(default)
test/language/statements/generators/dflt-params-ref-later.js(default)
test/language/statements/generators/dflt-params-ref-later.js(strict mode)
test/language/statements/generators/dflt-params-ref-self.js(default)
Expand Down

0 comments on commit 4a5a4a5

Please sign in to comment.