Revision: 19469
Author:   [email protected]
Date:     Wed Feb 19 08:56:11 2014 UTC
Log: (Pre)Parser: Move ParseExpression and ParseArrayLiteral to ParserBase.

Notes:
- The functions already did the same thing -> no changes in logic.
- One less glue function needed now.

[email protected]
BUG=v8:3126
LOG=N

Review URL: https://codereview.chromium.org/169853002
http://code.google.com/p/v8/source/detail?r=19469

Modified:
 /branches/bleeding_edge/src/parser.cc
 /branches/bleeding_edge/src/parser.h
 /branches/bleeding_edge/src/preparser.cc
 /branches/bleeding_edge/src/preparser.h

=======================================
--- /branches/bleeding_edge/src/parser.cc       Mon Feb 17 15:40:51 2014 UTC
+++ /branches/bleeding_edge/src/parser.cc       Wed Feb 19 08:56:11 2014 UTC
@@ -570,8 +570,10 @@
 }


-Expression* ParserTraits::ParseArrayLiteral(bool* ok) {
-  return parser_->ParseArrayLiteral(ok);
+Literal* ParserTraits::GetLiteralTheHole(
+    int position, AstNodeFactory<AstConstructionVisitor>* factory) {
+ return factory->NewLiteral(parser_->isolate()->factory()->the_hole_value(),
+                             RelocInfo::kNoPosition);
 }


@@ -580,8 +582,8 @@
 }


-Expression* ParserTraits::ParseExpression(bool accept_IN, bool* ok) {
-  return parser_->ParseExpression(accept_IN, ok);
+Expression* ParserTraits::ParseAssignmentExpression(bool accept_IN, bool* ok) {
+  return parser_->ParseAssignmentExpression(accept_IN, ok);
 }


@@ -594,6 +596,7 @@
     : ParserBase<ParserTraits>(&scanner_,
info->isolate()->stack_guard()->real_climit(),
                                info->extension(),
+                               info->zone(),
                                this),
       isolate_(info->isolate()),
       symbol_cache_(0, info->zone()),
@@ -604,7 +607,6 @@
       target_stack_(NULL),
       pre_parse_data_(NULL),
       fni_(NULL),
-      zone_(info->zone()),
       info_(info) {
   ASSERT(!script_.is_null());
   isolate_->set_ast_node_id(0);
@@ -2872,23 +2874,6 @@
     return loop;
   }
 }
-
-
-// Precedence = 1
-Expression* Parser::ParseExpression(bool accept_IN, bool* ok) {
-  // Expression ::
-  //   AssignmentExpression
-  //   Expression ',' AssignmentExpression
-
-  Expression* result = ParseAssignmentExpression(accept_IN, CHECK_OK);
-  while (peek() == Token::COMMA) {
-    Expect(Token::COMMA, CHECK_OK);
-    int pos = position();
-    Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK);
- result = factory()->NewBinaryOperation(Token::COMMA, result, right, pos);
-  }
-  return result;
-}


 // Precedence = 2
@@ -3460,34 +3445,6 @@
                 Vector<const char*>(element, 1));
   *ok = false;
 }
-
-
-Expression* Parser::ParseArrayLiteral(bool* ok) {
-  // ArrayLiteral ::
-  //   '[' Expression? (',' Expression?)* ']'
-
-  int pos = peek_position();
- ZoneList<Expression*>* values = new(zone()) ZoneList<Expression*>(4, zone());
-  Expect(Token::LBRACK, CHECK_OK);
-  while (peek() != Token::RBRACK) {
-    Expression* elem;
-    if (peek() == Token::COMMA) {
-      elem = GetLiteralTheHole(peek_position());
-    } else {
-      elem = ParseAssignmentExpression(true, CHECK_OK);
-    }
-    values->Add(elem, zone());
-    if (peek() != Token::RBRACK) {
-      Expect(Token::COMMA, CHECK_OK);
-    }
-  }
-  Expect(Token::RBRACK, CHECK_OK);
-
-  // Update the scope information before the pre-parsing bailout.
-  int literal_index = function_state_->NextMaterializedLiteralIndex();
-
-  return factory()->NewArrayLiteral(values, literal_index, pos);
-}


 bool CompileTimeValue::IsCompileTimeValue(Expression* expression) {
@@ -4256,12 +4213,6 @@
   return factory()->NewLiteral(
       isolate()->factory()->undefined_value(), position);
 }
