Index: Grammar.y =================================================================== --- Grammar.y (revision 43818) +++ Grammar.y (working copy) @@ -193,7 +193,7 @@ /* keywords */ %token BREAK CASE DEFAULT FOR NEW VAR CONSTTOKEN CONTINUE -%token FUNCTION RETURN VOIDTOKEN DELETETOKEN +%token FUNCTION RETURN YIELD VOIDTOKEN DELETETOKEN %token IF THISTOKEN DO WHILE INTOKEN INSTANCEOF TYPEOF %token SWITCH WITH RESERVED %token THROW TRY CATCH FINALLY @@ -249,6 +249,7 @@ %type LogicalORExpr LogicalORExprNoIn LogicalORExprNoBF %type ConditionalExpr ConditionalExprNoIn ConditionalExprNoBF %type AssignmentExpr AssignmentExprNoIn AssignmentExprNoBF +%type YieldExpr YieldExprNoIn %type Expr ExprNoIn ExprNoBF %type ExprOpt ExprNoInOpt @@ -256,7 +257,7 @@ %type Statement Block %type VariableStatement ConstStatement EmptyStatement ExprStatement %type IfStatement IterationStatement ContinueStatement -%type BreakStatement ReturnStatement WithStatement +%type BreakStatement ReturnStatement YieldStatement WithStatement %type SwitchStatement LabelledStatement %type ThrowStatement TryStatement %type DebuggerStatement @@ -743,6 +744,11 @@ { $$ = createNodeInfo(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_features & AssignFeature, $3.m_features & AssignFeature, @1.first_column, @2.first_column + 1, @3.last_column), $1.m_features | $3.m_features | AssignFeature, $1.m_numConstants + $3.m_numConstants); } + | LeftHandSideExpr AssignmentOperator YieldExpr + { $$ = createNodeInfo(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_features & AssignFeature, $3.m_features & AssignFeature, + @1.first_column, @2.first_column + 1, @3.last_column), $1.m_features | $3.m_features | AssignFeature, $1.m_numConstants + $3.m_numConstants); + } + | '(' YieldExpr ')' { $$ = $2; } ; AssignmentExprNoIn: @@ -751,6 +757,11 @@ { $$ = createNodeInfo(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_features & AssignFeature, $3.m_features & AssignFeature, @1.first_column, @2.first_column + 1, @3.last_column), $1.m_features | $3.m_features | AssignFeature, $1.m_numConstants + $3.m_numConstants); } + | LeftHandSideExpr AssignmentOperator YieldExprNoIn + { $$ = createNodeInfo(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_features & AssignFeature, $3.m_features & AssignFeature, + @1.first_column, @2.first_column + 1, @3.last_column), $1.m_features | $3.m_features | AssignFeature, $1.m_numConstants + $3.m_numConstants); + } + | '(' YieldExpr ')' { $$ = $2; } ; AssignmentExprNoBF: @@ -759,8 +770,23 @@ { $$ = createNodeInfo(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_features & AssignFeature, $3.m_features & AssignFeature, @1.first_column, @2.first_column + 1, @3.last_column), $1.m_features | $3.m_features | AssignFeature, $1.m_numConstants + $3.m_numConstants); } + | LeftHandSideExprNoBF AssignmentOperator YieldExpr + { $$ = createNodeInfo(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_features & AssignFeature, $3.m_features & AssignFeature, + @1.first_column, @2.first_column + 1, @3.last_column), $1.m_features | $3.m_features | AssignFeature, $1.m_numConstants + $3.m_numConstants); + } + | '(' YieldExpr ')' { $$ = $2; } ; +YieldExpr: + YIELD + | YIELD AssignmentExpr +; + +YieldExprNoIn: + YIELD + | YIELD AssignmentExprNoIn +; + AssignmentOperator: '=' { $$ = OpEqual; } | PLUSEQUAL { $$ = OpPlusEq; } @@ -803,6 +829,7 @@ | ContinueStatement | BreakStatement | ReturnStatement + | YieldStatement | WithStatement | SwitchStatement | LabelledStatement @@ -1069,6 +1096,15 @@ $$ = createNodeDeclarationInfo(node, 0, 0, $2.m_features, $2.m_numConstants); DBG($$.m_node, @1, @2); AUTO_SEMICOLON; } ; +YieldStatement: + YieldExpr ';' { ReturnNode* node = new (GLOBAL_DATA) ReturnNode(GLOBAL_DATA, 0); + SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @1.last_column); + $$ = createNodeDeclarationInfo(node, 0, 0, 0, 0); DBG($$.m_node, @1, @2); } + | YieldExpr error { ReturnNode* node = new (GLOBAL_DATA) ReturnNode(GLOBAL_DATA, 0); + SET_EXCEPTION_LOCATION(node, @1.first_column, @1.last_column, @1.last_column); + $$ = createNodeDeclarationInfo(node, 0, 0, 0, 0); DBG($$.m_node, @1, @1); AUTO_SEMICOLON; } +; + WithStatement: WITH '(' Expr ')' Statement { $$ = createNodeDeclarationInfo(new (GLOBAL_DATA) WithNode(GLOBAL_DATA, $3.m_node, $5.m_node, @3.last_column, @3.last_column - @3.first_column), $5.m_varDeclarations, $5.m_funcDeclarations, $3.m_features | $5.m_features | WithFeature, $3.m_numConstants + $5.m_numConstants); @@ -1577,16 +1613,19 @@ AssignmentExpr_NoNode: ConditionalExpr_NoNode | LeftHandSideExpr_NoNode AssignmentOperator_NoNode AssignmentExpr_NoNode + | LeftHandSideExpr_NoNode AssignmentOperator_NoNode YieldExpr_NoNode ; AssignmentExprNoIn_NoNode: ConditionalExprNoIn_NoNode | LeftHandSideExpr_NoNode AssignmentOperator_NoNode AssignmentExprNoIn_NoNode + | LeftHandSideExpr_NoNode AssignmentOperator_NoNode YieldExprNoIn_NoNode ; AssignmentExprNoBF_NoNode: ConditionalExprNoBF_NoNode | LeftHandSideExprNoBF_NoNode AssignmentOperator_NoNode AssignmentExpr_NoNode + | LeftHandSideExprNoBF_NoNode AssignmentOperator_NoNode YieldExpr_NoNode ; AssignmentOperator_NoNode: @@ -1604,6 +1643,16 @@ | MODEQUAL ; +YieldExpr_NoNode: + YIELD + | YIELD AssignmentExpr_NoNode +; + +YieldExprNoIn_NoNode: + YIELD + | YIELD AssignmentExprNoIn_NoNode +; + Expr_NoNode: AssignmentExpr_NoNode | Expr_NoNode ',' AssignmentExpr_NoNode @@ -1631,6 +1680,7 @@ | ContinueStatement_NoNode | BreakStatement_NoNode | ReturnStatement_NoNode + | YieldStatement_NoNode | WithStatement_NoNode | SwitchStatement_NoNode | LabelledStatement_NoNode @@ -1742,6 +1792,11 @@ | RETURN Expr_NoNode error { AUTO_SEMICOLON; } ; +YieldStatement_NoNode: + YieldExpr_NoNode ';' + | YieldExpr_NoNode error { AUTO_SEMICOLON; } +; + WithStatement_NoNode: WITH '(' Expr_NoNode ')' Statement_NoNode ; Index: Keywords.table =================================================================== --- Keywords.table (revision 43818) +++ Keywords.table (working copy) @@ -20,6 +20,7 @@ continue CONTINUE function FUNCTION return RETURN +yield YIELD void VOIDTOKEN delete DELETETOKEN if IF Index: Lexer.cpp =================================================================== --- Lexer.cpp (revision 43818) +++ Lexer.cpp (working copy) @@ -212,7 +212,7 @@ inline bool Lexer::lastTokenWasRestrKeyword() const { - return m_lastToken == CONTINUE || m_lastToken == BREAK || m_lastToken == RETURN || m_lastToken == THROW; + return m_lastToken == CONTINUE || m_lastToken == BREAK || m_lastToken == RETURN || m_lastToken == THROW || m_lastToken == YIELD; } static NEVER_INLINE bool isNonASCIIIdentStart(int c)