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.