Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(33)

Side by Side Diff: src/preparser.h

Issue 633373003: Simplify AST ID generation. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: DISALLOW_COPY_AND_ASSIGN Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« src/ast.h ('K') | « src/parser.cc ('k') | src/preparser.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_PREPARSER_H 5 #ifndef V8_PREPARSER_H
6 #define V8_PREPARSER_H 6 #define V8_PREPARSER_H
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/bailout-reason.h" 10 #include "src/bailout-reason.h"
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 typename Traits::Type::Scope** scope_stack_; 163 typename Traits::Type::Scope** scope_stack_;
164 typename Traits::Type::Scope* outer_scope_; 164 typename Traits::Type::Scope* outer_scope_;
165 typename Traits::Type::Scope* scope_; 165 typename Traits::Type::Scope* scope_;
166 }; 166 };
167 167
168 class FunctionState BASE_EMBEDDED { 168 class FunctionState BASE_EMBEDDED {
169 public: 169 public:
170 FunctionState(FunctionState** function_state_stack, 170 FunctionState(FunctionState** function_state_stack,
171 typename Traits::Type::Scope** scope_stack, 171 typename Traits::Type::Scope** scope_stack,
172 typename Traits::Type::Scope* scope, 172 typename Traits::Type::Scope* scope,
173 typename Traits::Type::Zone* zone = NULL, 173 typename Traits::Type::Factory* factory);
174 AstValueFactory* ast_value_factory = NULL,
175 AstNode::IdGen* ast_node_id_gen = NULL);
176 FunctionState(FunctionState** function_state_stack, 174 FunctionState(FunctionState** function_state_stack,
177 typename Traits::Type::Scope** scope_stack, 175 typename Traits::Type::Scope** scope_stack,
178 typename Traits::Type::Scope** scope, 176 typename Traits::Type::Scope** scope,
179 typename Traits::Type::Zone* zone = NULL, 177 typename Traits::Type::Factory* factory);
180 AstValueFactory* ast_value_factory = NULL,
181 AstNode::IdGen* ast_node_id_gen = NULL);
182 ~FunctionState(); 178 ~FunctionState();
183 179
184 int NextMaterializedLiteralIndex() { 180 int NextMaterializedLiteralIndex() {
185 return next_materialized_literal_index_++; 181 return next_materialized_literal_index_++;
186 } 182 }
187 int materialized_literal_count() { 183 int materialized_literal_count() {
188 return next_materialized_literal_index_ - JSFunction::kLiteralsPrefixSize; 184 return next_materialized_literal_index_ - JSFunction::kLiteralsPrefixSize;
189 } 185 }
190 186
191 int NextHandlerIndex() { return next_handler_index_++; } 187 int NextHandlerIndex() { return next_handler_index_++; }
(...skipping 10 matching lines...) Expand all
202 DCHECK(variable != NULL); 198 DCHECK(variable != NULL);
203 DCHECK(!is_generator()); 199 DCHECK(!is_generator());
204 generator_object_variable_ = variable; 200 generator_object_variable_ = variable;
205 is_generator_ = true; 201 is_generator_ = true;
206 } 202 }
207 typename Traits::Type::GeneratorVariable* generator_object_variable() 203 typename Traits::Type::GeneratorVariable* generator_object_variable()
208 const { 204 const {
209 return generator_object_variable_; 205 return generator_object_variable_;
210 } 206 }
211 207
212 typename Traits::Type::Factory* factory() { return &factory_; } 208 typename Traits::Type::Factory* factory() { return factory_; }
213 209
214 private: 210 private:
215 // Used to assign an index to each literal that needs materialization in 211 // Used to assign an index to each literal that needs materialization in
216 // the function. Includes regexp literals, and boilerplate for object and 212 // the function. Includes regexp literals, and boilerplate for object and
217 // array literals. 213 // array literals.
218 int next_materialized_literal_index_; 214 int next_materialized_literal_index_;
219 215
220 // Used to assign a per-function index to try and catch handlers. 216 // Used to assign a per-function index to try and catch handlers.
221 int next_handler_index_; 217 int next_handler_index_;
222 218
223 // Properties count estimation. 219 // Properties count estimation.
224 int expected_property_count_; 220 int expected_property_count_;
225 221
226 // Whether the function is a generator. 222 // Whether the function is a generator.
227 bool is_generator_; 223 bool is_generator_;
228 // For generators, this variable may hold the generator object. It variable 224 // For generators, this variable may hold the generator object. It variable
229 // is used by yield expressions and return statements. It is not necessary 225 // is used by yield expressions and return statements. It is not necessary
230 // for generator functions to have this variable set. 226 // for generator functions to have this variable set.
231 Variable* generator_object_variable_; 227 Variable* generator_object_variable_;
232 228
233 FunctionState** function_state_stack_; 229 FunctionState** function_state_stack_;
234 FunctionState* outer_function_state_; 230 FunctionState* outer_function_state_;
235 typename Traits::Type::Scope** scope_stack_; 231 typename Traits::Type::Scope** scope_stack_;
236 typename Traits::Type::Scope* outer_scope_; 232 typename Traits::Type::Scope* outer_scope_;
237 AstNode::IdGen* ast_node_id_gen_; // Only used by ParserTraits.
238 AstNode::IdGen saved_id_gen_; // Ditto.
239 typename Traits::Type::Zone* extra_param_; 233 typename Traits::Type::Zone* extra_param_;
240 typename Traits::Type::Factory factory_; 234 typename Traits::Type::Factory* factory_;
241 235
242 friend class ParserTraits; 236 friend class ParserTraits;
243 friend class Checkpoint; 237 friend class Checkpoint;
244 }; 238 };
245 239
246 // Annoyingly, arrow functions first parse as comma expressions, then when we 240 // Annoyingly, arrow functions first parse as comma expressions, then when we
247 // see the => we have to go back and reinterpret the arguments as being formal 241 // see the => we have to go back and reinterpret the arguments as being formal
248 // parameters. To do so we need to reset some of the parser state back to 242 // parameters. To do so we need to reset some of the parser state back to
249 // what it was before the arguments were first seen. 243 // what it was before the arguments were first seen.
250 class Checkpoint BASE_EMBEDDED { 244 class Checkpoint BASE_EMBEDDED {
(...skipping 898 matching lines...) Expand 10 before | Expand all | Expand 10 after
1149 typedef PreParserExpressionList ExpressionList; 1143 typedef PreParserExpressionList ExpressionList;
1150 typedef PreParserExpressionList PropertyList; 1144 typedef PreParserExpressionList PropertyList;
1151 typedef PreParserStatementList StatementList; 1145 typedef PreParserStatementList StatementList;
1152 1146
1153 // For constructing objects returned by the traversing functions. 1147 // For constructing objects returned by the traversing functions.
1154 typedef PreParserFactory Factory; 1148 typedef PreParserFactory Factory;
1155 }; 1149 };
1156 1150
1157 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} 1151 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {}
1158 1152
1159 // Custom operations executed when FunctionStates are created and
1160 // destructed. (The PreParser doesn't need to do anything.)
1161 template <typename FunctionState>
1162 static void SetUpFunctionState(FunctionState* function_state) {}
1163 template <typename FunctionState>
1164 static void TearDownFunctionState(FunctionState* function_state) {}
1165
1166 // Helper functions for recursive descent. 1153 // Helper functions for recursive descent.
1167 static bool IsEvalOrArguments(PreParserIdentifier identifier) { 1154 static bool IsEvalOrArguments(PreParserIdentifier identifier) {
1168 return identifier.IsEvalOrArguments(); 1155 return identifier.IsEvalOrArguments();
1169 } 1156 }
1170 1157
1171 static bool IsPrototype(PreParserIdentifier identifier) { 1158 static bool IsPrototype(PreParserIdentifier identifier) {
1172 return identifier.IsPrototype(); 1159 return identifier.IsPrototype();
1173 } 1160 }
1174 1161
1175 static bool IsConstructor(PreParserIdentifier identifier) { 1162 static bool IsConstructor(PreParserIdentifier identifier) {
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
1440 PreParser(Scanner* scanner, ParserRecorder* log, uintptr_t stack_limit) 1427 PreParser(Scanner* scanner, ParserRecorder* log, uintptr_t stack_limit)
1441 : ParserBase<PreParserTraits>(scanner, stack_limit, NULL, log, NULL, NULL, 1428 : ParserBase<PreParserTraits>(scanner, stack_limit, NULL, log, NULL, NULL,
1442 this) {} 1429 this) {}
1443 1430
1444 // Pre-parse the program from the character stream; returns true on 1431 // Pre-parse the program from the character stream; returns true on
1445 // success (even if parsing failed, the pre-parse data successfully 1432 // success (even if parsing failed, the pre-parse data successfully
1446 // captured the syntax error), and false if a stack-overflow happened 1433 // captured the syntax error), and false if a stack-overflow happened
1447 // during parsing. 1434 // during parsing.
1448 PreParseResult PreParseProgram() { 1435 PreParseResult PreParseProgram() {
1449 PreParserScope scope(scope_, GLOBAL_SCOPE); 1436 PreParserScope scope(scope_, GLOBAL_SCOPE);
1450 FunctionState top_scope(&function_state_, &scope_, &scope); 1437 PreParserFactory factory(NULL, NULL, NULL);
1438 FunctionState top_scope(&function_state_, &scope_, &scope, &factory);
1451 bool ok = true; 1439 bool ok = true;
1452 int start_position = scanner()->peek_location().beg_pos; 1440 int start_position = scanner()->peek_location().beg_pos;
1453 ParseSourceElements(Token::EOS, &ok); 1441 ParseSourceElements(Token::EOS, &ok);
1454 if (stack_overflow()) return kPreParseStackOverflow; 1442 if (stack_overflow()) return kPreParseStackOverflow;
1455 if (!ok) { 1443 if (!ok) {
1456 ReportUnexpectedToken(scanner()->current_token()); 1444 ReportUnexpectedToken(scanner()->current_token());
1457 } else if (scope_->strict_mode() == STRICT) { 1445 } else if (scope_->strict_mode() == STRICT) {
1458 CheckOctalLiteral(start_position, scanner()->location().end_pos, &ok); 1446 CheckOctalLiteral(start_position, scanner()->location().end_pos, &ok);
1459 } 1447 }
1460 return kPreParseSuccess; 1448 return kPreParseSuccess;
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1567 Token::Value fvar_init_op, bool is_generator, bool* ok) { 1555 Token::Value fvar_init_op, bool is_generator, bool* ok) {
1568 return pre_parser_->ParseEagerFunctionBody(function_name, pos, fvar, 1556 return pre_parser_->ParseEagerFunctionBody(function_name, pos, fvar,
1569 fvar_init_op, is_generator, ok); 1557 fvar_init_op, is_generator, ok);
1570 } 1558 }
1571 1559
1572 1560
1573 template <class Traits> 1561 template <class Traits>
1574 ParserBase<Traits>::FunctionState::FunctionState( 1562 ParserBase<Traits>::FunctionState::FunctionState(
1575 FunctionState** function_state_stack, 1563 FunctionState** function_state_stack,
1576 typename Traits::Type::Scope** scope_stack, 1564 typename Traits::Type::Scope** scope_stack,
1577 typename Traits::Type::Scope* scope, typename Traits::Type::Zone* zone, 1565 typename Traits::Type::Scope* scope,
1578 AstValueFactory* ast_value_factory, AstNode::IdGen* ast_node_id_gen) 1566 typename Traits::Type::Factory* factory)
1579 : next_materialized_literal_index_(JSFunction::kLiteralsPrefixSize), 1567 : next_materialized_literal_index_(JSFunction::kLiteralsPrefixSize),
1580 next_handler_index_(0), 1568 next_handler_index_(0),
1581 expected_property_count_(0), 1569 expected_property_count_(0),
1582 is_generator_(false), 1570 is_generator_(false),
1583 generator_object_variable_(NULL), 1571 generator_object_variable_(NULL),
1584 function_state_stack_(function_state_stack), 1572 function_state_stack_(function_state_stack),
1585 outer_function_state_(*function_state_stack), 1573 outer_function_state_(*function_state_stack),
1586 scope_stack_(scope_stack), 1574 scope_stack_(scope_stack),
1587 outer_scope_(*scope_stack), 1575 outer_scope_(*scope_stack),
1588 ast_node_id_gen_(ast_node_id_gen), 1576 factory_(factory) {
1589 factory_(zone, ast_value_factory, ast_node_id_gen) {
1590 *scope_stack_ = scope; 1577 *scope_stack_ = scope;
1591 *function_state_stack = this; 1578 *function_state_stack = this;
1592 Traits::SetUpFunctionState(this);
1593 } 1579 }
1594 1580
1595 1581
1596 template <class Traits> 1582 template <class Traits>
1597 ParserBase<Traits>::FunctionState::FunctionState( 1583 ParserBase<Traits>::FunctionState::FunctionState(
1598 FunctionState** function_state_stack, 1584 FunctionState** function_state_stack,
1599 typename Traits::Type::Scope** scope_stack, 1585 typename Traits::Type::Scope** scope_stack,
1600 typename Traits::Type::Scope** scope, typename Traits::Type::Zone* zone, 1586 typename Traits::Type::Scope** scope,
1601 AstValueFactory* ast_value_factory, AstNode::IdGen* ast_node_id_gen) 1587 typename Traits::Type::Factory* factory)
1602 : next_materialized_literal_index_(JSFunction::kLiteralsPrefixSize), 1588 : next_materialized_literal_index_(JSFunction::kLiteralsPrefixSize),
1603 next_handler_index_(0), 1589 next_handler_index_(0),
1604 expected_property_count_(0), 1590 expected_property_count_(0),
1605 is_generator_(false), 1591 is_generator_(false),
1606 generator_object_variable_(NULL), 1592 generator_object_variable_(NULL),
1607 function_state_stack_(function_state_stack), 1593 function_state_stack_(function_state_stack),
1608 outer_function_state_(*function_state_stack), 1594 outer_function_state_(*function_state_stack),
1609 scope_stack_(scope_stack), 1595 scope_stack_(scope_stack),
1610 outer_scope_(*scope_stack), 1596 outer_scope_(*scope_stack),
1611 ast_node_id_gen_(ast_node_id_gen), 1597 factory_(factory) {
1612 factory_(zone, ast_value_factory, ast_node_id_gen) {
1613 *scope_stack_ = *scope; 1598 *scope_stack_ = *scope;
1614 *function_state_stack = this; 1599 *function_state_stack = this;
1615 Traits::SetUpFunctionState(this);
1616 } 1600 }
1617 1601
1618 1602
1619 template <class Traits> 1603 template <class Traits>
1620 ParserBase<Traits>::FunctionState::~FunctionState() { 1604 ParserBase<Traits>::FunctionState::~FunctionState() {
1621 *scope_stack_ = outer_scope_; 1605 *scope_stack_ = outer_scope_;
1622 *function_state_stack_ = outer_function_state_; 1606 *function_state_stack_ = outer_function_state_;
1623 Traits::TearDownFunctionState(this);
1624 } 1607 }
1625 1608
1626 1609
1627 template<class Traits> 1610 template<class Traits>
1628 void ParserBase<Traits>::ReportUnexpectedToken(Token::Value token) { 1611 void ParserBase<Traits>::ReportUnexpectedToken(Token::Value token) {
1629 Scanner::Location source_location = scanner()->location(); 1612 Scanner::Location source_location = scanner()->location();
1630 1613
1631 // Four of the tokens are treated specially 1614 // Four of the tokens are treated specially
1632 switch (token) { 1615 switch (token) {
1633 case Token::EOS: 1616 case Token::EOS:
(...skipping 1012 matching lines...) Expand 10 before | Expand all | Expand 10 after
2646 this->NewScope(scope_, FUNCTION_SCOPE); 2629 this->NewScope(scope_, FUNCTION_SCOPE);
2647 typename Traits::Type::StatementList body; 2630 typename Traits::Type::StatementList body;
2648 typename Traits::Type::AstProperties ast_properties; 2631 typename Traits::Type::AstProperties ast_properties;
2649 BailoutReason dont_optimize_reason = kNoReason; 2632 BailoutReason dont_optimize_reason = kNoReason;
2650 int num_parameters = -1; 2633 int num_parameters = -1;
2651 int materialized_literal_count = -1; 2634 int materialized_literal_count = -1;
2652 int expected_property_count = -1; 2635 int expected_property_count = -1;
2653 int handler_count = 0; 2636 int handler_count = 0;
2654 2637
2655 { 2638 {
2656 FunctionState function_state(&function_state_, &scope_, &scope, zone(), 2639 typename Traits::Type::Factory function_factory(
2657 this->ast_value_factory(), ast_node_id_gen_); 2640 zone(), this->ast_value_factory(), ast_node_id_gen_);
2641 FunctionState function_state(&function_state_, &scope_, &scope,
2642 &function_factory);
2658 Scanner::Location dupe_error_loc = Scanner::Location::invalid(); 2643 Scanner::Location dupe_error_loc = Scanner::Location::invalid();
2659 num_parameters = Traits::DeclareArrowParametersFromExpression( 2644 num_parameters = Traits::DeclareArrowParametersFromExpression(
2660 params_ast, scope_, &dupe_error_loc, ok); 2645 params_ast, scope_, &dupe_error_loc, ok);
2661 if (!*ok) { 2646 if (!*ok) {
2662 ReportMessageAt( 2647 ReportMessageAt(
2663 Scanner::Location(start_pos, scanner()->location().beg_pos), 2648 Scanner::Location(start_pos, scanner()->location().beg_pos),
2664 "malformed_arrow_function_parameter_list"); 2649 "malformed_arrow_function_parameter_list");
2665 return this->EmptyExpression(); 2650 return this->EmptyExpression();
2666 } 2651 }
2667 2652
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
2864 DCHECK(IsAccessorAccessorConflict(old_type, type)); 2849 DCHECK(IsAccessorAccessorConflict(old_type, type));
2865 // Both accessors of the same type. 2850 // Both accessors of the same type.
2866 parser()->ReportMessage("accessor_get_set"); 2851 parser()->ReportMessage("accessor_get_set");
2867 } 2852 }
2868 *ok = false; 2853 *ok = false;
2869 } 2854 }
2870 } 2855 }
2871 } } // v8::internal 2856 } } // v8::internal
2872 2857
2873 #endif // V8_PREPARSER_H 2858 #endif // V8_PREPARSER_H
OLDNEW
« src/ast.h ('K') | « src/parser.cc ('k') | src/preparser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698