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_PARSING_PREPARSER_H | 5 #ifndef V8_PARSING_PREPARSER_H |
6 #define V8_PARSING_PREPARSER_H | 6 #define V8_PARSING_PREPARSER_H |
7 | 7 |
8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
10 #include "src/base/hashmap.h" | 10 #include "src/base/hashmap.h" |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 | 116 |
117 explicit PreParserIdentifier(Type type) : type_(type) {} | 117 explicit PreParserIdentifier(Type type) : type_(type) {} |
118 Type type_; | 118 Type type_; |
119 | 119 |
120 friend class PreParserExpression; | 120 friend class PreParserExpression; |
121 }; | 121 }; |
122 | 122 |
123 | 123 |
124 class PreParserExpression { | 124 class PreParserExpression { |
125 public: | 125 public: |
126 PreParserExpression() : code_(TypeField::encode(kExpression)) {} | 126 PreParserExpression() : code_(TypeField::encode(kEmpty)) {} |
| 127 |
| 128 static PreParserExpression Empty() { return PreParserExpression(); } |
127 | 129 |
128 static PreParserExpression Default() { | 130 static PreParserExpression Default() { |
129 return PreParserExpression(); | 131 return PreParserExpression(TypeField::encode(kExpression)); |
130 } | 132 } |
131 | 133 |
132 static PreParserExpression Spread(PreParserExpression expression) { | 134 static PreParserExpression Spread(PreParserExpression expression) { |
133 return PreParserExpression(TypeField::encode(kSpreadExpression)); | 135 return PreParserExpression(TypeField::encode(kSpreadExpression)); |
134 } | 136 } |
135 | 137 |
136 static PreParserExpression FromIdentifier(PreParserIdentifier id) { | 138 static PreParserExpression FromIdentifier(PreParserIdentifier id) { |
137 return PreParserExpression(TypeField::encode(kIdentifierExpression) | | 139 return PreParserExpression(TypeField::encode(kIdentifierExpression) | |
138 IdentifierTypeField::encode(id.type_)); | 140 IdentifierTypeField::encode(id.type_)); |
139 } | 141 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 TypeField::encode(kExpression) | | 201 TypeField::encode(kExpression) | |
200 ExpressionTypeField::encode(kSuperCallReference)); | 202 ExpressionTypeField::encode(kSuperCallReference)); |
201 } | 203 } |
202 | 204 |
203 static PreParserExpression NoTemplateTag() { | 205 static PreParserExpression NoTemplateTag() { |
204 return PreParserExpression( | 206 return PreParserExpression( |
205 TypeField::encode(kExpression) | | 207 TypeField::encode(kExpression) | |
206 ExpressionTypeField::encode(kNoTemplateTagExpression)); | 208 ExpressionTypeField::encode(kNoTemplateTagExpression)); |
207 } | 209 } |
208 | 210 |
| 211 bool IsEmpty() const { return TypeField::decode(code_) == kEmpty; } |
| 212 |
209 bool IsIdentifier() const { | 213 bool IsIdentifier() const { |
210 return TypeField::decode(code_) == kIdentifierExpression; | 214 return TypeField::decode(code_) == kIdentifierExpression; |
211 } | 215 } |
212 | 216 |
213 PreParserIdentifier AsIdentifier() const { | 217 PreParserIdentifier AsIdentifier() const { |
214 DCHECK(IsIdentifier()); | 218 DCHECK(IsIdentifier()); |
215 return PreParserIdentifier(IdentifierTypeField::decode(code_)); | 219 return PreParserIdentifier(IdentifierTypeField::decode(code_)); |
216 } | 220 } |
217 | 221 |
218 bool IsAssignment() const { | 222 bool IsAssignment() const { |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 | 279 |
276 // At the moment PreParser doesn't track these expression types. | 280 // At the moment PreParser doesn't track these expression types. |
277 bool IsFunctionLiteral() const { return false; } | 281 bool IsFunctionLiteral() const { return false; } |
278 bool IsCallNew() const { return false; } | 282 bool IsCallNew() const { return false; } |
279 | 283 |
280 bool IsNoTemplateTag() const { | 284 bool IsNoTemplateTag() const { |
281 return TypeField::decode(code_) == kExpression && | 285 return TypeField::decode(code_) == kExpression && |
282 ExpressionTypeField::decode(code_) == kNoTemplateTagExpression; | 286 ExpressionTypeField::decode(code_) == kNoTemplateTagExpression; |
283 } | 287 } |
284 | 288 |
285 bool IsSpreadExpression() const { | 289 bool IsSpread() const { |
286 return TypeField::decode(code_) == kSpreadExpression; | 290 return TypeField::decode(code_) == kSpreadExpression; |
287 } | 291 } |
288 | 292 |
289 PreParserExpression AsFunctionLiteral() { return *this; } | 293 PreParserExpression AsFunctionLiteral() { return *this; } |
290 | 294 |
291 bool IsBinaryOperation() const { | 295 bool IsBinaryOperation() const { |
292 return TypeField::decode(code_) == kBinaryOperationExpression; | 296 return TypeField::decode(code_) == kBinaryOperationExpression; |
293 } | 297 } |
294 | 298 |
295 // Dummy implementation for making expression->somefunc() work in both Parser | 299 // Dummy implementation for making expression->somefunc() work in both Parser |
296 // and PreParser. | 300 // and PreParser. |
297 PreParserExpression* operator->() { return this; } | 301 PreParserExpression* operator->() { return this; } |
298 | 302 |
299 // More dummy implementations of things PreParser doesn't need to track: | 303 // More dummy implementations of things PreParser doesn't need to track: |
300 void set_index(int index) {} // For YieldExpressions | 304 void set_index(int index) {} // For YieldExpressions |
301 void set_should_eager_compile() {} | 305 void set_should_eager_compile() {} |
302 | 306 |
303 int position() const { return kNoSourcePosition; } | 307 int position() const { return kNoSourcePosition; } |
304 void set_function_token_position(int position) {} | 308 void set_function_token_position(int position) {} |
305 | 309 |
306 private: | 310 private: |
307 enum Type { | 311 enum Type { |
| 312 kEmpty, |
308 kExpression, | 313 kExpression, |
309 kIdentifierExpression, | 314 kIdentifierExpression, |
310 kStringLiteralExpression, | 315 kStringLiteralExpression, |
311 kBinaryOperationExpression, | 316 kBinaryOperationExpression, |
312 kSpreadExpression, | 317 kSpreadExpression, |
313 kObjectLiteralExpression, | 318 kObjectLiteralExpression, |
314 kArrayLiteralExpression | 319 kArrayLiteralExpression |
315 }; | 320 }; |
316 | 321 |
317 enum ExpressionType { | 322 enum ExpressionType { |
(...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
992 const AstRawString* arg, | 997 const AstRawString* arg, |
993 ParseErrorType error_type = kSyntaxError) { | 998 ParseErrorType error_type = kSyntaxError) { |
994 UNREACHABLE(); | 999 UNREACHABLE(); |
995 } | 1000 } |
996 | 1001 |
997 // "null" return type creators. | 1002 // "null" return type creators. |
998 V8_INLINE static PreParserIdentifier EmptyIdentifier() { | 1003 V8_INLINE static PreParserIdentifier EmptyIdentifier() { |
999 return PreParserIdentifier::Default(); | 1004 return PreParserIdentifier::Default(); |
1000 } | 1005 } |
1001 V8_INLINE static PreParserExpression EmptyExpression() { | 1006 V8_INLINE static PreParserExpression EmptyExpression() { |
1002 return PreParserExpression::Default(); | 1007 return PreParserExpression::Empty(); |
1003 } | 1008 } |
1004 V8_INLINE static PreParserExpression EmptyLiteral() { | 1009 V8_INLINE static PreParserExpression EmptyLiteral() { |
1005 return PreParserExpression::Default(); | 1010 return PreParserExpression::Default(); |
1006 } | 1011 } |
1007 V8_INLINE static PreParserExpression EmptyObjectLiteralProperty() { | 1012 V8_INLINE static PreParserExpression EmptyObjectLiteralProperty() { |
1008 return PreParserExpression::Default(); | 1013 return PreParserExpression::Default(); |
1009 } | 1014 } |
1010 V8_INLINE static PreParserExpression EmptyFunctionLiteral() { | 1015 V8_INLINE static PreParserExpression EmptyFunctionLiteral() { |
1011 return PreParserExpression::Default(); | 1016 return PreParserExpression::Default(); |
1012 } | 1017 } |
1013 | 1018 |
| 1019 V8_INLINE static bool IsEmptyExpression(PreParserExpression expr) { |
| 1020 return expr.IsEmpty(); |
| 1021 } |
| 1022 |
1014 V8_INLINE static PreParserExpressionList NullExpressionList() { | 1023 V8_INLINE static PreParserExpressionList NullExpressionList() { |
1015 return PreParserExpressionList(); | 1024 return PreParserExpressionList(); |
1016 } | 1025 } |
1017 V8_INLINE PreParserIdentifier EmptyIdentifierString() const { | 1026 V8_INLINE PreParserIdentifier EmptyIdentifierString() const { |
1018 return PreParserIdentifier::Default(); | 1027 return PreParserIdentifier::Default(); |
1019 } | 1028 } |
1020 | 1029 |
1021 // Odd-ball literal creators. | 1030 // Odd-ball literal creators. |
1022 V8_INLINE PreParserExpression GetLiteralTheHole(int position) { | 1031 V8_INLINE PreParserExpression GetLiteralTheHole(int position) { |
1023 return PreParserExpression::Default(); | 1032 return PreParserExpression::Default(); |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1193 function_state_->NextMaterializedLiteralIndex(); | 1202 function_state_->NextMaterializedLiteralIndex(); |
1194 function_state_->NextMaterializedLiteralIndex(); | 1203 function_state_->NextMaterializedLiteralIndex(); |
1195 } | 1204 } |
1196 return EmptyExpression(); | 1205 return EmptyExpression(); |
1197 } | 1206 } |
1198 | 1207 |
1199 } // namespace internal | 1208 } // namespace internal |
1200 } // namespace v8 | 1209 } // namespace v8 |
1201 | 1210 |
1202 #endif // V8_PARSING_PREPARSER_H | 1211 #endif // V8_PARSING_PREPARSER_H |
OLD | NEW |