Implement harmony generators and yield

Uses #716's implementation and adds tests.

Fixes #716.
This commit is contained in:
Darío Javier Cravero
2016-02-04 22:19:48 +01:00
committed by Richard van Velzen
parent 634f231b78
commit 91cdb93e57
5 changed files with 60 additions and 2 deletions

View File

@@ -44,7 +44,7 @@
"use strict";
var KEYWORDS = 'break case catch class const continue debugger default delete do else extends finally for function if in instanceof new return switch throw try typeof var let void while with import export';
var KEYWORDS = 'break case catch class const continue debugger default delete do else export extends finally for function if in instanceof new return switch throw try typeof var let void while with import yield';
var KEYWORDS_ATOM = 'false null true';
var RESERVED_WORDS = 'abstract boolean byte char double enum export final float goto implements int interface long native package private protected public short static super synchronized this throws transient volatile yield'
+ " " + KEYWORDS_ATOM + " " + KEYWORDS;
@@ -68,6 +68,7 @@ var OPERATORS = makePredicate([
"instanceof",
"typeof",
"new",
"yield",
"void",
"delete",
"++",
@@ -627,6 +628,7 @@ var UNARY_PREFIX = makePredicate([
"typeof",
"void",
"delete",
"yield",
"--",
"++",
"!",
@@ -1062,6 +1064,11 @@ function parse($TEXT, options) {
var start = S.token
var in_statement = ctor === AST_Defun;
var is_generator = is("operator", "*");
if (is_generator) {
next();
}
var name = is("name") ? as_symbol(in_statement ? AST_SymbolDefun : AST_SymbolLambda) : null;
if (in_statement && !name)
unexpected();
@@ -1071,6 +1078,7 @@ function parse($TEXT, options) {
return new ctor({
start : args.start,
end : body.end,
is_generator: is_generator,
name : name,
argnames: args,
body : body
@@ -1836,6 +1844,10 @@ function parse($TEXT, options) {
var start = S.token;
if (is("operator") && UNARY_PREFIX(start.value)) {
next();
if (start.type === "operator" && start.value === "yield" && is("operator", "*")) {
start.value = "yield*";
next();
}
handle_regexp();
var ex = make_unary(AST_UnaryPrefix, start.value, maybe_unary(allow_calls));
ex.start = start;