Skip to content

Commit 17ca4e4

Browse files
committed
[[FIX]] Disallow YieldExpression in gnrtr params
1 parent 3fc9c19 commit 17ca4e4

File tree

3 files changed

+24
-17
lines changed

3 files changed

+24
-17
lines changed

src/jshint.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3645,6 +3645,7 @@ var JSHINT = (function() {
36453645
state.funct["(metrics)"].arity = paramsInfo.arity;
36463646
state.funct["(metrics)"].verifyMaxParametersPerFunction();
36473647
} else {
3648+
state.funct["(params)"] = [];
36483649
state.funct["(metrics)"].arity = 0;
36493650
state.funct["(hasSimpleParams)"] = true;
36503651
}
@@ -3803,7 +3804,7 @@ var JSHINT = (function() {
38033804
//object literals
38043805
(function(x) {
38053806
x.nud = function(context) {
3806-
var b, f, i, p, t, isGeneratorMethod = false, nextVal;
3807+
var b, f, i, params, t, isGeneratorMethod = false, nextVal;
38073808
var props = Object.create(null); // All properties, including accessors
38083809

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

38683869
t = state.tokens.next;
38693870
f = doFunction(context, { isMethod: true });
3870-
p = f["(params)"];
3871+
params = f["(params)"];
38713872

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

5109+
// If the parameters of the current function scope have not been defined,
5110+
// it is because the current expression is contained within the parameter
5111+
// list.
5112+
if (!state.funct["(params)"]) {
5113+
error("E024", this, "yield");
5114+
}
5115+
51085116
if (!this.beginsStmt && prev.lbp > 30 && !checkPunctuators(prev, ["("])) {
51095117
error("E061", this);
51105118
}

tests/test262/expectations.txt

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -516,8 +516,6 @@ test/language/expressions/template-literal/tv-utf16-escape-sequence.js(strict mo
516516
test/language/expressions/function/param-dflt-yield-non-strict.js(default)
517517
test/language/expressions/function/scope-param-rest-elem-var-close.js(default)
518518
test/language/expressions/function/scope-param-rest-elem-var-open.js(default)
519-
test/language/expressions/generators/param-dflt-yield.js(default)
520-
test/language/expressions/generators/param-dflt-yield.js(strict mode)
521519
test/language/expressions/generators/scope-param-rest-elem-var-close.js(default)
522520
test/language/expressions/generators/scope-param-rest-elem-var-open.js(default)
523521
test/language/expressions/generators/yield-as-function-expression-binding-identifier.js(default)
@@ -526,12 +524,8 @@ test/language/expressions/generators/yield-as-logical-or-expression.js(default)
526524
test/language/expressions/generators/yield-as-logical-or-expression.js(strict mode)
527525
test/language/expressions/generators/yield-star-after-newline.js(default)
528526
test/language/expressions/generators/yield-star-after-newline.js(strict mode)
529-
test/language/expressions/class/gen-method-param-dflt-yield.js(default)
530-
test/language/expressions/class/gen-method-param-dflt-yield.js(strict mode)
531527
test/language/expressions/class/getter-param-dflt.js(default)
532528
test/language/expressions/class/getter-param-dflt.js(strict mode)
533-
test/language/expressions/class/static-gen-method-param-dflt-yield.js(default)
534-
test/language/expressions/class/static-gen-method-param-dflt-yield.js(strict mode)
535529
test/language/expressions/assignment/dstr-array-elem-init-simple-no-strict.js(default)
536530
test/language/expressions/assignment/dstr-array-elem-init-yield-ident-valid.js(default)
537531
test/language/expressions/assignment/dstr-array-elem-iter-rtrn-close-err.js(default)
@@ -613,7 +607,6 @@ test/language/expressions/object/method-definition/async-super-call-body.js(defa
613607
test/language/expressions/object/method-definition/async-super-call-body.js(strict mode)
614608
test/language/expressions/object/method-definition/async-super-call-param.js(default)
615609
test/language/expressions/object/method-definition/async-super-call-param.js(strict mode)
616-
test/language/expressions/object/method-definition/generator-param-init-yield.js(default)
617610
test/language/expressions/object/method-definition/generator-prop-name-yield-expr.js(default)
618611
test/language/expressions/object/method-definition/generator-prop-name-yield-id.js(default)
619612
test/language/expressions/object/method-definition/name-param-id-yield.js(default)
@@ -708,8 +701,6 @@ test/language/statements/if/if-stmt-else-decl-strict.js(strict mode)
708701
test/language/statements/if/if-stmt-else-fun-strict.js(strict mode)
709702
test/language/statements/if/if-stmt-else-gen.js(default)
710703
test/language/statements/if/if-stmt-else-gen.js(strict mode)
711-
test/language/statements/generators/param-dflt-yield.js(default)
712-
test/language/statements/generators/param-dflt-yield.js(strict mode)
713704
test/language/statements/generators/scope-param-rest-elem-var-close.js(default)
714705
test/language/statements/generators/scope-param-rest-elem-var-open.js(default)
715706
test/language/statements/generators/yield-as-function-expression-binding-identifier.js(default)
@@ -872,12 +863,8 @@ test/language/statements/let/syntax/with-initialisers-in-statement-positions-lab
872863
test/language/statements/let/syntax/with-initialisers-in-statement-positions-label-statement.js(strict mode)
873864
test/language/statements/let/syntax/without-initialisers-in-statement-positions-label-statement.js(default)
874865
test/language/statements/let/syntax/without-initialisers-in-statement-positions-label-statement.js(strict mode)
875-
test/language/statements/class/gen-method-param-dflt-yield.js(default)
876-
test/language/statements/class/gen-method-param-dflt-yield.js(strict mode)
877866
test/language/statements/class/getter-param-dflt.js(default)
878867
test/language/statements/class/getter-param-dflt.js(strict mode)
879-
test/language/statements/class/static-gen-method-param-dflt-yield.js(default)
880-
test/language/statements/class/static-gen-method-param-dflt-yield.js(strict mode)
881868
test/language/statements/class/definition/class-method-returns-promise.js(default)
882869
test/language/statements/class/definition/class-method-returns-promise.js(strict mode)
883870
test/language/statements/class/definition/methods-async-super-call-body.js(default)

tests/unit/parser.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3781,6 +3781,18 @@ exports["esnext generator"] = function (test) {
37813781
TestRun(test)
37823782
.test(code, {esnext: true, unused: true, undef: true, predef: ["print"]});
37833783

3784+
TestRun(test, "YieldExpression in parameters - declaration")
3785+
.addError(1, 18, "Unexpected 'yield'.")
3786+
.test("function * g(x = yield) { yield; }", { esversion: 6 });
3787+
3788+
TestRun(test, "YieldExpression in parameters - expression")
3789+
.addError(1, 22, "Unexpected 'yield'.")
3790+
.test("void function * (x = yield) { yield; };", { esversion: 6 });
3791+
3792+
TestRun(test, "YieldExpression in parameters - method")
3793+
.addError(1, 16, "Unexpected 'yield'.")
3794+
.test("void { * g(x = yield) { yield; } };", { esversion: 6 });
3795+
37843796
test.done();
37853797
};
37863798

0 commit comments

Comments
 (0)