Reflect.parse("yield 0") should throw a SyntaxError (bug 632028, r=brendan)

This commit is contained in:
Dave Herman 2011-02-11 17:01:39 -08:00
parent 7c5d404068
commit 28ec320f81
3 changed files with 18 additions and 7 deletions

View File

@ -5797,12 +5797,7 @@ js_EmitTree(JSContext *cx, JSCodeGenerator *cg, JSParseNode *pn)
#if JS_HAS_GENERATORS #if JS_HAS_GENERATORS
case TOK_YIELD: case TOK_YIELD:
if (!cg->inFunction()) { JS_ASSERT(cg->inFunction());
ReportCompileErrorNumber(cx, CG_TS(cg), pn, JSREPORT_ERROR,
JSMSG_BAD_RETURN_OR_YIELD,
js_yield_str);
return JS_FALSE;
}
if (pn->pn_kid) { if (pn->pn_kid) {
if (!js_EmitTree(cx, cg, pn->pn_kid)) if (!js_EmitTree(cx, cg, pn->pn_kid))
return JS_FALSE; return JS_FALSE;

View File

@ -4786,8 +4786,13 @@ Parser::returnOrYield(bool useAssignExpr)
return NULL; return NULL;
#if JS_HAS_GENERATORS #if JS_HAS_GENERATORS
if (tt == TOK_YIELD) if (tt == TOK_YIELD) {
if (!tc->inFunction()) {
reportErrorNumber(NULL, JSREPORT_ERROR, JSMSG_BAD_RETURN_OR_YIELD, js_yield_str);
return NULL;
}
tc->flags |= TCF_FUN_IS_GENERATOR; tc->flags |= TCF_FUN_IS_GENERATOR;
}
#endif #endif
/* This is ugly, but we don't want to require a semicolon. */ /* This is ugly, but we don't want to require a semicolon. */

View File

@ -390,6 +390,17 @@ assertStmt("try { } catch (e if foo) { } catch (e if bar) { } catch (e) { } fina
catchClause(ident("e"), null, blockStmt([])) ], catchClause(ident("e"), null, blockStmt([])) ],
blockStmt([]))); blockStmt([])));
// Bug 632028: yield outside of a function should throw
(function() {
var threw = false;
try {
Reflect.parse("yield 0");
} catch (expected) {
threw = true;
}
assertEq(threw, true);
})();
// redeclarations (TOK_NAME nodes with lexdef) // redeclarations (TOK_NAME nodes with lexdef)
assertStmt("function f() { function g() { } function g() { } }", assertStmt("function f() { function g() { } function g() { } }",