| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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_PARSING_EXPRESSION_CLASSIFIER_H | 5 #ifndef V8_PARSING_EXPRESSION_CLASSIFIER_H |
| 6 #define V8_PARSING_EXPRESSION_CLASSIFIER_H | 6 #define V8_PARSING_EXPRESSION_CLASSIFIER_H |
| 7 | 7 |
| 8 #include "src/messages.h" | 8 #include "src/messages.h" |
| 9 #include "src/parsing/scanner.h" | 9 #include "src/parsing/scanner.h" |
| 10 #include "src/parsing/token.h" | 10 #include "src/parsing/token.h" |
| 11 | 11 |
| 12 namespace v8 { | 12 namespace v8 { |
| 13 namespace internal { | 13 namespace internal { |
| 14 | 14 |
| 15 | 15 |
| 16 template <typename Traits> | 16 template <typename Traits> |
| 17 class ExpressionClassifier { | 17 class ExpressionClassifier { |
| 18 public: | 18 public: |
| 19 struct Error { | 19 struct Error { |
| 20 Error() | 20 Error() { reset(); } |
| 21 : location(Scanner::Location::invalid()), | |
| 22 message(MessageTemplate::kNone), | |
| 23 type(kSyntaxError), | |
| 24 arg(nullptr) {} | |
| 25 | 21 |
| 26 Scanner::Location location; | 22 Scanner::Location location; |
| 27 MessageTemplate::Template message : 30; | 23 MessageTemplate::Template message : 30; |
| 28 ParseErrorType type : 2; | 24 ParseErrorType type : 2; |
| 29 const char* arg; | 25 const char* arg; |
| 26 |
| 27 V8_INLINE void reset() { |
| 28 location.beg_pos = location.end_pos = -1; |
| 29 message = MessageTemplate::kNone; |
| 30 type = kSyntaxError; |
| 31 arg = nullptr; |
| 32 } |
| 30 }; | 33 }; |
| 31 | 34 |
| 32 enum TargetProduction { | 35 enum TargetProduction { |
| 33 ExpressionProduction = 1 << 0, | 36 ExpressionProduction = 1 << 0, |
| 34 FormalParameterInitializerProduction = 1 << 1, | 37 FormalParameterInitializerProduction = 1 << 1, |
| 35 BindingPatternProduction = 1 << 2, | 38 BindingPatternProduction = 1 << 2, |
| 36 AssignmentPatternProduction = 1 << 3, | 39 AssignmentPatternProduction = 1 << 3, |
| 37 DistinctFormalParametersProduction = 1 << 4, | 40 DistinctFormalParametersProduction = 1 << 4, |
| 38 StrictModeFormalParametersProduction = 1 << 5, | 41 StrictModeFormalParametersProduction = 1 << 5, |
| 39 ArrowFormalParametersProduction = 1 << 6, | 42 ArrowFormalParametersProduction = 1 << 6, |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 const char* arg = nullptr) { | 316 const char* arg = nullptr) { |
| 314 if (has_tail_call_expression()) return; | 317 if (has_tail_call_expression()) return; |
| 315 invalid_productions_ |= TailCallExpressionProduction; | 318 invalid_productions_ |= TailCallExpressionProduction; |
| 316 tail_call_expression_error_.location = loc; | 319 tail_call_expression_error_.location = loc; |
| 317 tail_call_expression_error_.message = message; | 320 tail_call_expression_error_.message = message; |
| 318 tail_call_expression_error_.arg = arg; | 321 tail_call_expression_error_.arg = arg; |
| 319 } | 322 } |
| 320 | 323 |
| 321 void ForgiveCoverInitializedNameError() { | 324 void ForgiveCoverInitializedNameError() { |
| 322 invalid_productions_ &= ~CoverInitializedNameProduction; | 325 invalid_productions_ &= ~CoverInitializedNameProduction; |
| 323 cover_initialized_name_error_ = Error(); | 326 cover_initialized_name_error_.reset(); |
| 324 } | 327 } |
| 325 | 328 |
| 326 void ForgiveAssignmentPatternError() { | 329 void ForgiveAssignmentPatternError() { |
| 327 invalid_productions_ &= ~AssignmentPatternProduction; | 330 invalid_productions_ &= ~AssignmentPatternProduction; |
| 328 assignment_pattern_error_ = Error(); | 331 assignment_pattern_error_.reset(); |
| 329 } | 332 } |
| 330 | 333 |
| 331 void Accumulate(ExpressionClassifier* inner, | 334 void Accumulate(ExpressionClassifier* inner, |
| 332 unsigned productions = StandardProductions, | 335 unsigned productions = StandardProductions, |
| 333 bool merge_non_patterns = true) { | 336 bool merge_non_patterns = true) { |
| 334 if (merge_non_patterns) MergeNonPatterns(inner); | 337 if (merge_non_patterns) MergeNonPatterns(inner); |
| 335 // Propagate errors from inner, but don't overwrite already recorded | 338 // Propagate errors from inner, but don't overwrite already recorded |
| 336 // errors. | 339 // errors. |
| 337 unsigned non_arrow_inner_invalid_productions = | 340 unsigned non_arrow_inner_invalid_productions = |
| 338 inner->invalid_productions_ & ~ArrowFormalParametersProduction; | 341 inner->invalid_productions_ & ~ArrowFormalParametersProduction; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 Error async_arrow_formal_parameters_error_; | 423 Error async_arrow_formal_parameters_error_; |
| 421 Error async_binding_pattern_error_; | 424 Error async_binding_pattern_error_; |
| 422 DuplicateFinder* duplicate_finder_; | 425 DuplicateFinder* duplicate_finder_; |
| 423 }; | 426 }; |
| 424 | 427 |
| 425 | 428 |
| 426 } // namespace internal | 429 } // namespace internal |
| 427 } // namespace v8 | 430 } // namespace v8 |
| 428 | 431 |
| 429 #endif // V8_PARSING_EXPRESSION_CLASSIFIER_H | 432 #endif // V8_PARSING_EXPRESSION_CLASSIFIER_H |
| OLD | NEW |