Bug 1384299 - Provide better error message when errornous syntax possibly match "yield SOMETHING" outside generators. r=till

This commit is contained in:
Tooru Fujisawa 2017-07-27 23:17:09 +09:00
Родитель 200d8ec18b
Коммит 9d87992821
3 изменённых файлов: 37 добавлений и 0 удалений

Просмотреть файл

@ -2929,6 +2929,10 @@ Parser<ParseHandler, CharT>::matchOrInsertSemicolonHelper(TokenStream::Modifier
error(JSMSG_AWAIT_OUTSIDE_ASYNC);
return false;
}
if (!yieldExpressionsSupported() && tokenStream.currentToken().type == TOK_YIELD) {
error(JSMSG_YIELD_OUTSIDE_GENERATOR);
return false;
}
/* Advance the scanner for proper error location reporting. */
tokenStream.consumeKnownToken(tt, modifier);

Просмотреть файл

@ -353,6 +353,7 @@ MSG_DEF(JSMSG_WHILE_AFTER_DO, 0, JSEXN_SYNTAXERR, "missing while after
MSG_DEF(JSMSG_YIELD_IN_ARROW, 0, JSEXN_SYNTAXERR, "arrow function may not contain yield")
MSG_DEF(JSMSG_YIELD_IN_DEFAULT, 0, JSEXN_SYNTAXERR, "yield in default expression")
MSG_DEF(JSMSG_YIELD_IN_METHOD, 0, JSEXN_SYNTAXERR, "non-generator method definitions may not contain yield")
MSG_DEF(JSMSG_YIELD_OUTSIDE_GENERATOR, 0, JSEXN_SYNTAXERR, "yield expression is only valid in generators")
MSG_DEF(JSMSG_BAD_COLUMN_NUMBER, 0, JSEXN_RANGEERR, "column number out of range")
MSG_DEF(JSMSG_COMPUTED_NAME_IN_PATTERN,0, JSEXN_SYNTAXERR, "computed property names aren't supported in this destructuring declaration")
MSG_DEF(JSMSG_DEFAULT_IN_PATTERN, 0, JSEXN_SYNTAXERR, "destructuring defaults aren't supported in this destructuring declaration")

Просмотреть файл

@ -0,0 +1,32 @@
var BUGNUMBER = 1384299;
var summary = "yield outside of generators should provide better error";
print(BUGNUMBER + ": " + summary);
let caught = false;
try {
eval("yield 10");
} catch(e) {
assertEq(e.message, "yield expression is only valid in generators");
caught = true;
}
assertEq(caught, true);
try {
eval("function f() { yield 10; }");
} catch(e) {
assertEq(e.message, "yield expression is only valid in generators");
caught = true;
}
assertEq(caught, true);
try {
eval("async function f() { yield 10; }");
} catch(e) {
assertEq(e.message, "yield expression is only valid in generators");
caught = true;
}
assertEq(caught, true);
if (typeof reportCompare === "function")
reportCompare(true, true);