Index: src/preparser.h |
diff --git a/src/preparser.h b/src/preparser.h |
index b77bc7a22251a6e0b8866670b26ed4133253be20..7de3805156576ff282254faf2d072ff5ce0b5da9 100644 |
--- a/src/preparser.h |
+++ b/src/preparser.h |
@@ -345,6 +345,7 @@ class ParserBase : public Traits { |
typename Traits::Type::ExpressionList ParseArguments(bool* ok); |
typename Traits::Type::Expression ParseAssignmentExpression(bool accept_IN, |
bool* ok); |
+ typename Traits::Type::Expression ParseYieldExpression(bool* ok); |
// Used to detect duplicates in object literals. Each of the values |
// kGetterProperty, kSetterProperty and kValueProperty represents |
@@ -535,6 +536,9 @@ class PreParserExpression { |
void* AsCall() const { return NULL; } |
void* AsCallNew() const { return NULL; } |
+ // More dummy implementations of things PreParser doesn't need to track: |
+ void set_index(int index) {} // For YieldExpressions |
+ |
private: |
// First two/three bits are used as flags. |
// Bit 0 and 1 represent identifiers or strings literals, and are |
@@ -661,6 +665,17 @@ class PreParserFactory { |
int pos) { |
return PreParserExpression::Default(); |
} |
+ |
+ PreParserExpression NewVariableProxy(void* generator_variable) { |
+ return PreParserExpression::Default(); |
+ } |
+ |
+ PreParserExpression NewYield(PreParserExpression generator_object, |
+ PreParserExpression expression, |
+ Yield::Kind yield_kind, |
+ int pos) { |
+ return PreParserExpression::Default(); |
+ } |
}; |
@@ -682,6 +697,7 @@ class PreParserTraits { |
// Return types for traversing functions. |
typedef PreParserIdentifier Identifier; |
typedef PreParserExpression Expression; |
+ typedef PreParserExpression YieldExpression; |
typedef PreParserExpression FunctionLiteral; |
typedef PreParserExpression ObjectLiteralProperty; |
typedef PreParserExpression Literal; |
@@ -828,7 +844,6 @@ class PreParserTraits { |
int function_token_position, |
FunctionLiteral::FunctionType type, |
bool* ok); |
- PreParserExpression ParseYieldExpression(bool* ok); |
PreParserExpression ParseConditionalExpression(bool accept_IN, bool* ok); |
private: |
@@ -994,7 +1009,6 @@ class PreParser : public ParserBase<PreParserTraits> { |
Statement ParseThrowStatement(bool* ok); |
Statement ParseTryStatement(bool* ok); |
Statement ParseDebuggerStatement(bool* ok); |
- Expression ParseYieldExpression(bool* ok); |
Expression ParseConditionalExpression(bool accept_IN, bool* ok); |
Expression ParseBinaryExpression(int prec, bool accept_IN, bool* ok); |
Expression ParseUnaryExpression(bool* ok); |
@@ -1616,6 +1630,28 @@ typename Traits::Type::Expression ParserBase<Traits>::ParseAssignmentExpression( |
return factory()->NewAssignment(op, expression, right, pos); |
} |
+template <class Traits> |
+typename Traits::Type::Expression ParserBase<Traits>::ParseYieldExpression( |
+ bool* ok) { |
+ // YieldExpression :: |
+ // 'yield' '*'? AssignmentExpression |
+ int pos = peek_position(); |
+ Expect(Token::YIELD, CHECK_OK); |
+ Yield::Kind kind = |
+ Check(Token::MUL) ? Yield::DELEGATING : Yield::SUSPEND; |
+ typename Traits::Type::Expression generator_object = |
+ factory()->NewVariableProxy(function_state_->generator_object_variable()); |
+ typename Traits::Type::Expression expression = |
+ ParseAssignmentExpression(false, CHECK_OK); |
+ typename Traits::Type::YieldExpression yield = |
+ factory()->NewYield(generator_object, expression, kind, pos); |
+ if (kind == Yield::DELEGATING) { |
+ yield->set_index(function_state_->NextHandlerIndex()); |
+ } |
+ return yield; |
+} |
+ |
+ |
#undef CHECK_OK |
#undef CHECK_OK_CUSTOM |