-
-
-Literal* Parser::GetLiteralTheHole(int position) {
-  return factory()->NewLiteral(
-      isolate()->factory()->the_hole_value(), RelocInfo::kNoPosition);
-}


 void Parser::MarkAsLValue(Expression* expression) {
=======================================
--- /branches/bleeding_edge/src/parser.h        Mon Feb 17 15:40:51 2014 UTC
+++ /branches/bleeding_edge/src/parser.h        Wed Feb 19 08:56:11 2014 UTC
@@ -421,6 +421,7 @@
     // Return types for traversing functions.
     typedef Handle<String> Identifier;
     typedef v8::internal::Expression* Expression;
+    typedef ZoneList<v8::internal::Expression*>* ExpressionList;
   };

   explicit ParserTraits(Parser* parser) : parser_(parser) {}
@@ -461,6 +462,10 @@
   static Expression* EmptyExpression() {
     return NULL;
   }
+
+  // Odd-ball literal creators.
+  Literal* GetLiteralTheHole(int position,
+ AstNodeFactory<AstConstructionVisitor>* factory);

   // Producing data during the recursive descent.
   Handle<String> GetSymbol(Scanner* scanner = NULL);
@@ -477,11 +482,13 @@
   Expression* ExpressionFromString(
       int pos, Scanner* scanner,
       AstNodeFactory<AstConstructionVisitor>* factory);
+ ZoneList<v8::internal::Expression*>* NewExpressionList(int size, Zone* zone) {
+    return new(zone) ZoneList<v8::internal::Expression*>(size, zone);
+  }

   // Temporary glue; these functions will move to ParserBase.
-  Expression* ParseArrayLiteral(bool* ok);
   Expression* ParseObjectLiteral(bool* ok);
-  Expression* ParseExpression(bool accept_IN, bool* ok);
+  Expression* ParseAssignmentExpression(bool accept_IN, bool* ok);
   Expression* ParseV8Intrinsic(bool* ok);

  private:
@@ -554,7 +561,6 @@
   FunctionLiteral* ParseLazy(Utf16CharacterStream* source);

   Isolate* isolate() { return isolate_; }
-  Zone* zone() const { return zone_; }
   CompilationInfo* info() const { return info_; }

   // Called by ParseProgram after setting up the scanner.
@@ -630,7 +636,6 @@
   // Support for hamony block scoped bindings.
   Block* ParseScopedBlock(ZoneStringList* labels, bool* ok);

-  Expression* ParseExpression(bool accept_IN, bool* ok);
   Expression* ParseAssignmentExpression(bool accept_IN, bool* ok);
   Expression* ParseYieldExpression(bool* ok);
   Expression* ParseConditionalExpression(bool accept_IN, bool* ok);
@@ -642,7 +647,6 @@
   Expression* ParseMemberExpression(bool* ok);
   Expression* ParseMemberExpressionContinuation(Expression* expression,
                                                 bool* ok);
-  Expression* ParseArrayLiteral(bool* ok);
   Expression* ParseObjectLiteral(bool* ok);

   // Initialize the components of a for-in / for-of statement.
@@ -678,7 +682,6 @@

   // Get odd-ball literals.
   Literal* GetLiteralUndefined(int position);
-  Literal* GetLiteralTheHole(int position);

// Determine if the expression is a variable proxy and mark it as being used // in an assignment or with a increment/decrement operator. This is currently
@@ -755,7 +758,6 @@

   Mode mode_;

-  Zone* zone_;
   CompilationInfo* info_;
 };

=======================================
--- /branches/bleeding_edge/src/preparser.cc    Mon Feb 17 15:40:51 2014 UTC
+++ /branches/bleeding_edge/src/preparser.cc    Wed Feb 19 08:56:11 2014 UTC
@@ -120,11 +120,6 @@
   }
   return PreParserExpression::StringLiteral();
 }
-
-
-PreParserExpression PreParserTraits::ParseArrayLiteral(bool* ok) {
-  return pre_parser_->ParseArrayLiteral(ok);
-}


 PreParserExpression PreParserTraits::ParseObjectLiteral(bool* ok) {
@@ -132,8 +127,9 @@
 }


