Restrict yield outside generators in strict mode

* Move some yield/generic tests from compress/harmony.js to
  compress/yield.js
 * Adjust error messages to conform ecmascript standards
This commit is contained in:
Anthony Van de Gejuchte
2016-06-17 20:39:03 +02:00
committed by Richard van Velzen
parent 6b03b800b3
commit ca04508cd1
7 changed files with 208 additions and 123 deletions

View File

@@ -15,7 +15,7 @@ describe("Yield", function() {
}
var expect = function(e) {
return e instanceof UglifyJS.JS_Parse_Error &&
e.message === "Yield cannot be used as label inside generators";
e.message === "SyntaxError: Yield cannot be used as label inside generators";
}
assert.throws(test, expect);
});
@@ -27,7 +27,7 @@ describe("Yield", function() {
}
var expect = function(e) {
return e instanceof UglifyJS.JS_Parse_Error &&
e.message === "Unexpected token: punc (;)";
e.message === "SyntaxError: Unexpected token: punc (;)";
}
assert.throws(test, expect);
});
@@ -39,7 +39,7 @@ describe("Yield", function() {
}
var expect = function(e) {
return e instanceof UglifyJS.JS_Parse_Error &&
e.message === "Unexpected token: operator (*)";
e.message === "SyntaxError: Unexpected token: operator (*)";
}
assert.throws(test, expect);
});
@@ -64,4 +64,43 @@ describe("Yield", function() {
"function*f(){yield,yield,yield*void 0,yield}"
);
});
it("Should not allow yield to be used as symbol, identifier or property outside generators in strict mode", function() {
var tests = [
// Fail as as_symbol
'"use strict"; import yield from "bar";',
'"use strict"; yield = 123;',
'"use strict"; yield: "123";',
'"use strict"; for(;;){break yield;}',
'"use strict"; for(;;){continue yield;}',
'"use strict"; function yield(){}',
'"use strict"; function foo(...yield){}',
'"use strict"; try { new Error("")} catch (yield) {}',
'"use strict"; var yield = "foo";',
'"use strict"; class yield {}',
// Fail as maybe_assign
'"use strict"; var foo = yield;',
'"use strict"; var foo = bar = yield',
// Fail as as_property_name
'"use strict"; var foo = {yield};',
'"use strict"; var bar = {yield: "foo"};'
];
var fail = function(e) {
return e instanceof UglifyJS.JS_Parse_Error &&
e.message === "SyntaxError: Unexpected yield identifier inside strict mode";
}
var test = function(input) {
return function() {
UglifyJS.parse(input);
}
}
for (var i = 0; i < tests.length; i++) {
assert.throws(test(tests[i]), fail, tests[i]);
}
});
});