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

Side by Side Diff: src/parsing/expression-classifier.h

Issue 2258313002: [async functions] Disallow 'await' in arrow params inside async functions (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 4 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 | « no previous file | src/parsing/parser-base.h » ('j') | src/parsing/parser-base.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #define ERROR_CODES(T) \
16 #define ERROR_CODES(T) \ 16 T(ExpressionProduction, 0) \
17 T(ExpressionProduction, 0) \ 17 T(FormalParameterInitializerProduction, 1) \
18 T(FormalParameterInitializerProduction, 1) \ 18 T(BindingPatternProduction, 2) \
19 T(BindingPatternProduction, 2) \ 19 T(AssignmentPatternProduction, 3) \
20 T(AssignmentPatternProduction, 3) \ 20 T(DistinctFormalParametersProduction, 4) \
21 T(DistinctFormalParametersProduction, 4) \ 21 T(StrictModeFormalParametersProduction, 5) \
22 T(StrictModeFormalParametersProduction, 5) \ 22 T(ArrowFormalParametersProduction, 6) \
23 T(ArrowFormalParametersProduction, 6) \ 23 T(LetPatternProduction, 7) \
24 T(LetPatternProduction, 7) \ 24 T(CoverInitializedNameProduction, 8) \
25 T(CoverInitializedNameProduction, 8) \ 25 T(TailCallExpressionProduction, 9) \
26 T(TailCallExpressionProduction, 9) \ 26 T(AsyncArrowFormalParametersProduction, 10)
27 T(AsyncArrowFormalParametersProduction, 10) \
28 T(AsyncBindingPatternProduction, 11)
29
30 27
31 template <typename Traits> 28 template <typename Traits>
32 class ExpressionClassifier { 29 class ExpressionClassifier {
33 public: 30 public:
34 enum ErrorKind : unsigned { 31 enum ErrorKind : unsigned {
35 #define DEFINE_ERROR_KIND(NAME, CODE) k##NAME = CODE, 32 #define DEFINE_ERROR_KIND(NAME, CODE) k##NAME = CODE,
36 ERROR_CODES(DEFINE_ERROR_KIND) 33 ERROR_CODES(DEFINE_ERROR_KIND)
37 #undef DEFINE_ERROR_KIND 34 #undef DEFINE_ERROR_KIND
38 kUnusedError = 15 // Larger than error codes; should fit in 4 bits 35 kUnusedError = 15 // Larger than error codes; should fit in 4 bits
39 }; 36 };
(...skipping 19 matching lines...) Expand all
59 }; 56 };
60 57
61 enum TargetProduction : unsigned { 58 enum TargetProduction : unsigned {
62 #define DEFINE_PRODUCTION(NAME, CODE) NAME = 1 << CODE, 59 #define DEFINE_PRODUCTION(NAME, CODE) NAME = 1 << CODE,
63 ERROR_CODES(DEFINE_PRODUCTION) 60 ERROR_CODES(DEFINE_PRODUCTION)
64 #undef DEFINE_PRODUCTION 61 #undef DEFINE_PRODUCTION
65 62
66 ExpressionProductions = 63 ExpressionProductions =
67 (ExpressionProduction | FormalParameterInitializerProduction | 64 (ExpressionProduction | FormalParameterInitializerProduction |
68 TailCallExpressionProduction), 65 TailCallExpressionProduction),
69 PatternProductions = 66 PatternProductions = (BindingPatternProduction |
70 (BindingPatternProduction | AssignmentPatternProduction | 67 AssignmentPatternProduction | LetPatternProduction),
71 LetPatternProduction | AsyncBindingPatternProduction),
72 FormalParametersProductions = (DistinctFormalParametersProduction | 68 FormalParametersProductions = (DistinctFormalParametersProduction |
73 StrictModeFormalParametersProduction), 69 StrictModeFormalParametersProduction),
74 AllProductions = 70 AllProductions =
75 (ExpressionProductions | PatternProductions | 71 (ExpressionProductions | PatternProductions |
76 FormalParametersProductions | ArrowFormalParametersProduction | 72 FormalParametersProductions | ArrowFormalParametersProduction |
77 CoverInitializedNameProduction | AsyncArrowFormalParametersProduction) 73 CoverInitializedNameProduction | AsyncArrowFormalParametersProduction)
78 }; 74 };
79 75
80 enum FunctionProperties : unsigned { 76 enum FunctionProperties : unsigned {
81 NonSimpleParameter = 1 << 0 77 NonSimpleParameter = 1 << 0
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 } 140 }
145 141
146 V8_INLINE bool is_valid_let_pattern() const { 142 V8_INLINE bool is_valid_let_pattern() const {
147 return is_valid(LetPatternProduction); 143 return is_valid(LetPatternProduction);
148 } 144 }
149 145
150 bool is_valid_async_arrow_formal_parameters() const { 146 bool is_valid_async_arrow_formal_parameters() const {
151 return is_valid(AsyncArrowFormalParametersProduction); 147 return is_valid(AsyncArrowFormalParametersProduction);
152 } 148 }
153 149
154 bool is_valid_async_binding_pattern() const {
155 return is_valid(AsyncBindingPatternProduction);
156 }
157
158 V8_INLINE const Error& expression_error() const { 150 V8_INLINE const Error& expression_error() const {
159 return reported_error(kExpressionProduction); 151 return reported_error(kExpressionProduction);
160 } 152 }
161 153
162 V8_INLINE const Error& formal_parameter_initializer_error() const { 154 V8_INLINE const Error& formal_parameter_initializer_error() const {
163 return reported_error(kFormalParameterInitializerProduction); 155 return reported_error(kFormalParameterInitializerProduction);
164 } 156 }
165 157
166 V8_INLINE const Error& binding_pattern_error() const { 158 V8_INLINE const Error& binding_pattern_error() const {
167 return reported_error(kBindingPatternProduction); 159 return reported_error(kBindingPatternProduction);
(...skipping 30 matching lines...) Expand all
198 V8_INLINE bool has_tail_call_expression() const { 190 V8_INLINE bool has_tail_call_expression() const {
199 return !is_valid(TailCallExpressionProduction); 191 return !is_valid(TailCallExpressionProduction);
200 } 192 }
201 V8_INLINE const Error& tail_call_expression_error() const { 193 V8_INLINE const Error& tail_call_expression_error() const {
202 return reported_error(kTailCallExpressionProduction); 194 return reported_error(kTailCallExpressionProduction);
203 } 195 }
204 V8_INLINE const Error& async_arrow_formal_parameters_error() const { 196 V8_INLINE const Error& async_arrow_formal_parameters_error() const {
205 return reported_error(kAsyncArrowFormalParametersProduction); 197 return reported_error(kAsyncArrowFormalParametersProduction);
206 } 198 }
207 199
208 V8_INLINE const Error& async_binding_pattern_error() const {
209 return reported_error(kAsyncBindingPatternProduction);
210 }
211
212 V8_INLINE bool is_simple_parameter_list() const { 200 V8_INLINE bool is_simple_parameter_list() const {
213 return !(function_properties_ & NonSimpleParameter); 201 return !(function_properties_ & NonSimpleParameter);
214 } 202 }
215 203
216 V8_INLINE void RecordNonSimpleParameter() { 204 V8_INLINE void RecordNonSimpleParameter() {
217 function_properties_ |= NonSimpleParameter; 205 function_properties_ |= NonSimpleParameter;
218 } 206 }
219 207
220 void RecordExpressionError(const Scanner::Location& loc, 208 void RecordExpressionError(const Scanner::Location& loc,
221 MessageTemplate::Template message, 209 MessageTemplate::Template message,
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 } 261 }
274 262
275 void RecordAsyncArrowFormalParametersError(const Scanner::Location& loc, 263 void RecordAsyncArrowFormalParametersError(const Scanner::Location& loc,
276 MessageTemplate::Template message, 264 MessageTemplate::Template message,
277 const char* arg = nullptr) { 265 const char* arg = nullptr) {
278 if (!is_valid_async_arrow_formal_parameters()) return; 266 if (!is_valid_async_arrow_formal_parameters()) return;
279 invalid_productions_ |= AsyncArrowFormalParametersProduction; 267 invalid_productions_ |= AsyncArrowFormalParametersProduction;
280 Add(Error(loc, message, kAsyncArrowFormalParametersProduction, arg)); 268 Add(Error(loc, message, kAsyncArrowFormalParametersProduction, arg));
281 } 269 }
282 270
283 void RecordAsyncBindingPatternError(const Scanner::Location& loc,
284 MessageTemplate::Template message,
285 const char* arg = nullptr) {
286 if (!is_valid_async_binding_pattern()) return;
287 invalid_productions_ |= AsyncBindingPatternProduction;
288 Add(Error(loc, message, kAsyncBindingPatternProduction, arg));
289 }
290
291 void RecordDuplicateFormalParameterError(const Scanner::Location& loc) { 271 void RecordDuplicateFormalParameterError(const Scanner::Location& loc) {
292 if (!is_valid_formal_parameter_list_without_duplicates()) return; 272 if (!is_valid_formal_parameter_list_without_duplicates()) return;
293 invalid_productions_ |= DistinctFormalParametersProduction; 273 invalid_productions_ |= DistinctFormalParametersProduction;
294 Add(Error(loc, MessageTemplate::kParamDupe, 274 Add(Error(loc, MessageTemplate::kParamDupe,
295 kDistinctFormalParametersProduction)); 275 kDistinctFormalParametersProduction));
296 } 276 }
297 277
298 // Record a binding that would be invalid in strict mode. Confusingly this 278 // Record a binding that would be invalid in strict mode. Confusingly this
299 // is not the same as StrictFormalParameterList, which simply forbids 279 // is not the same as StrictFormalParameterList, which simply forbids
300 // duplicate bindings. 280 // duplicate bindings.
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 }; 472 };
493 473
494 474
495 #undef ERROR_CODES 475 #undef ERROR_CODES
496 476
497 477
498 } // namespace internal 478 } // namespace internal
499 } // namespace v8 479 } // namespace v8
500 480
501 #endif // V8_PARSING_EXPRESSION_CLASSIFIER_H 481 #endif // V8_PARSING_EXPRESSION_CLASSIFIER_H
OLDNEW
« no previous file with comments | « no previous file | src/parsing/parser-base.h » ('j') | src/parsing/parser-base.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698