-PreParserExpression PreParserTraits::ParseExpression(bool accept_IN, bool* ok) {
-  return pre_parser_->ParseExpression(accept_IN, ok);
+PreParserExpression PreParserTraits::ParseAssignmentExpression(bool accept_IN,
+                                                               bool* ok) {
+  return pre_parser_->ParseAssignmentExpression(accept_IN, ok);
 }


@@ -832,22 +828,6 @@
   ((void)0
 #define DUMMY )  // to make indentation work
 #undef DUMMY
-
-
-// Precedence = 1
-PreParser::Expression PreParser::ParseExpression(bool accept_IN, bool* ok) {
-  // Expression ::
-  //   AssignmentExpression
-  //   Expression ',' AssignmentExpression
-
-  Expression result = ParseAssignmentExpression(accept_IN, CHECK_OK);
-  while (peek() == Token::COMMA) {
-    Expect(Token::COMMA, CHECK_OK);
-    ParseAssignmentExpression(accept_IN, CHECK_OK);
-    result = Expression::Default();
-  }
-  return result;
-}


 // Precedence = 2
@@ -1140,25 +1120,6 @@
   ASSERT(false);
   return PreParserExpression::Default();
 }
-
-
-PreParser::Expression PreParser::ParseArrayLiteral(bool* ok) {
-  // ArrayLiteral ::
-  //   '[' Expression? (',' Expression?)* ']'
-  Expect(Token::LBRACK, CHECK_OK);
-  while (peek() != Token::RBRACK) {
-    if (peek() != Token::COMMA) {
-      ParseAssignmentExpression(true, CHECK_OK);
-    }
-    if (peek() != Token::RBRACK) {
-      Expect(Token::COMMA, CHECK_OK);
-    }
-  }
-  Expect(Token::RBRACK, CHECK_OK);
-
-  function_state_->NextMaterializedLiteralIndex();
-  return Expression::Default();
-}


 PreParser::Expression PreParser::ParseObjectLiteral(bool* ok) {
=======================================
--- /branches/bleeding_edge/src/preparser.h     Mon Feb 17 15:40:51 2014 UTC
+++ /branches/bleeding_edge/src/preparser.h     Wed Feb 19 08:56:11 2014 UTC
@@ -43,6 +43,7 @@
  public:
   ParserBase(Scanner* scanner, uintptr_t stack_limit,
              v8::Extension* extension,
+             typename Traits::Type::Zone* zone,
              typename Traits::Type::Parser this_object)
       : Traits(this_object),
         parenthesized_function_(false),
@@ -55,7 +56,8 @@
         allow_lazy_(false),
         allow_natives_syntax_(false),
         allow_generators_(false),
-        allow_for_of_(false) { }
+        allow_for_of_(false),
+        zone_(zone) { }

   // Getters that indicate whether certain syntactical constructs are
   // allowed to be parsed by this instance of the parser.
@@ -185,6 +187,7 @@
   int peek_position() { return scanner_->peek_location().beg_pos; }
   bool stack_overflow() const { return stack_overflow_; }
   void set_stack_overflow() { stack_overflow_ = true; }
+  typename Traits::Type::Zone* zone() const { return zone_; }

   INLINE(Token::Value peek()) {
     if (stack_overflow_) return Token::ILLEGAL;
@@ -335,6 +338,8 @@
                                                        bool* ok);

   typename Traits::Type::Expression ParsePrimaryExpression(bool* ok);
+ typename Traits::Type::Expression ParseExpression(bool accept_IN, bool* ok);
+  typename Traits::Type::Expression ParseArrayLiteral(bool* ok);

   // Used to detect duplicates in object literals. Each of the values
   // kGetterProperty, kSetterProperty and kValueProperty represents
@@ -409,6 +414,8 @@
   bool allow_natives_syntax_;
   bool allow_generators_;
   bool allow_for_of_;
+
+  typename Traits::Type::Zone* zone_;  // Only used by Parser.
 };


@@ -541,6 +548,16 @@
 };


+// PreParserExpressionList doesn't actually store the expressions because
+// PreParser doesn't need to.
+class PreParserExpressionList {
+ public:
+  // These functions make list->Add(some_expression) work (and do nothing).
+  PreParserExpressionList* operator->() { return this; }
+  void Add(PreParserExpression, void*) { }
+};
+
+
 class PreParserScope {
  public:
explicit PreParserScope(PreParserScope* outer_scope, ScopeType scope_type)
@@ -589,6 +606,16 @@
                                        int pos) {
     return PreParserExpression::Default();
   }
+  PreParserExpression NewBinaryOperation(Token::Value op,
+                                         PreParserExpression left,
+ PreParserExpression right, int pos) {
+    return PreParserExpression::Default();
+  }
+  PreParserExpression NewArrayLiteral(PreParserExpressionList values,
+                                      int literal_index,
+                                      int pos) {
+    return PreParserExpression::Default();
+  }
 };


@@ -610,6 +637,7 @@
     // Return types for traversing functions.
     typedef PreParserIdentifier Identifier;
     typedef PreParserExpression Expression;
