| 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 #define ERROR_CODES(T) \ | 15 #define ERROR_CODES(T) \ |
| 16 T(ExpressionProduction, 0) \ | 16 T(ExpressionProduction, 0) \ |
| 17 T(FormalParameterInitializerProduction, 1) \ | 17 T(FormalParameterInitializerProduction, 1) \ |
| 18 T(BindingPatternProduction, 2) \ | 18 T(BindingPatternProduction, 2) \ |
| 19 T(AssignmentPatternProduction, 3) \ | 19 T(AssignmentPatternProduction, 3) \ |
| 20 T(DistinctFormalParametersProduction, 4) \ | 20 T(DistinctFormalParametersProduction, 4) \ |
| 21 T(StrictModeFormalParametersProduction, 5) \ | 21 T(StrictModeFormalParametersProduction, 5) \ |
| 22 T(ArrowFormalParametersProduction, 6) \ | 22 T(ArrowFormalParametersProduction, 6) \ |
| 23 T(LetPatternProduction, 7) \ | 23 T(LetPatternProduction, 7) \ |
| 24 T(ObjectLiteralProduction, 8) \ | 24 T(ObjectLiteralProduction, 8) \ |
| 25 T(TailCallExpressionProduction, 9) \ | 25 T(TailCallExpressionProduction, 9) \ |
| 26 T(AsyncArrowFormalParametersProduction, 10) | 26 T(AsyncArrowFormalParametersProduction, 10) |
| 27 | 27 |
| 28 template <typename Traits> | 28 template <typename Types> |
| 29 class ExpressionClassifier { | 29 class ExpressionClassifier { |
| 30 public: | 30 public: |
| 31 enum ErrorKind : unsigned { | 31 enum ErrorKind : unsigned { |
| 32 #define DEFINE_ERROR_KIND(NAME, CODE) k##NAME = CODE, | 32 #define DEFINE_ERROR_KIND(NAME, CODE) k##NAME = CODE, |
| 33 ERROR_CODES(DEFINE_ERROR_KIND) | 33 ERROR_CODES(DEFINE_ERROR_KIND) |
| 34 #undef DEFINE_ERROR_KIND | 34 #undef DEFINE_ERROR_KIND |
| 35 kUnusedError = 15 // Larger than error codes; should fit in 4 bits | 35 kUnusedError = 15 // Larger than error codes; should fit in 4 bits |
| 36 }; | 36 }; |
| 37 | 37 |
| 38 struct Error { | 38 struct Error { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 AllProductions = | 70 AllProductions = |
| 71 (ExpressionProductions | PatternProductions | | 71 (ExpressionProductions | PatternProductions | |
| 72 FormalParametersProductions | ArrowFormalParametersProduction | | 72 FormalParametersProductions | ArrowFormalParametersProduction | |
| 73 ObjectLiteralProduction | AsyncArrowFormalParametersProduction) | 73 ObjectLiteralProduction | AsyncArrowFormalParametersProduction) |
| 74 }; | 74 }; |
| 75 | 75 |
| 76 enum FunctionProperties : unsigned { | 76 enum FunctionProperties : unsigned { |
| 77 NonSimpleParameter = 1 << 0 | 77 NonSimpleParameter = 1 << 0 |
| 78 }; | 78 }; |
| 79 | 79 |
| 80 explicit ExpressionClassifier(const typename Traits::Type::Base* base, | 80 explicit ExpressionClassifier(const typename Types::Base* base, |
| 81 DuplicateFinder* duplicate_finder = nullptr) | 81 DuplicateFinder* duplicate_finder = nullptr) |
| 82 : zone_(base->impl()->zone()), | 82 : zone_(base->impl()->zone()), |
| 83 non_patterns_to_rewrite_(base->impl()->GetNonPatternList()), | 83 non_patterns_to_rewrite_(base->impl()->GetNonPatternList()), |
| 84 reported_errors_(base->impl()->GetReportedErrorList()), | 84 reported_errors_(base->impl()->GetReportedErrorList()), |
| 85 duplicate_finder_(duplicate_finder), | 85 duplicate_finder_(duplicate_finder), |
| 86 invalid_productions_(0), | 86 invalid_productions_(0), |
| 87 function_properties_(0) { | 87 function_properties_(0) { |
| 88 reported_errors_begin_ = reported_errors_end_ = reported_errors_->length(); | 88 reported_errors_begin_ = reported_errors_end_ = reported_errors_->length(); |
| 89 non_pattern_begin_ = non_patterns_to_rewrite_->length(); | 89 non_pattern_begin_ = non_patterns_to_rewrite_->length(); |
| 90 } | 90 } |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 // in an inner classifier) or it could be an existing error (in case a | 418 // in an inner classifier) or it could be an existing error (in case a |
| 419 // copy is needed). | 419 // copy is needed). |
| 420 V8_INLINE void Copy(int i) { | 420 V8_INLINE void Copy(int i) { |
| 421 DCHECK_LT(i, reported_errors_->length()); | 421 DCHECK_LT(i, reported_errors_->length()); |
| 422 if (reported_errors_end_ != i) | 422 if (reported_errors_end_ != i) |
| 423 reported_errors_->at(reported_errors_end_) = reported_errors_->at(i); | 423 reported_errors_->at(reported_errors_end_) = reported_errors_->at(i); |
| 424 reported_errors_end_++; | 424 reported_errors_end_++; |
| 425 } | 425 } |
| 426 | 426 |
| 427 Zone* zone_; | 427 Zone* zone_; |
| 428 ZoneList<typename Traits::Type::Expression>* non_patterns_to_rewrite_; | 428 ZoneList<typename Types::Expression>* non_patterns_to_rewrite_; |
| 429 ZoneList<Error>* reported_errors_; | 429 ZoneList<Error>* reported_errors_; |
| 430 DuplicateFinder* duplicate_finder_; | 430 DuplicateFinder* duplicate_finder_; |
| 431 // The uint16_t for non_pattern_begin_ will not be enough in the case, | 431 // The uint16_t for non_pattern_begin_ will not be enough in the case, |
| 432 // e.g., of an array literal containing more than 64K inner array | 432 // e.g., of an array literal containing more than 64K inner array |
| 433 // literals with spreads, as in: | 433 // literals with spreads, as in: |
| 434 // var N=65536; eval("var x=[];" + "[" + "[...x],".repeat(N) + "].length"); | 434 // var N=65536; eval("var x=[];" + "[" + "[...x],".repeat(N) + "].length"); |
| 435 // An implementation limit error in ParserBase::AddNonPatternForRewriting | 435 // An implementation limit error in ParserBase::AddNonPatternForRewriting |
| 436 // will be triggered in this case. | 436 // will be triggered in this case. |
| 437 uint16_t non_pattern_begin_; | 437 uint16_t non_pattern_begin_; |
| 438 unsigned invalid_productions_ : 14; | 438 unsigned invalid_productions_ : 14; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 449 }; | 449 }; |
| 450 | 450 |
| 451 | 451 |
| 452 #undef ERROR_CODES | 452 #undef ERROR_CODES |
| 453 | 453 |
| 454 | 454 |
| 455 } // namespace internal | 455 } // namespace internal |
| 456 } // namespace v8 | 456 } // namespace v8 |
| 457 | 457 |
| 458 #endif // V8_PARSING_EXPRESSION_CLASSIFIER_H | 458 #endif // V8_PARSING_EXPRESSION_CLASSIFIER_H |
| OLD | NEW |