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

Side by Side Diff: src/preparser.h

Issue 1157213004: Drop computed handler count and index from AST. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressed comments. Created 5 years, 6 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
« no previous file with comments | « src/ppc/full-codegen-ppc.cc ('k') | src/x64/full-codegen-x64.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 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 typename Traits::Type::Factory* factory); 214 typename Traits::Type::Factory* factory);
215 ~FunctionState(); 215 ~FunctionState();
216 216
217 int NextMaterializedLiteralIndex() { 217 int NextMaterializedLiteralIndex() {
218 return next_materialized_literal_index_++; 218 return next_materialized_literal_index_++;
219 } 219 }
220 int materialized_literal_count() { 220 int materialized_literal_count() {
221 return next_materialized_literal_index_; 221 return next_materialized_literal_index_;
222 } 222 }
223 223
224 int NextHandlerIndex() { return next_handler_index_++; }
225 int handler_count() { return next_handler_index_; }
226
227 void AddProperty() { expected_property_count_++; } 224 void AddProperty() { expected_property_count_++; }
228 int expected_property_count() { return expected_property_count_; } 225 int expected_property_count() { return expected_property_count_; }
229 226
230 Scanner::Location this_location() const { return this_location_; } 227 Scanner::Location this_location() const { return this_location_; }
231 Scanner::Location super_location() const { return super_location_; } 228 Scanner::Location super_location() const { return super_location_; }
232 Scanner::Location return_location() const { return return_location_; } 229 Scanner::Location return_location() const { return return_location_; }
233 void set_this_location(Scanner::Location location) { 230 void set_this_location(Scanner::Location location) {
234 this_location_ = location; 231 this_location_ = location;
235 } 232 }
236 void set_super_location(Scanner::Location location) { 233 void set_super_location(Scanner::Location location) {
(...skipping 20 matching lines...) Expand all
257 } 254 }
258 255
259 typename Traits::Type::Factory* factory() { return factory_; } 256 typename Traits::Type::Factory* factory() { return factory_; }
260 257
261 private: 258 private:
262 // Used to assign an index to each literal that needs materialization in 259 // Used to assign an index to each literal that needs materialization in
263 // the function. Includes regexp literals, and boilerplate for object and 260 // the function. Includes regexp literals, and boilerplate for object and
264 // array literals. 261 // array literals.
265 int next_materialized_literal_index_; 262 int next_materialized_literal_index_;
266 263
267 // Used to assign a per-function index to try and catch handlers.
268 int next_handler_index_;
269
270 // Properties count estimation. 264 // Properties count estimation.
271 int expected_property_count_; 265 int expected_property_count_;
272 266
273 // Location of most recent use of 'this' (invalid if none). 267 // Location of most recent use of 'this' (invalid if none).
274 Scanner::Location this_location_; 268 Scanner::Location this_location_;
275 269
276 // Location of most recent 'return' statement (invalid if none). 270 // Location of most recent 'return' statement (invalid if none).
277 Scanner::Location return_location_; 271 Scanner::Location return_location_;
278 272
279 // Location of call to the "super" constructor (invalid if none). 273 // Location of call to the "super" constructor (invalid if none).
(...skipping 18 matching lines...) Expand all
298 // Annoyingly, arrow functions first parse as comma expressions, then when we 292 // Annoyingly, arrow functions first parse as comma expressions, then when we
299 // see the => we have to go back and reinterpret the arguments as being formal 293 // see the => we have to go back and reinterpret the arguments as being formal
300 // parameters. To do so we need to reset some of the parser state back to 294 // parameters. To do so we need to reset some of the parser state back to
301 // what it was before the arguments were first seen. 295 // what it was before the arguments were first seen.
302 class Checkpoint BASE_EMBEDDED { 296 class Checkpoint BASE_EMBEDDED {
303 public: 297 public:
304 explicit Checkpoint(ParserBase* parser) { 298 explicit Checkpoint(ParserBase* parser) {
305 function_state_ = parser->function_state_; 299 function_state_ = parser->function_state_;
306 next_materialized_literal_index_ = 300 next_materialized_literal_index_ =
307 function_state_->next_materialized_literal_index_; 301 function_state_->next_materialized_literal_index_;
308 next_handler_index_ = function_state_->next_handler_index_;
309 expected_property_count_ = function_state_->expected_property_count_; 302 expected_property_count_ = function_state_->expected_property_count_;
310 } 303 }
311 304
312 void Restore() { 305 void Restore() {
313 function_state_->next_materialized_literal_index_ = 306 function_state_->next_materialized_literal_index_ =
314 next_materialized_literal_index_; 307 next_materialized_literal_index_;
315 function_state_->next_handler_index_ = next_handler_index_;
316 function_state_->expected_property_count_ = expected_property_count_; 308 function_state_->expected_property_count_ = expected_property_count_;
317 } 309 }
318 310
319 private: 311 private:
320 FunctionState* function_state_; 312 FunctionState* function_state_;
321 int next_materialized_literal_index_; 313 int next_materialized_literal_index_;
322 int next_handler_index_;
323 int expected_property_count_; 314 int expected_property_count_;
324 }; 315 };
325 316
326 class ParsingModeScope BASE_EMBEDDED { 317 class ParsingModeScope BASE_EMBEDDED {
327 public: 318 public:
328 ParsingModeScope(ParserBase* parser, Mode mode) 319 ParsingModeScope(ParserBase* parser, Mode mode)
329 : parser_(parser), 320 : parser_(parser),
330 old_mode_(parser->mode()) { 321 old_mode_(parser->mode()) {
331 parser_->mode_ = mode; 322 parser_->mode_ = mode;
332 } 323 }
(...skipping 1147 matching lines...) Expand 10 before | Expand all | Expand 10 after
1480 int pos) { 1471 int pos) {
1481 return PreParserExpression::Default(); 1472 return PreParserExpression::Default();
1482 } 1473 }
1483 PreParserStatement NewReturnStatement(PreParserExpression expression, 1474 PreParserStatement NewReturnStatement(PreParserExpression expression,
1484 int pos) { 1475 int pos) {
1485 return PreParserStatement::Default(); 1476 return PreParserStatement::Default();
1486 } 1477 }
1487 PreParserExpression NewFunctionLiteral( 1478 PreParserExpression NewFunctionLiteral(
1488 PreParserIdentifier name, AstValueFactory* ast_value_factory, 1479 PreParserIdentifier name, AstValueFactory* ast_value_factory,
1489 Scope* scope, PreParserStatementList body, int materialized_literal_count, 1480 Scope* scope, PreParserStatementList body, int materialized_literal_count,
1490 int expected_property_count, int handler_count, int parameter_count, 1481 int expected_property_count, int parameter_count,
1491 FunctionLiteral::ParameterFlag has_duplicate_parameters, 1482 FunctionLiteral::ParameterFlag has_duplicate_parameters,
1492 FunctionLiteral::FunctionType function_type, 1483 FunctionLiteral::FunctionType function_type,
1493 FunctionLiteral::IsFunctionFlag is_function, 1484 FunctionLiteral::IsFunctionFlag is_function,
1494 FunctionLiteral::EagerCompileHint eager_compile_hint, FunctionKind kind, 1485 FunctionLiteral::EagerCompileHint eager_compile_hint, FunctionKind kind,
1495 int position) { 1486 int position) {
1496 return PreParserExpression::Default(); 1487 return PreParserExpression::Default();
1497 } 1488 }
1498 1489
1499 PreParserExpression NewSpread(PreParserExpression expression, int pos) { 1490 PreParserExpression NewSpread(PreParserExpression expression, int pos) {
1500 return PreParserExpression::Spread(expression); 1491 return PreParserExpression::Spread(expression);
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after
2039 return pre_parser_->ParseEagerFunctionBody(function_name, pos, fvar, 2030 return pre_parser_->ParseEagerFunctionBody(function_name, pos, fvar,
2040 fvar_init_op, kind, ok); 2031 fvar_init_op, kind, ok);
2041 } 2032 }
2042 2033
2043 2034
2044 template <class Traits> 2035 template <class Traits>
2045 ParserBase<Traits>::FunctionState::FunctionState( 2036 ParserBase<Traits>::FunctionState::FunctionState(
2046 FunctionState** function_state_stack, Scope** scope_stack, Scope* scope, 2037 FunctionState** function_state_stack, Scope** scope_stack, Scope* scope,
2047 FunctionKind kind, typename Traits::Type::Factory* factory) 2038 FunctionKind kind, typename Traits::Type::Factory* factory)
2048 : next_materialized_literal_index_(0), 2039 : next_materialized_literal_index_(0),
2049 next_handler_index_(0),
2050 expected_property_count_(0), 2040 expected_property_count_(0),
2051 this_location_(Scanner::Location::invalid()), 2041 this_location_(Scanner::Location::invalid()),
2052 return_location_(Scanner::Location::invalid()), 2042 return_location_(Scanner::Location::invalid()),
2053 super_location_(Scanner::Location::invalid()), 2043 super_location_(Scanner::Location::invalid()),
2054 kind_(kind), 2044 kind_(kind),
2055 generator_object_variable_(NULL), 2045 generator_object_variable_(NULL),
2056 function_state_stack_(function_state_stack), 2046 function_state_stack_(function_state_stack),
2057 outer_function_state_(*function_state_stack), 2047 outer_function_state_(*function_state_stack),
2058 scope_stack_(scope_stack), 2048 scope_stack_(scope_stack),
2059 outer_scope_(*scope_stack), 2049 outer_scope_(*scope_stack),
(...skipping 988 matching lines...) Expand 10 before | Expand all | Expand 10 after
3048 expression = ParseAssignmentExpression(false, classifier, CHECK_OK); 3038 expression = ParseAssignmentExpression(false, classifier, CHECK_OK);
3049 break; 3039 break;
3050 } 3040 }
3051 } 3041 }
3052 if (kind == Yield::kDelegating) { 3042 if (kind == Yield::kDelegating) {
3053 // var iterator = subject[Symbol.iterator](); 3043 // var iterator = subject[Symbol.iterator]();
3054 expression = this->GetIterator(expression, factory()); 3044 expression = this->GetIterator(expression, factory());
3055 } 3045 }
3056 typename Traits::Type::YieldExpression yield = 3046 typename Traits::Type::YieldExpression yield =
3057 factory()->NewYield(generator_object, expression, kind, pos); 3047 factory()->NewYield(generator_object, expression, kind, pos);
3058 if (kind == Yield::kDelegating) {
3059 yield->set_index(function_state_->NextHandlerIndex());
3060 }
3061 return yield; 3048 return yield;
3062 } 3049 }
3063 3050
3064 3051
3065 // Precedence = 3 3052 // Precedence = 3
3066 template <class Traits> 3053 template <class Traits>
3067 typename ParserBase<Traits>::ExpressionT 3054 typename ParserBase<Traits>::ExpressionT
3068 ParserBase<Traits>::ParseConditionalExpression(bool accept_IN, 3055 ParserBase<Traits>::ParseConditionalExpression(bool accept_IN,
3069 ExpressionClassifier* classifier, 3056 ExpressionClassifier* classifier,
3070 bool* ok) { 3057 bool* ok) {
(...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after
3778 // If next token is not `=>`, it's a syntax error anyways. 3765 // If next token is not `=>`, it's a syntax error anyways.
3779 ReportUnexpectedTokenAt(scanner_->peek_location(), Token::ARROW); 3766 ReportUnexpectedTokenAt(scanner_->peek_location(), Token::ARROW);
3780 *ok = false; 3767 *ok = false;
3781 return this->EmptyExpression(); 3768 return this->EmptyExpression();
3782 } 3769 }
3783 3770
3784 typename Traits::Type::StatementList body; 3771 typename Traits::Type::StatementList body;
3785 int num_parameters = scope->num_parameters(); 3772 int num_parameters = scope->num_parameters();
3786 int materialized_literal_count = -1; 3773 int materialized_literal_count = -1;
3787 int expected_property_count = -1; 3774 int expected_property_count = -1;
3788 int handler_count = 0;
3789 Scanner::Location super_loc; 3775 Scanner::Location super_loc;
3790 3776
3791 { 3777 {
3792 typename Traits::Type::Factory function_factory(ast_value_factory()); 3778 typename Traits::Type::Factory function_factory(ast_value_factory());
3793 FunctionState function_state(&function_state_, &scope_, scope, 3779 FunctionState function_state(&function_state_, &scope_, scope,
3794 kArrowFunction, &function_factory); 3780 kArrowFunction, &function_factory);
3795 3781
3796 Expect(Token::ARROW, CHECK_OK); 3782 Expect(Token::ARROW, CHECK_OK);
3797 3783
3798 if (peek() == Token::LBRACE) { 3784 if (peek() == Token::LBRACE) {
3799 // Multiple statement body 3785 // Multiple statement body
3800 Consume(Token::LBRACE); 3786 Consume(Token::LBRACE);
3801 bool is_lazily_parsed = 3787 bool is_lazily_parsed =
3802 (mode() == PARSE_LAZILY && scope_->AllowsLazyCompilation()); 3788 (mode() == PARSE_LAZILY && scope_->AllowsLazyCompilation());
3803 if (is_lazily_parsed) { 3789 if (is_lazily_parsed) {
3804 body = this->NewStatementList(0, zone()); 3790 body = this->NewStatementList(0, zone());
3805 this->SkipLazyFunctionBody(&materialized_literal_count, 3791 this->SkipLazyFunctionBody(&materialized_literal_count,
3806 &expected_property_count, CHECK_OK); 3792 &expected_property_count, CHECK_OK);
3807 } else { 3793 } else {
3808 body = this->ParseEagerFunctionBody( 3794 body = this->ParseEagerFunctionBody(
3809 this->EmptyIdentifier(), RelocInfo::kNoPosition, NULL, 3795 this->EmptyIdentifier(), RelocInfo::kNoPosition, NULL,
3810 Token::INIT_VAR, kArrowFunction, CHECK_OK); 3796 Token::INIT_VAR, kArrowFunction, CHECK_OK);
3811 materialized_literal_count = 3797 materialized_literal_count =
3812 function_state.materialized_literal_count(); 3798 function_state.materialized_literal_count();
3813 expected_property_count = function_state.expected_property_count(); 3799 expected_property_count = function_state.expected_property_count();
3814 handler_count = function_state.handler_count();
3815 } 3800 }
3816 } else { 3801 } else {
3817 // Single-expression body 3802 // Single-expression body
3818 int pos = position(); 3803 int pos = position();
3819 parenthesized_function_ = false; 3804 parenthesized_function_ = false;
3820 ExpressionClassifier classifier; 3805 ExpressionClassifier classifier;
3821 ExpressionT expression = 3806 ExpressionT expression =
3822 ParseAssignmentExpression(true, &classifier, CHECK_OK); 3807 ParseAssignmentExpression(true, &classifier, CHECK_OK);
3823 ValidateExpression(&classifier, CHECK_OK); 3808 ValidateExpression(&classifier, CHECK_OK);
3824 body = this->NewStatementList(1, zone()); 3809 body = this->NewStatementList(1, zone());
3825 body->Add(factory()->NewReturnStatement(expression, pos), zone()); 3810 body->Add(factory()->NewReturnStatement(expression, pos), zone());
3826 materialized_literal_count = function_state.materialized_literal_count(); 3811 materialized_literal_count = function_state.materialized_literal_count();
3827 expected_property_count = function_state.expected_property_count(); 3812 expected_property_count = function_state.expected_property_count();
3828 handler_count = function_state.handler_count();
3829 } 3813 }
3830 super_loc = function_state.super_location(); 3814 super_loc = function_state.super_location();
3831 3815
3832 scope->set_end_position(scanner()->location().end_pos); 3816 scope->set_end_position(scanner()->location().end_pos);
3833 3817
3834 // Arrow function formal parameters are parsed as StrictFormalParameterList, 3818 // Arrow function formal parameters are parsed as StrictFormalParameterList,
3835 // which is not the same as "parameters of a strict function"; it only means 3819 // which is not the same as "parameters of a strict function"; it only means
3836 // that duplicates are not allowed. Of course, the arrow function may 3820 // that duplicates are not allowed. Of course, the arrow function may
3837 // itself be strict as well. 3821 // itself be strict as well.
3838 const bool allow_duplicate_parameters = false; 3822 const bool allow_duplicate_parameters = false;
3839 this->ValidateFormalParameters(&formals_classifier, language_mode(), 3823 this->ValidateFormalParameters(&formals_classifier, language_mode(),
3840 allow_duplicate_parameters, CHECK_OK); 3824 allow_duplicate_parameters, CHECK_OK);
3841 3825
3842 // Validate strict mode. 3826 // Validate strict mode.
3843 if (is_strict(language_mode())) { 3827 if (is_strict(language_mode())) {
3844 CheckStrictOctalLiteral(scope->start_position(), 3828 CheckStrictOctalLiteral(scope->start_position(),
3845 scanner()->location().end_pos, CHECK_OK); 3829 scanner()->location().end_pos, CHECK_OK);
3846 this->CheckConflictingVarDeclarations(scope, CHECK_OK); 3830 this->CheckConflictingVarDeclarations(scope, CHECK_OK);
3847 } 3831 }
3848 } 3832 }
3849 3833
3850 FunctionLiteralT function_literal = factory()->NewFunctionLiteral( 3834 FunctionLiteralT function_literal = factory()->NewFunctionLiteral(
3851 this->EmptyIdentifierString(), ast_value_factory(), scope, body, 3835 this->EmptyIdentifierString(), ast_value_factory(), scope, body,
3852 materialized_literal_count, expected_property_count, handler_count, 3836 materialized_literal_count, expected_property_count, num_parameters,
3853 num_parameters, FunctionLiteral::kNoDuplicateParameters, 3837 FunctionLiteral::kNoDuplicateParameters,
3854 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction, 3838 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction,
3855 FunctionLiteral::kShouldLazyCompile, FunctionKind::kArrowFunction, 3839 FunctionLiteral::kShouldLazyCompile, FunctionKind::kArrowFunction,
3856 scope->start_position()); 3840 scope->start_position());
3857 3841
3858 function_literal->set_function_token_position(scope->start_position()); 3842 function_literal->set_function_token_position(scope->start_position());
3859 if (super_loc.IsValid()) function_state_->set_super_location(super_loc); 3843 if (super_loc.IsValid()) function_state_->set_super_location(super_loc);
3860 3844
3861 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal); 3845 if (fni_ != NULL) this->InferFunctionName(fni_, function_literal);
3862 3846
3863 return function_literal; 3847 return function_literal;
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
4049 *ok = false; 4033 *ok = false;
4050 return; 4034 return;
4051 } 4035 }
4052 has_seen_constructor_ = true; 4036 has_seen_constructor_ = true;
4053 return; 4037 return;
4054 } 4038 }
4055 } 4039 }
4056 } } // v8::internal 4040 } } // v8::internal
4057 4041
4058 #endif // V8_PREPARSER_H 4042 #endif // V8_PREPARSER_H
OLDNEW
« no previous file with comments | « src/ppc/full-codegen-ppc.cc ('k') | src/x64/full-codegen-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698