Index: src/parsing/parser-base.h |
diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
index 3d486b88857fb003ec07c63f76701d8c97afec29..8dcad41af9f3f29b337532ff3045caffb2e066ee 100644 |
--- a/src/parsing/parser-base.h |
+++ b/src/parsing/parser-base.h |
@@ -462,6 +462,10 @@ class ParserBase { |
return next_function_is_likely_called_; |
} |
+ bool previous_function_was_likely_called() const { |
+ return previous_function_was_likely_called_; |
+ } |
+ |
void set_next_function_is_likely_called() { |
next_function_is_likely_called_ = true; |
} |
@@ -505,11 +509,12 @@ class ParserBase { |
ZoneList<typename ExpressionClassifier::Error> reported_errors_; |
// Record whether the next (=== immediately following) function literal is |
- // preceded by a parenthesis / exclamation mark. |
- // The FunctionState constructor will reset a parents' |
- // next_function_is_likely_called_ to prevent it from being 'reused' in the |
- // next function literal. |
+ // preceded by a parenthesis / exclamation mark. Also record the previous |
+ // state. |
+ // These are managed by the FunctionState constructor; the caller may only |
+ // call set_next_function_is_likely_called. |
bool next_function_is_likely_called_; |
+ bool previous_function_was_likely_called_; |
friend Impl; |
friend class Checkpoint; |
@@ -1461,9 +1466,12 @@ ParserBase<Impl>::FunctionState::FunctionState( |
return_expr_context_(ReturnExprContext::kInsideValidBlock), |
non_patterns_to_rewrite_(0, scope->zone()), |
reported_errors_(16, scope->zone()), |
- next_function_is_likely_called_(false) { |
+ next_function_is_likely_called_(false), |
+ previous_function_was_likely_called_(false) { |
*function_state_stack = this; |
if (outer_function_state_) { |
+ outer_function_state_->previous_function_was_likely_called_ = |
+ outer_function_state_->next_function_is_likely_called_; |
outer_function_state_->next_function_is_likely_called_ = false; |
} |
} |
@@ -1895,6 +1903,13 @@ ParserBase<Impl>::ParseExpressionCoverGrammar(bool accept_IN, bool* ok) { |
// a trailing comma is allowed at the end of an arrow parameter list |
break; |
} |
+ |
+ // Pass on the 'set_next_function_is_likely_called' flag if we have |
+ // several function literals separated by comma. |
+ if (peek() == Token::FUNCTION && |
+ function_state_->previous_function_was_likely_called()) { |
+ function_state_->set_next_function_is_likely_called(); |
+ } |
} |
return result; |