fix parsing of yield as object key (#1976)

fixes #1974
This commit is contained in:
Alex Lam S.L
2017-05-20 13:11:37 +08:00
committed by GitHub
parent 9a074c2637
commit a2172e1a99
3 changed files with 16 additions and 7 deletions

View File

@@ -2411,7 +2411,8 @@ function parse($TEXT, options) {
unexpected(tmp); unexpected(tmp);
} }
case "name": case "name":
if (tmp.value === "yield" && S.input.has_directive("use strict") && !is_in_generator()) { if (tmp.value == "yield" && !is_token(peek(), "punc", ":")
&& S.input.has_directive("use strict") && !is_in_generator()) {
token_error(tmp, "Unexpected yield identifier inside strict mode"); token_error(tmp, "Unexpected yield identifier inside strict mode");
} }
case "string": case "string":

View File

@@ -190,3 +190,12 @@ yield_sub: {
} }
expect_exact: 'function*foo(){yield x["foo"];(yield x)["foo"];yield(yield obj.foo())["bar"]()}' expect_exact: 'function*foo(){yield x["foo"];(yield x)["foo"];yield(yield obj.foo())["bar"]()}'
} }
yield_as_ES5_property: {
input: {
"use strict";
console.log({yield: 42}.yield);
}
expect_exact: '"use strict";console.log({yield:42}.yield);'
expect_stdout: "42"
}

View File

@@ -65,9 +65,9 @@ describe("Yield", function() {
); );
}); });
it("Should not allow yield to be used as symbol, identifier or property outside generators in strict mode", function() { it("Should not allow yield to be used as symbol, identifier or shorthand property outside generators in strict mode", function() {
var tests = [ var tests = [
// Fail as as_symbol // Fail in as_symbol
'"use strict"; import yield from "bar";', '"use strict"; import yield from "bar";',
'"use strict"; yield = 123;', '"use strict"; yield = 123;',
'"use strict"; yield: "123";', '"use strict"; yield: "123";',
@@ -79,13 +79,12 @@ describe("Yield", function() {
'"use strict"; var yield = "foo";', '"use strict"; var yield = "foo";',
'"use strict"; class yield {}', '"use strict"; class yield {}',
// Fail as maybe_assign // Fail in maybe_assign
'"use strict"; var foo = yield;', '"use strict"; var foo = yield;',
'"use strict"; var foo = bar = yield', '"use strict"; var foo = bar = yield',
// Fail as as_property_name // Fail in as_property_name
'"use strict"; var foo = {yield};', '"use strict"; var foo = {yield};',
'"use strict"; var bar = {yield: "foo"};'
]; ];
var fail = function(e) { var fail = function(e) {