+    typedef PreParserExpressionList ExpressionList;
   };

explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {}
@@ -645,6 +673,12 @@
   static PreParserExpression EmptyExpression() {
     return PreParserExpression::Default();
   }
+
+  // Odd-ball literal creators.
+  static PreParserExpression GetLiteralTheHole(int position,
+                                               PreParserFactory* factory) {
+    return PreParserExpression::Default();
+  }

   // Producing data during the recursive descent.
   PreParserIdentifier GetSymbol(Scanner* scanner);
@@ -674,10 +708,13 @@
                                            Scanner* scanner,
PreParserFactory* factory = NULL);

+  static PreParserExpressionList NewExpressionList(int size, void* zone) {
+    return PreParserExpressionList();
+  }
+
   // Temporary glue; these functions will move to ParserBase.
-  PreParserExpression ParseArrayLiteral(bool* ok);
+  PreParserExpression ParseAssignmentExpression(bool accept_IN, bool* ok);
   PreParserExpression ParseObjectLiteral(bool* ok);
-  PreParserExpression ParseExpression(bool accept_IN, bool* ok);
   PreParserExpression ParseV8Intrinsic(bool* ok);

  private:
@@ -710,7 +747,7 @@
   PreParser(Scanner* scanner,
             ParserRecorder* log,
             uintptr_t stack_limit)
-      : ParserBase<PreParserTraits>(scanner, stack_limit, NULL, this),
+ : ParserBase<PreParserTraits>(scanner, stack_limit, NULL, NULL, this),
         log_(log) {}

   // Pre-parse the program from the character stream; returns true on
@@ -846,7 +883,6 @@
   Statement ParseTryStatement(bool* ok);
   Statement ParseDebuggerStatement(bool* ok);

-  Expression ParseExpression(bool accept_IN, bool* ok);
   Expression ParseAssignmentExpression(bool accept_IN, bool* ok);
   Expression ParseYieldExpression(bool* ok);
   Expression ParseConditionalExpression(bool accept_IN, bool* ok);
@@ -858,7 +894,6 @@
Expression ParseMemberExpressionContinuation(PreParserExpression expression,
                                                bool* ok);
   Expression ParseMemberWithNewPrefixesExpression(bool* ok);
-  Expression ParseArrayLiteral(bool* ok);
   Expression ParseObjectLiteral(bool* ok);
   Expression ParseV8Intrinsic(bool* ok);

@@ -1151,6 +1186,57 @@

   return result;
 }
+
+// Precedence = 1
+template <class Traits>
+typename Traits::Type::Expression ParserBase<Traits>::ParseExpression(
+    bool accept_IN, bool* ok) {
+  // Expression ::
+  //   AssignmentExpression
+  //   Expression ',' AssignmentExpression
+
+  typename Traits::Type::Expression result =
+      this->ParseAssignmentExpression(accept_IN, CHECK_OK);
+  while (peek() == Token::COMMA) {
+    Expect(Token::COMMA, CHECK_OK);
+    int pos = position();
+    typename Traits::Type::Expression right =
+        this->ParseAssignmentExpression(accept_IN, CHECK_OK);
+ result = factory()->NewBinaryOperation(Token::COMMA, result, right, pos);
+  }
+  return result;
+}
+
+
+template <class Traits>
+typename Traits::Type::Expression ParserBase<Traits>::ParseArrayLiteral(
+    bool* ok) {
+  // ArrayLiteral ::
+  //   '[' Expression? (',' Expression?)* ']'
+
+  int pos = peek_position();
+  typename Traits::Type::ExpressionList values =
+      this->NewExpressionList(4, zone_);
+  Expect(Token::LBRACK, CHECK_OK);
+  while (peek() != Token::RBRACK) {
+    typename Traits::Type::Expression elem = this->EmptyExpression();
+    if (peek() == Token::COMMA) {
+      elem = this->GetLiteralTheHole(peek_position(), factory());
+    } else {
+      elem = this->ParseAssignmentExpression(true, CHECK_OK);
+    }
+    values->Add(elem, zone_);
+    if (peek() != Token::RBRACK) {
+      Expect(Token::COMMA, CHECK_OK);
+    }
+  }
+  Expect(Token::RBRACK, CHECK_OK);
+
+  // Update the scope information before the pre-parsing bailout.
+  int literal_index = function_state_->NextMaterializedLiteralIndex();
+
+  return factory()->NewArrayLiteral(values, literal_index, pos);
+}

 #undef CHECK_OK

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to