| Index: src/parsing/parser-base.h
|
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h
|
| index 46689d54c02bcb645cc658ef7481349764a85c5a..27b9764434c5364ff18c9cf561acde122b80090d 100644
|
| --- a/src/parsing/parser-base.h
|
| +++ b/src/parsing/parser-base.h
|
| @@ -98,7 +98,6 @@ class ParserBase : public Traits {
|
| v8::Extension* extension, AstValueFactory* ast_value_factory,
|
| ParserRecorder* log, typename Traits::Type::Parser this_object)
|
| : Traits(this_object),
|
| - parenthesized_function_(false),
|
| scope_(NULL),
|
| function_state_(NULL),
|
| extension_(extension),
|
| @@ -266,6 +265,14 @@ class ParserBase : public Traits {
|
| return &non_patterns_to_rewrite_;
|
| }
|
|
|
| + void next_function_is_parenthesized(bool parenthesized) {
|
| + next_function_is_parenthesized_ = parenthesized;
|
| + }
|
| +
|
| + bool this_function_is_parenthesized() const {
|
| + return this_function_is_parenthesized_;
|
| + }
|
| +
|
| private:
|
| void AddDestructuringAssignment(DestructuringAssignment pair) {
|
| destructuring_assignments_to_rewrite_.Add(pair);
|
| @@ -312,6 +319,14 @@ class ParserBase : public Traits {
|
|
|
| typename Traits::Type::Factory* factory_;
|
|
|
| + // If true, the next (and immediately following) function literal is
|
| + // preceded by a parenthesis.
|
| + bool next_function_is_parenthesized_;
|
| +
|
| + // The value of the parents' next_function_is_parenthesized_, as it applies
|
| + // to this function. Filled in by constructor.
|
| + bool this_function_is_parenthesized_;
|
| +
|
| friend class ParserTraits;
|
| friend class PreParserTraits;
|
| friend class Checkpoint;
|
| @@ -888,12 +903,6 @@ class ParserBase : public Traits {
|
| bool has_seen_constructor_;
|
| };
|
|
|
| - // If true, the next (and immediately following) function literal is
|
| - // preceded by a parenthesis.
|
| - // Heuristically that means that the function will be called immediately,
|
| - // so never lazily compile it.
|
| - bool parenthesized_function_;
|
| -
|
| Scope* scope_; // Scope stack.
|
| FunctionState* function_state_; // Function state stack.
|
| v8::Extension* extension_;
|
| @@ -935,9 +944,16 @@ ParserBase<Traits>::FunctionState::FunctionState(
|
| outer_scope_(*scope_stack),
|
| collect_expressions_in_tail_position_(true),
|
| non_patterns_to_rewrite_(0, scope->zone()),
|
| - factory_(factory) {
|
| + factory_(factory),
|
| + next_function_is_parenthesized_(false),
|
| + this_function_is_parenthesized_(false) {
|
| *scope_stack_ = scope;
|
| *function_state_stack = this;
|
| + if (outer_function_state_) {
|
| + this_function_is_parenthesized_ =
|
| + outer_function_state_->next_function_is_parenthesized_;
|
| + outer_function_state_->next_function_is_parenthesized_ = false;
|
| + }
|
| }
|
|
|
|
|
| @@ -1303,7 +1319,8 @@ ParserBase<Traits>::ParsePrimaryExpression(ExpressionClassifier* classifier,
|
| }
|
| // Heuristically try to detect immediately called functions before
|
| // seeing the call parentheses.
|
| - parenthesized_function_ = (peek() == Token::FUNCTION);
|
| + function_state_->next_function_is_parenthesized(peek() ==
|
| + Token::FUNCTION);
|
| ExpressionT expr = this->ParseExpression(true, classifier, CHECK_OK);
|
| Expect(Token::RPAREN, CHECK_OK);
|
| return expr;
|
| @@ -2837,7 +2854,6 @@ ParserBase<Traits>::ParseArrowFunctionLiteral(
|
| } else {
|
| // Single-expression body
|
| int pos = position();
|
| - parenthesized_function_ = false;
|
| ExpressionClassifier classifier(this);
|
| ExpressionT expression =
|
| ParseAssignmentExpression(accept_IN, &classifier, CHECK_OK);
|
|
|