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 #define ERROR_CODES(T) \ | 16 #define ERROR_CODES(T) \ |
17 T(ExpressionProduction, 0) \ | 17 T(ExpressionProduction, 0) \ |
18 T(FormalParameterInitializerProduction, 1) \ | 18 T(FormalParameterInitializerProduction, 1) \ |
19 T(BindingPatternProduction, 2) \ | 19 T(BindingPatternProduction, 2) \ |
20 T(AssignmentPatternProduction, 3) \ | 20 T(AssignmentPatternProduction, 3) \ |
21 T(DistinctFormalParametersProduction, 4) \ | 21 T(DistinctFormalParametersProduction, 4) \ |
22 T(StrictModeFormalParametersProduction, 5) \ | 22 T(StrictModeFormalParametersProduction, 5) \ |
23 T(ArrowFormalParametersProduction, 6) \ | 23 T(ArrowFormalParametersProduction, 6) \ |
24 T(LetPatternProduction, 7) \ | 24 T(LetPatternProduction, 7) \ |
25 T(CoverInitializedNameProduction, 8) \ | 25 T(CoverInitializedNameProduction, 8) \ |
26 T(TailCallExpressionProduction, 9) \ | 26 T(TailCallExpressionProduction, 9) \ |
27 T(AsyncArrowFormalParametersProduction, 10) \ | 27 T(AsyncArrowFormalParametersProduction, 10) \ |
28 T(AsyncBindingPatternProduction, 11) | 28 T(AsyncBindingPatternProduction, 11) \ |
29 T(AnnexBDuplicateProtoProduction, 12) | |
adamk
2016/08/19 20:17:07
Let's just call this DuplicateProtoProduction.
gsathya
2016/08/19 23:22:57
Changed to ObjectLiteralProduction as discussed of
| |
29 | 30 |
30 | 31 |
31 template <typename Traits> | 32 template <typename Traits> |
32 class ExpressionClassifier { | 33 class ExpressionClassifier { |
33 public: | 34 public: |
34 enum ErrorKind : unsigned { | 35 enum ErrorKind : unsigned { |
35 #define DEFINE_ERROR_KIND(NAME, CODE) k##NAME = CODE, | 36 #define DEFINE_ERROR_KIND(NAME, CODE) k##NAME = CODE, |
36 ERROR_CODES(DEFINE_ERROR_KIND) | 37 ERROR_CODES(DEFINE_ERROR_KIND) |
37 #undef DEFINE_ERROR_KIND | 38 #undef DEFINE_ERROR_KIND |
38 kUnusedError = 15 // Larger than error codes; should fit in 4 bits | 39 kUnusedError = 15 // Larger than error codes; should fit in 4 bits |
(...skipping 28 matching lines...) Expand all Loading... | |
67 (ExpressionProduction | FormalParameterInitializerProduction | | 68 (ExpressionProduction | FormalParameterInitializerProduction | |
68 TailCallExpressionProduction), | 69 TailCallExpressionProduction), |
69 PatternProductions = | 70 PatternProductions = |
70 (BindingPatternProduction | AssignmentPatternProduction | | 71 (BindingPatternProduction | AssignmentPatternProduction | |
71 LetPatternProduction | AsyncBindingPatternProduction), | 72 LetPatternProduction | AsyncBindingPatternProduction), |
72 FormalParametersProductions = (DistinctFormalParametersProduction | | 73 FormalParametersProductions = (DistinctFormalParametersProduction | |
73 StrictModeFormalParametersProduction), | 74 StrictModeFormalParametersProduction), |
74 AllProductions = | 75 AllProductions = |
75 (ExpressionProductions | PatternProductions | | 76 (ExpressionProductions | PatternProductions | |
76 FormalParametersProductions | ArrowFormalParametersProduction | | 77 FormalParametersProductions | ArrowFormalParametersProduction | |
77 CoverInitializedNameProduction | AsyncArrowFormalParametersProduction) | 78 CoverInitializedNameProduction | AsyncArrowFormalParametersProduction | |
79 AnnexBDuplicateProtoProduction) | |
78 }; | 80 }; |
79 | 81 |
80 enum FunctionProperties : unsigned { | 82 enum FunctionProperties : unsigned { |
81 NonSimpleParameter = 1 << 0 | 83 NonSimpleParameter = 1 << 0 |
82 }; | 84 }; |
83 | 85 |
84 explicit ExpressionClassifier(const Traits* t) | 86 explicit ExpressionClassifier(const Traits* t) |
85 : zone_(t->zone()), | 87 : zone_(t->zone()), |
86 non_patterns_to_rewrite_(t->GetNonPatternList()), | 88 non_patterns_to_rewrite_(t->GetNonPatternList()), |
87 reported_errors_(t->GetReportedErrorList()), | 89 reported_errors_(t->GetReportedErrorList()), |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
194 V8_INLINE const Error& cover_initialized_name_error() const { | 196 V8_INLINE const Error& cover_initialized_name_error() const { |
195 return reported_error(kCoverInitializedNameProduction); | 197 return reported_error(kCoverInitializedNameProduction); |
196 } | 198 } |
197 | 199 |
198 V8_INLINE bool has_tail_call_expression() const { | 200 V8_INLINE bool has_tail_call_expression() const { |
199 return !is_valid(TailCallExpressionProduction); | 201 return !is_valid(TailCallExpressionProduction); |
200 } | 202 } |
201 V8_INLINE const Error& tail_call_expression_error() const { | 203 V8_INLINE const Error& tail_call_expression_error() const { |
202 return reported_error(kTailCallExpressionProduction); | 204 return reported_error(kTailCallExpressionProduction); |
203 } | 205 } |
206 | |
207 V8_INLINE bool has_annexb_duplicate_proto() const { | |
208 return !is_valid(AnnexBDuplicateProtoProduction); | |
209 } | |
210 | |
211 V8_INLINE const Error& annexb_duplicate_proto_error() const { | |
212 return reported_error(kAnnexBDuplicateProtoProduction); | |
213 } | |
214 | |
204 V8_INLINE const Error& async_arrow_formal_parameters_error() const { | 215 V8_INLINE const Error& async_arrow_formal_parameters_error() const { |
205 return reported_error(kAsyncArrowFormalParametersProduction); | 216 return reported_error(kAsyncArrowFormalParametersProduction); |
206 } | 217 } |
207 | 218 |
208 V8_INLINE const Error& async_binding_pattern_error() const { | 219 V8_INLINE const Error& async_binding_pattern_error() const { |
209 return reported_error(kAsyncBindingPatternProduction); | 220 return reported_error(kAsyncBindingPatternProduction); |
210 } | 221 } |
211 | 222 |
212 V8_INLINE bool is_simple_parameter_list() const { | 223 V8_INLINE bool is_simple_parameter_list() const { |
213 return !(function_properties_ & NonSimpleParameter); | 224 return !(function_properties_ & NonSimpleParameter); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
323 } | 334 } |
324 | 335 |
325 void RecordTailCallExpressionError(const Scanner::Location& loc, | 336 void RecordTailCallExpressionError(const Scanner::Location& loc, |
326 MessageTemplate::Template message, | 337 MessageTemplate::Template message, |
327 const char* arg = nullptr) { | 338 const char* arg = nullptr) { |
328 if (has_tail_call_expression()) return; | 339 if (has_tail_call_expression()) return; |
329 invalid_productions_ |= TailCallExpressionProduction; | 340 invalid_productions_ |= TailCallExpressionProduction; |
330 Add(Error(loc, message, kTailCallExpressionProduction, arg)); | 341 Add(Error(loc, message, kTailCallExpressionProduction, arg)); |
331 } | 342 } |
332 | 343 |
344 void RecordAnnexBDuplicateProtoError(const Scanner::Location& loc, | |
345 MessageTemplate::Template message, | |
346 const char* arg = nullptr) { | |
347 if (has_annexb_duplicate_proto()) return; | |
348 invalid_productions_ |= AnnexBDuplicateProtoProduction; | |
349 Add(Error(loc, message, kAnnexBDuplicateProtoProduction, arg)); | |
350 } | |
351 | |
333 void ForgiveCoverInitializedNameError() { | 352 void ForgiveCoverInitializedNameError() { |
334 if (!(invalid_productions_ & CoverInitializedNameProduction)) return; | 353 if (!(invalid_productions_ & CoverInitializedNameProduction)) return; |
335 Error& e = reported_error(kCoverInitializedNameProduction); | 354 Error& e = reported_error(kCoverInitializedNameProduction); |
336 e.kind = kUnusedError; | 355 e.kind = kUnusedError; |
337 invalid_productions_ &= ~CoverInitializedNameProduction; | 356 invalid_productions_ &= ~CoverInitializedNameProduction; |
338 } | 357 } |
339 | 358 |
340 void ForgiveAssignmentPatternError() { | 359 void ForgiveAssignmentPatternError() { |
341 if (!(invalid_productions_ & AssignmentPatternProduction)) return; | 360 if (!(invalid_productions_ & AssignmentPatternProduction)) return; |
342 Error& e = reported_error(kAssignmentPatternProduction); | 361 Error& e = reported_error(kAssignmentPatternProduction); |
343 e.kind = kUnusedError; | 362 e.kind = kUnusedError; |
344 invalid_productions_ &= ~AssignmentPatternProduction; | 363 invalid_productions_ &= ~AssignmentPatternProduction; |
345 } | 364 } |
346 | 365 |
366 void ForgiveAnnexBDuplicateProtoError() { | |
367 if (!(invalid_productions_ & AnnexBDuplicateProtoProduction)) return; | |
368 Error& e = reported_error(kAnnexBDuplicateProtoProduction); | |
369 e.kind = kUnusedError; | |
370 invalid_productions_ &= ~AnnexBDuplicateProtoProduction; | |
371 } | |
372 | |
347 void Accumulate(ExpressionClassifier* inner, unsigned productions, | 373 void Accumulate(ExpressionClassifier* inner, unsigned productions, |
348 bool merge_non_patterns = true) { | 374 bool merge_non_patterns = true) { |
349 DCHECK_EQ(inner->reported_errors_, reported_errors_); | 375 DCHECK_EQ(inner->reported_errors_, reported_errors_); |
350 DCHECK_EQ(inner->reported_errors_begin_, reported_errors_end_); | 376 DCHECK_EQ(inner->reported_errors_begin_, reported_errors_end_); |
351 DCHECK_EQ(inner->reported_errors_end_, reported_errors_->length()); | 377 DCHECK_EQ(inner->reported_errors_end_, reported_errors_->length()); |
352 if (merge_non_patterns) MergeNonPatterns(inner); | 378 if (merge_non_patterns) MergeNonPatterns(inner); |
353 // Propagate errors from inner, but don't overwrite already recorded | 379 // Propagate errors from inner, but don't overwrite already recorded |
354 // errors. | 380 // errors. |
355 unsigned non_arrow_inner_invalid_productions = | 381 unsigned non_arrow_inner_invalid_productions = |
356 inner->invalid_productions_ & ~ArrowFormalParametersProduction; | 382 inner->invalid_productions_ & ~ArrowFormalParametersProduction; |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
492 }; | 518 }; |
493 | 519 |
494 | 520 |
495 #undef ERROR_CODES | 521 #undef ERROR_CODES |
496 | 522 |
497 | 523 |
498 } // namespace internal | 524 } // namespace internal |
499 } // namespace v8 | 525 } // namespace v8 |
500 | 526 |
501 #endif // V8_PARSING_EXPRESSION_CLASSIFIER_H | 527 #endif // V8_PARSING_EXPRESSION_CLASSIFIER_H |
OLD | NEW |