Skip to content

Commit

Permalink
[[FIX]] Disallow YieldExpression in gnrtr params
Browse files Browse the repository at this point in the history
  • Loading branch information
jugglinmike committed Jan 27, 2019
1 parent 3fc9c19 commit 17ca4e4
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 17 deletions.
16 changes: 12 additions & 4 deletions src/jshint.js
Original file line number Diff line number Diff line change
Expand Up @@ -3645,6 +3645,7 @@ var JSHINT = (function() {
state.funct["(metrics)"].arity = paramsInfo.arity;
state.funct["(metrics)"].verifyMaxParametersPerFunction();
} else {
state.funct["(params)"] = [];
state.funct["(metrics)"].arity = 0;
state.funct["(hasSimpleParams)"] = true;
}
Expand Down Expand Up @@ -3803,7 +3804,7 @@ var JSHINT = (function() {
//object literals
(function(x) {
x.nud = function(context) {
var b, f, i, p, t, isGeneratorMethod = false, nextVal;
var b, f, i, params, t, isGeneratorMethod = false, nextVal;
var props = Object.create(null); // All properties, including accessors

b = state.tokens.curr.line !== startLine(state.tokens.next);
Expand Down Expand Up @@ -3867,11 +3868,11 @@ var JSHINT = (function() {

t = state.tokens.next;
f = doFunction(context, { isMethod: true });
p = f["(params)"];
params = f["(params)"];

// Don't warn about getter/setter pairs if this is an ES6 concise method
if (nextVal === "get" && i && p) {
warning("W076", t, p[0], i);
if (nextVal === "get" && i && params.length) {
warning("W076", t, params[0], i);
} else if (nextVal === "set" && i && f["(metrics)"].arity !== 1) {
warning("W077", t, i);
}
Expand Down Expand Up @@ -5105,6 +5106,13 @@ var JSHINT = (function() {
}
var prev = state.tokens.prev;

// If the parameters of the current function scope have not been defined,
// it is because the current expression is contained within the parameter
// list.
if (!state.funct["(params)"]) {
error("E024", this, "yield");
}

if (!this.beginsStmt && prev.lbp > 30 && !checkPunctuators(prev, ["("])) {
error("E061", this);
}
Expand Down
13 changes: 0 additions & 13 deletions tests/test262/expectations.txt
Original file line number Diff line number Diff line change
Expand Up @@ -516,8 +516,6 @@ test/language/expressions/template-literal/tv-utf16-escape-sequence.js(strict mo
test/language/expressions/function/param-dflt-yield-non-strict.js(default)
test/language/expressions/function/scope-param-rest-elem-var-close.js(default)
test/language/expressions/function/scope-param-rest-elem-var-open.js(default)
test/language/expressions/generators/param-dflt-yield.js(default)
test/language/expressions/generators/param-dflt-yield.js(strict mode)
test/language/expressions/generators/scope-param-rest-elem-var-close.js(default)
test/language/expressions/generators/scope-param-rest-elem-var-open.js(default)
test/language/expressions/generators/yield-as-function-expression-binding-identifier.js(default)
Expand All @@ -526,12 +524,8 @@ test/language/expressions/generators/yield-as-logical-or-expression.js(default)
test/language/expressions/generators/yield-as-logical-or-expression.js(strict mode)
test/language/expressions/generators/yield-star-after-newline.js(default)
test/language/expressions/generators/yield-star-after-newline.js(strict mode)
test/language/expressions/class/gen-method-param-dflt-yield.js(default)
test/language/expressions/class/gen-method-param-dflt-yield.js(strict mode)
test/language/expressions/class/getter-param-dflt.js(default)
test/language/expressions/class/getter-param-dflt.js(strict mode)
test/language/expressions/class/static-gen-method-param-dflt-yield.js(default)
test/language/expressions/class/static-gen-method-param-dflt-yield.js(strict mode)
test/language/expressions/assignment/dstr-array-elem-init-simple-no-strict.js(default)
test/language/expressions/assignment/dstr-array-elem-init-yield-ident-valid.js(default)
test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close-err.js(default)
Expand Down Expand Up @@ -613,7 +607,6 @@ test/language/expressions/object/method-definition/async-super-call-body.js(defa
test/language/expressions/object/method-definition/async-super-call-body.js(strict mode)
test/language/expressions/object/method-definition/async-super-call-param.js(default)
test/language/expressions/object/method-definition/async-super-call-param.js(strict mode)
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/name-param-id-yield.js(default)
Expand Down Expand Up @@ -708,8 +701,6 @@ test/language/statements/if/if-stmt-else-decl-strict.js(strict mode)
test/language/statements/if/if-stmt-else-fun-strict.js(strict mode)
test/language/statements/if/if-stmt-else-gen.js(default)
test/language/statements/if/if-stmt-else-gen.js(strict mode)
test/language/statements/generators/param-dflt-yield.js(default)
test/language/statements/generators/param-dflt-yield.js(strict mode)
test/language/statements/generators/scope-param-rest-elem-var-close.js(default)
test/language/statements/generators/scope-param-rest-elem-var-open.js(default)
test/language/statements/generators/yield-as-function-expression-binding-identifier.js(default)
Expand Down Expand Up @@ -872,12 +863,8 @@ test/language/statements/let/syntax/with-initialisers-in-statement-positions-lab
test/language/statements/let/syntax/with-initialisers-in-statement-positions-label-statement.js(strict mode)
test/language/statements/let/syntax/without-initialisers-in-statement-positions-label-statement.js(default)
test/language/statements/let/syntax/without-initialisers-in-statement-positions-label-statement.js(strict mode)
test/language/statements/class/gen-method-param-dflt-yield.js(default)
test/language/statements/class/gen-method-param-dflt-yield.js(strict mode)
test/language/statements/class/getter-param-dflt.js(default)
test/language/statements/class/getter-param-dflt.js(strict mode)
test/language/statements/class/static-gen-method-param-dflt-yield.js(default)
test/language/statements/class/static-gen-method-param-dflt-yield.js(strict mode)
test/language/statements/class/definition/class-method-returns-promise.js(default)
test/language/statements/class/definition/class-method-returns-promise.js(strict mode)
test/language/statements/class/definition/methods-async-super-call-body.js(default)
Expand Down
12 changes: 12 additions & 0 deletions tests/unit/parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -3781,6 +3781,18 @@ exports["esnext generator"] = function (test) {
TestRun(test)
.test(code, {esnext: true, unused: true, undef: true, predef: ["print"]});

TestRun(test, "YieldExpression in parameters - declaration")
.addError(1, 18, "Unexpected 'yield'.")
.test("function * g(x = yield) { yield; }", { esversion: 6 });

TestRun(test, "YieldExpression in parameters - expression")
.addError(1, 22, "Unexpected 'yield'.")
.test("void function * (x = yield) { yield; };", { esversion: 6 });

TestRun(test, "YieldExpression in parameters - method")
.addError(1, 16, "Unexpected 'yield'.")
.test("void { * g(x = yield) { yield; } };", { esversion: 6 });

test.done();
};

Expand Down

0 comments on commit 17ca4e4

Please sign in to comment.