OLD | NEW |
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 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 typename Traits::Type::Factory* factory); | 172 typename Traits::Type::Factory* factory); |
173 ~FunctionState(); | 173 ~FunctionState(); |
174 | 174 |
175 int NextMaterializedLiteralIndex() { | 175 int NextMaterializedLiteralIndex() { |
176 return next_materialized_literal_index_++; | 176 return next_materialized_literal_index_++; |
177 } | 177 } |
178 int materialized_literal_count() { | 178 int materialized_literal_count() { |
179 return next_materialized_literal_index_; | 179 return next_materialized_literal_index_; |
180 } | 180 } |
181 | 181 |
| 182 void SkipMaterializedLiterals(int count) { |
| 183 next_materialized_literal_index_ += count; |
| 184 } |
| 185 |
182 void AddProperty() { expected_property_count_++; } | 186 void AddProperty() { expected_property_count_++; } |
183 int expected_property_count() { return expected_property_count_; } | 187 int expected_property_count() { return expected_property_count_; } |
184 | 188 |
185 Scanner::Location this_location() const { return this_location_; } | 189 Scanner::Location this_location() const { return this_location_; } |
186 Scanner::Location super_location() const { return super_location_; } | 190 Scanner::Location super_location() const { return super_location_; } |
187 Scanner::Location return_location() const { return return_location_; } | 191 Scanner::Location return_location() const { return return_location_; } |
188 void set_this_location(Scanner::Location location) { | 192 void set_this_location(Scanner::Location location) { |
189 this_location_ = location; | 193 this_location_ = location; |
190 } | 194 } |
191 void set_super_location(Scanner::Location location) { | 195 void set_super_location(Scanner::Location location) { |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 // what it was before the arguments were first seen. | 257 // what it was before the arguments were first seen. |
254 class Checkpoint BASE_EMBEDDED { | 258 class Checkpoint BASE_EMBEDDED { |
255 public: | 259 public: |
256 explicit Checkpoint(ParserBase* parser) { | 260 explicit Checkpoint(ParserBase* parser) { |
257 function_state_ = parser->function_state_; | 261 function_state_ = parser->function_state_; |
258 next_materialized_literal_index_ = | 262 next_materialized_literal_index_ = |
259 function_state_->next_materialized_literal_index_; | 263 function_state_->next_materialized_literal_index_; |
260 expected_property_count_ = function_state_->expected_property_count_; | 264 expected_property_count_ = function_state_->expected_property_count_; |
261 } | 265 } |
262 | 266 |
263 void Restore() { | 267 void Restore(int* materialized_literal_index_delta) { |
| 268 *materialized_literal_index_delta = |
| 269 function_state_->next_materialized_literal_index_ - |
| 270 next_materialized_literal_index_; |
264 function_state_->next_materialized_literal_index_ = | 271 function_state_->next_materialized_literal_index_ = |
265 next_materialized_literal_index_; | 272 next_materialized_literal_index_; |
266 function_state_->expected_property_count_ = expected_property_count_; | 273 function_state_->expected_property_count_ = expected_property_count_; |
267 } | 274 } |
268 | 275 |
269 private: | 276 private: |
270 FunctionState* function_state_; | 277 FunctionState* function_state_; |
271 int next_materialized_literal_index_; | 278 int next_materialized_literal_index_; |
272 int expected_property_count_; | 279 int expected_property_count_; |
273 }; | 280 }; |
(...skipping 992 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1266 PreParserFactory* visitor() { return this; } | 1273 PreParserFactory* visitor() { return this; } |
1267 int* ast_properties() { | 1274 int* ast_properties() { |
1268 static int dummy = 42; | 1275 static int dummy = 42; |
1269 return &dummy; | 1276 return &dummy; |
1270 } | 1277 } |
1271 }; | 1278 }; |
1272 | 1279 |
1273 | 1280 |
1274 struct PreParserFormalParameterParsingState { | 1281 struct PreParserFormalParameterParsingState { |
1275 explicit PreParserFormalParameterParsingState(Scope* scope) | 1282 explicit PreParserFormalParameterParsingState(Scope* scope) |
1276 : scope(scope), has_rest(false), is_simple_parameter_list(true) {} | 1283 : scope(scope), |
| 1284 has_rest(false), |
| 1285 is_simple_parameter_list(true), |
| 1286 materialized_literals_count(0) {} |
1277 Scope* scope; | 1287 Scope* scope; |
1278 bool has_rest; | 1288 bool has_rest; |
1279 bool is_simple_parameter_list; | 1289 bool is_simple_parameter_list; |
| 1290 int materialized_literals_count; |
1280 }; | 1291 }; |
1281 | 1292 |
1282 | 1293 |
1283 class PreParser; | 1294 class PreParser; |
1284 | 1295 |
1285 class PreParserTraits { | 1296 class PreParserTraits { |
1286 public: | 1297 public: |
1287 struct Type { | 1298 struct Type { |
1288 // TODO(marja): To be removed. The Traits object should contain all the data | 1299 // TODO(marja): To be removed. The Traits object should contain all the data |
1289 // it needs. | 1300 // it needs. |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1557 V8_INLINE PreParserStatementList ParseEagerFunctionBody( | 1568 V8_INLINE PreParserStatementList ParseEagerFunctionBody( |
1558 PreParserIdentifier function_name, int pos, | 1569 PreParserIdentifier function_name, int pos, |
1559 const PreParserFormalParameterParsingState& formal_parameters, | 1570 const PreParserFormalParameterParsingState& formal_parameters, |
1560 Variable* fvar, Token::Value fvar_init_op, FunctionKind kind, bool* ok); | 1571 Variable* fvar, Token::Value fvar_init_op, FunctionKind kind, bool* ok); |
1561 | 1572 |
1562 V8_INLINE void ParseArrowFunctionFormalParameters( | 1573 V8_INLINE void ParseArrowFunctionFormalParameters( |
1563 PreParserFormalParameterParsingState* parsing_state, | 1574 PreParserFormalParameterParsingState* parsing_state, |
1564 PreParserExpression expression, const Scanner::Location& params_loc, | 1575 PreParserExpression expression, const Scanner::Location& params_loc, |
1565 Scanner::Location* duplicate_loc, bool* ok); | 1576 Scanner::Location* duplicate_loc, bool* ok); |
1566 | 1577 |
| 1578 void ReindexLiterals( |
| 1579 const PreParserFormalParameterParsingState& parsing_state) {} |
| 1580 |
1567 struct TemplateLiteralState {}; | 1581 struct TemplateLiteralState {}; |
1568 | 1582 |
1569 TemplateLiteralState OpenTemplateLiteral(int pos) { | 1583 TemplateLiteralState OpenTemplateLiteral(int pos) { |
1570 return TemplateLiteralState(); | 1584 return TemplateLiteralState(); |
1571 } | 1585 } |
1572 void AddTemplateSpan(TemplateLiteralState*, bool) {} | 1586 void AddTemplateSpan(TemplateLiteralState*, bool) {} |
1573 void AddTemplateExpression(TemplateLiteralState*, PreParserExpression) {} | 1587 void AddTemplateExpression(TemplateLiteralState*, PreParserExpression) {} |
1574 PreParserExpression CloseTemplateLiteral(TemplateLiteralState*, int, | 1588 PreParserExpression CloseTemplateLiteral(TemplateLiteralState*, int, |
1575 PreParserExpression tag) { | 1589 PreParserExpression tag) { |
1576 if (IsTaggedTemplate(tag)) { | 1590 if (IsTaggedTemplate(tag)) { |
(...skipping 1190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2767 ParserBase<Traits>::Checkpoint checkpoint(this); | 2781 ParserBase<Traits>::Checkpoint checkpoint(this); |
2768 ExpressionClassifier arrow_formals_classifier(classifier->duplicate_finder()); | 2782 ExpressionClassifier arrow_formals_classifier(classifier->duplicate_finder()); |
2769 bool parenthesized_formals = peek() == Token::LPAREN; | 2783 bool parenthesized_formals = peek() == Token::LPAREN; |
2770 if (!parenthesized_formals) { | 2784 if (!parenthesized_formals) { |
2771 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier); | 2785 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier); |
2772 } | 2786 } |
2773 ExpressionT expression = this->ParseConditionalExpression( | 2787 ExpressionT expression = this->ParseConditionalExpression( |
2774 accept_IN, &arrow_formals_classifier, CHECK_OK); | 2788 accept_IN, &arrow_formals_classifier, CHECK_OK); |
2775 | 2789 |
2776 if (allow_harmony_arrow_functions() && peek() == Token::ARROW) { | 2790 if (allow_harmony_arrow_functions() && peek() == Token::ARROW) { |
2777 checkpoint.Restore(); | |
2778 BindingPatternUnexpectedToken(classifier); | 2791 BindingPatternUnexpectedToken(classifier); |
2779 ValidateArrowFormalParameters(&arrow_formals_classifier, expression, | 2792 ValidateArrowFormalParameters(&arrow_formals_classifier, expression, |
2780 parenthesized_formals, CHECK_OK); | 2793 parenthesized_formals, CHECK_OK); |
2781 Scanner::Location loc(lhs_location.beg_pos, scanner()->location().end_pos); | 2794 Scanner::Location loc(lhs_location.beg_pos, scanner()->location().end_pos); |
2782 Scope* scope = | 2795 Scope* scope = |
2783 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); | 2796 this->NewScope(scope_, ARROW_SCOPE, FunctionKind::kArrowFunction); |
| 2797 FormalParameterParsingStateT parsing_state(scope); |
| 2798 checkpoint.Restore(&parsing_state.materialized_literals_count); |
| 2799 |
2784 scope->set_start_position(lhs_location.beg_pos); | 2800 scope->set_start_position(lhs_location.beg_pos); |
2785 Scanner::Location duplicate_loc = Scanner::Location::invalid(); | 2801 Scanner::Location duplicate_loc = Scanner::Location::invalid(); |
2786 FormalParameterParsingStateT parsing_state(scope); | |
2787 this->ParseArrowFunctionFormalParameters(&parsing_state, expression, loc, | 2802 this->ParseArrowFunctionFormalParameters(&parsing_state, expression, loc, |
2788 &duplicate_loc, CHECK_OK); | 2803 &duplicate_loc, CHECK_OK); |
2789 if (duplicate_loc.IsValid()) { | 2804 if (duplicate_loc.IsValid()) { |
2790 arrow_formals_classifier.RecordDuplicateFormalParameterError( | 2805 arrow_formals_classifier.RecordDuplicateFormalParameterError( |
2791 duplicate_loc); | 2806 duplicate_loc); |
2792 } | 2807 } |
2793 expression = this->ParseArrowFunctionLiteral( | 2808 expression = this->ParseArrowFunctionLiteral( |
2794 parsing_state, arrow_formals_classifier, CHECK_OK); | 2809 parsing_state, arrow_formals_classifier, CHECK_OK); |
2795 return expression; | 2810 return expression; |
2796 } | 2811 } |
(...skipping 883 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3680 int materialized_literal_count = -1; | 3695 int materialized_literal_count = -1; |
3681 int expected_property_count = -1; | 3696 int expected_property_count = -1; |
3682 Scanner::Location super_loc; | 3697 Scanner::Location super_loc; |
3683 | 3698 |
3684 { | 3699 { |
3685 typename Traits::Type::Factory function_factory(ast_value_factory()); | 3700 typename Traits::Type::Factory function_factory(ast_value_factory()); |
3686 FunctionState function_state(&function_state_, &scope_, | 3701 FunctionState function_state(&function_state_, &scope_, |
3687 formal_parameters.scope, kArrowFunction, | 3702 formal_parameters.scope, kArrowFunction, |
3688 &function_factory); | 3703 &function_factory); |
3689 | 3704 |
| 3705 function_state.SkipMaterializedLiterals( |
| 3706 formal_parameters.materialized_literals_count); |
| 3707 |
| 3708 this->ReindexLiterals(formal_parameters); |
| 3709 |
3690 Expect(Token::ARROW, CHECK_OK); | 3710 Expect(Token::ARROW, CHECK_OK); |
3691 | 3711 |
3692 if (peek() == Token::LBRACE) { | 3712 if (peek() == Token::LBRACE) { |
3693 // Multiple statement body | 3713 // Multiple statement body |
3694 Consume(Token::LBRACE); | 3714 Consume(Token::LBRACE); |
3695 bool is_lazily_parsed = | 3715 bool is_lazily_parsed = |
3696 (mode() == PARSE_LAZILY && scope_->AllowsLazyCompilation()); | 3716 (mode() == PARSE_LAZILY && scope_->AllowsLazyCompilation()); |
3697 if (is_lazily_parsed) { | 3717 if (is_lazily_parsed) { |
3698 body = this->NewStatementList(0, zone()); | 3718 body = this->NewStatementList(0, zone()); |
3699 this->SkipLazyFunctionBody(&materialized_literal_count, | 3719 this->SkipLazyFunctionBody(&materialized_literal_count, |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3944 *ok = false; | 3964 *ok = false; |
3945 return; | 3965 return; |
3946 } | 3966 } |
3947 has_seen_constructor_ = true; | 3967 has_seen_constructor_ = true; |
3948 return; | 3968 return; |
3949 } | 3969 } |
3950 } | 3970 } |
3951 } } // v8::internal | 3971 } } // v8::internal |
3952 | 3972 |
3953 #endif // V8_PREPARSER_H | 3973 #endif // V8_PREPARSER_H |
OLD | NEW |