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/parsing/parser-base.h" | 9 #include "src/parsing/parser-base.h" |
10 | 10 |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 kAwaitIdentifier, | 111 kAwaitIdentifier, |
112 kAsyncIdentifier | 112 kAsyncIdentifier |
113 }; | 113 }; |
114 | 114 |
115 explicit PreParserIdentifier(Type type) : type_(type), string_(nullptr) {} | 115 explicit PreParserIdentifier(Type type) : type_(type), string_(nullptr) {} |
116 Type type_; | 116 Type type_; |
117 // Only non-nullptr when PreParser.track_unresolved_variables_ is true. | 117 // Only non-nullptr when PreParser.track_unresolved_variables_ is true. |
118 const AstRawString* string_; | 118 const AstRawString* string_; |
119 friend class PreParserExpression; | 119 friend class PreParserExpression; |
120 friend class PreParser; | 120 friend class PreParser; |
| 121 friend class PreParserFactory; |
121 }; | 122 }; |
122 | 123 |
123 | 124 |
124 class PreParserExpression { | 125 class PreParserExpression { |
125 public: | 126 public: |
126 PreParserExpression() : code_(TypeField::encode(kEmpty)) {} | 127 PreParserExpression() |
| 128 : code_(TypeField::encode(kEmpty)), identifiers_(nullptr) {} |
127 | 129 |
128 static PreParserExpression Empty() { return PreParserExpression(); } | 130 static PreParserExpression Empty() { return PreParserExpression(); } |
129 | 131 |
130 static PreParserExpression Default() { | 132 static PreParserExpression Default( |
131 return PreParserExpression(TypeField::encode(kExpression)); | 133 ZoneList<const AstRawString*>* identifiers = nullptr) { |
| 134 return PreParserExpression(TypeField::encode(kExpression), identifiers); |
132 } | 135 } |
133 | 136 |
134 static PreParserExpression Spread(PreParserExpression expression) { | 137 static PreParserExpression Spread(PreParserExpression expression) { |
135 return PreParserExpression(TypeField::encode(kSpreadExpression)); | 138 return PreParserExpression(TypeField::encode(kSpreadExpression), |
| 139 expression.identifiers_); |
136 } | 140 } |
137 | 141 |
138 static PreParserExpression FromIdentifier(PreParserIdentifier id) { | 142 static PreParserExpression FromIdentifier(PreParserIdentifier id, |
139 return PreParserExpression(TypeField::encode(kIdentifierExpression) | | 143 Zone* zone) { |
140 IdentifierTypeField::encode(id.type_), | 144 PreParserExpression expression(TypeField::encode(kIdentifierExpression) | |
141 id.string_); | 145 IdentifierTypeField::encode(id.type_)); |
| 146 expression.AddIdentifier(id.string_, zone); |
| 147 return expression; |
142 } | 148 } |
143 | 149 |
144 static PreParserExpression BinaryOperation(PreParserExpression left, | 150 static PreParserExpression BinaryOperation(PreParserExpression left, |
145 Token::Value op, | 151 Token::Value op, |
146 PreParserExpression right) { | 152 PreParserExpression right) { |
147 return PreParserExpression(TypeField::encode(kBinaryOperationExpression)); | 153 return PreParserExpression(TypeField::encode(kBinaryOperationExpression)); |
148 } | 154 } |
149 | 155 |
150 static PreParserExpression Assignment() { | 156 static PreParserExpression Assignment() { |
151 return PreParserExpression(TypeField::encode(kExpression) | | 157 return PreParserExpression(TypeField::encode(kExpression) | |
152 ExpressionTypeField::encode(kAssignment)); | 158 ExpressionTypeField::encode(kAssignment)); |
153 } | 159 } |
154 | 160 |
155 static PreParserExpression ObjectLiteral() { | 161 static PreParserExpression ObjectLiteral( |
156 return PreParserExpression(TypeField::encode(kObjectLiteralExpression)); | 162 ZoneList<const AstRawString*>* identifiers = nullptr) { |
| 163 return PreParserExpression(TypeField::encode(kObjectLiteralExpression), |
| 164 identifiers); |
157 } | 165 } |
158 | 166 |
159 static PreParserExpression ArrayLiteral() { | 167 static PreParserExpression ArrayLiteral( |
160 return PreParserExpression(TypeField::encode(kArrayLiteralExpression)); | 168 ZoneList<const AstRawString*>* identifiers = nullptr) { |
| 169 return PreParserExpression(TypeField::encode(kArrayLiteralExpression), |
| 170 identifiers); |
161 } | 171 } |
162 | 172 |
163 static PreParserExpression StringLiteral() { | 173 static PreParserExpression StringLiteral() { |
164 return PreParserExpression(TypeField::encode(kStringLiteralExpression)); | 174 return PreParserExpression(TypeField::encode(kStringLiteralExpression)); |
165 } | 175 } |
166 | 176 |
167 static PreParserExpression UseStrictStringLiteral() { | 177 static PreParserExpression UseStrictStringLiteral() { |
168 return PreParserExpression(TypeField::encode(kStringLiteralExpression) | | 178 return PreParserExpression(TypeField::encode(kStringLiteralExpression) | |
169 IsUseStrictField::encode(true)); | 179 IsUseStrictField::encode(true)); |
170 } | 180 } |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 kThisExpression, | 347 kThisExpression, |
338 kThisPropertyExpression, | 348 kThisPropertyExpression, |
339 kPropertyExpression, | 349 kPropertyExpression, |
340 kCallExpression, | 350 kCallExpression, |
341 kCallEvalExpression, | 351 kCallEvalExpression, |
342 kSuperCallReference, | 352 kSuperCallReference, |
343 kNoTemplateTagExpression, | 353 kNoTemplateTagExpression, |
344 kAssignment | 354 kAssignment |
345 }; | 355 }; |
346 | 356 |
347 explicit PreParserExpression(uint32_t expression_code, | 357 explicit PreParserExpression( |
348 const AstRawString* string = nullptr) | 358 uint32_t expression_code, |
349 : code_(expression_code), string_(string) {} | 359 ZoneList<const AstRawString*>* identifiers = nullptr) |
| 360 : code_(expression_code), identifiers_(identifiers) {} |
| 361 |
| 362 void AddIdentifier(const AstRawString* identifier, Zone* zone) { |
| 363 if (identifier == nullptr) { |
| 364 return; |
| 365 } |
| 366 if (identifiers_ == nullptr) { |
| 367 identifiers_ = new (zone) ZoneList<const AstRawString*>(1, zone); |
| 368 } |
| 369 identifiers_->Add(identifier, zone); |
| 370 } |
350 | 371 |
351 // The first three bits are for the Type. | 372 // The first three bits are for the Type. |
352 typedef BitField<Type, 0, 3> TypeField; | 373 typedef BitField<Type, 0, 3> TypeField; |
353 | 374 |
354 // The high order bit applies only to nodes which would inherit from the | 375 // The high order bit applies only to nodes which would inherit from the |
355 // Expression ASTNode --- This is by necessity, due to the fact that | 376 // Expression ASTNode --- This is by necessity, due to the fact that |
356 // Expression nodes may be represented as multiple Types, not exclusively | 377 // Expression nodes may be represented as multiple Types, not exclusively |
357 // through kExpression. | 378 // through kExpression. |
358 // TODO(caitp, adamk): clean up PreParserExpression bitfields. | 379 // TODO(caitp, adamk): clean up PreParserExpression bitfields. |
359 typedef BitField<bool, 31, 1> ParenthesizedField; | 380 typedef BitField<bool, 31, 1> ParenthesizedField; |
360 | 381 |
361 // The rest of the bits are interpreted depending on the value | 382 // The rest of the bits are interpreted depending on the value |
362 // of the Type field, so they can share the storage. | 383 // of the Type field, so they can share the storage. |
363 typedef BitField<ExpressionType, TypeField::kNext, 3> ExpressionTypeField; | 384 typedef BitField<ExpressionType, TypeField::kNext, 3> ExpressionTypeField; |
364 typedef BitField<bool, TypeField::kNext, 1> IsUseStrictField; | 385 typedef BitField<bool, TypeField::kNext, 1> IsUseStrictField; |
365 typedef BitField<bool, IsUseStrictField::kNext, 1> IsUseAsmField; | 386 typedef BitField<bool, IsUseStrictField::kNext, 1> IsUseAsmField; |
366 typedef BitField<PreParserIdentifier::Type, TypeField::kNext, 10> | 387 typedef BitField<PreParserIdentifier::Type, TypeField::kNext, 10> |
367 IdentifierTypeField; | 388 IdentifierTypeField; |
368 typedef BitField<bool, TypeField::kNext, 1> HasCoverInitializedNameField; | 389 typedef BitField<bool, TypeField::kNext, 1> HasCoverInitializedNameField; |
369 | 390 |
370 uint32_t code_; | 391 uint32_t code_; |
371 // Non-nullptr if the expression is one identifier. | 392 // If the PreParser is used in the identifier tracking mode, |
372 const AstRawString* string_; | 393 // PreParserExpression accumulates identifiers in that expression. |
| 394 ZoneList<const AstRawString*>* identifiers_; |
373 | 395 |
374 friend class PreParser; | 396 friend class PreParser; |
| 397 friend class PreParserFactory; |
| 398 template <typename T> |
| 399 friend class PreParserList; |
375 }; | 400 }; |
376 | 401 |
377 | 402 |
378 // The pre-parser doesn't need to build lists of expressions, identifiers, or | 403 // The pre-parser doesn't need to build lists of expressions, identifiers, or |
379 // the like. | 404 // the like. If the PreParser is used in identifier tracking mode, it needs to |
| 405 // build lists of identifiers though. |
380 template <typename T> | 406 template <typename T> |
381 class PreParserList { | 407 class PreParserList { |
382 public: | 408 public: |
383 // These functions make list->Add(some_expression) work (and do nothing). | 409 // These functions make list->Add(some_expression) work (and do nothing). |
384 PreParserList() : length_(0) {} | 410 PreParserList() : length_(0), identifiers_(nullptr) {} |
385 PreParserList* operator->() { return this; } | 411 PreParserList* operator->() { return this; } |
386 void Add(T, void*) { ++length_; } | 412 void Add(T, Zone* zone); |
387 int length() const { return length_; } | 413 int length() const { return length_; } |
388 static PreParserList Null() { return PreParserList(-1); } | 414 static PreParserList Null() { return PreParserList(-1); } |
389 bool IsNull() const { return length_ == -1; } | 415 bool IsNull() const { return length_ == -1; } |
390 | 416 |
391 private: | 417 private: |
392 explicit PreParserList(int n) : length_(n) {} | 418 explicit PreParserList(int n) : length_(n), identifiers_(nullptr) {} |
393 int length_; | 419 int length_; |
| 420 ZoneList<const AstRawString*>* identifiers_; |
| 421 |
| 422 friend class PreParser; |
| 423 friend class PreParserFactory; |
394 }; | 424 }; |
395 | 425 |
| 426 template <> |
| 427 inline void PreParserList<PreParserExpression>::Add( |
| 428 PreParserExpression expression, Zone* zone) { |
| 429 if (expression.identifiers_ != nullptr) { |
| 430 DCHECK(FLAG_lazy_inner_functions); |
| 431 DCHECK(zone != nullptr); |
| 432 if (identifiers_ == nullptr) { |
| 433 identifiers_ = new (zone) ZoneList<const AstRawString*>(1, zone); |
| 434 } |
| 435 for (auto identifier : (*expression.identifiers_)) { |
| 436 identifiers_->Add(identifier, zone); |
| 437 } |
| 438 } |
| 439 ++length_; |
| 440 } |
| 441 |
| 442 template <typename T> |
| 443 void PreParserList<T>::Add(T, Zone* zone) { |
| 444 ++length_; |
| 445 } |
| 446 |
396 typedef PreParserList<PreParserExpression> PreParserExpressionList; | 447 typedef PreParserList<PreParserExpression> PreParserExpressionList; |
397 | 448 |
398 class PreParserStatement; | 449 class PreParserStatement; |
399 typedef PreParserList<PreParserStatement> PreParserStatementList; | 450 typedef PreParserList<PreParserStatement> PreParserStatementList; |
400 | 451 |
401 class PreParserStatement { | 452 class PreParserStatement { |
402 public: | 453 public: |
403 static PreParserStatement Default() { | 454 static PreParserStatement Default() { |
404 return PreParserStatement(kUnknownStatement); | 455 return PreParserStatement(kUnknownStatement); |
405 } | 456 } |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 kUseAsmExpressionStatement, | 524 kUseAsmExpressionStatement, |
474 }; | 525 }; |
475 | 526 |
476 explicit PreParserStatement(Type code) : code_(code) {} | 527 explicit PreParserStatement(Type code) : code_(code) {} |
477 Type code_; | 528 Type code_; |
478 }; | 529 }; |
479 | 530 |
480 | 531 |
481 class PreParserFactory { | 532 class PreParserFactory { |
482 public: | 533 public: |
483 explicit PreParserFactory(void* unused_value_factory) {} | 534 explicit PreParserFactory(AstValueFactory* ast_value_factory) |
| 535 : zone_(ast_value_factory->zone()) {} |
| 536 |
| 537 void set_zone(Zone* zone) { zone_ = zone; } |
| 538 |
484 PreParserExpression NewStringLiteral(PreParserIdentifier identifier, | 539 PreParserExpression NewStringLiteral(PreParserIdentifier identifier, |
485 int pos) { | 540 int pos) { |
486 return PreParserExpression::Default(); | 541 // This is needed for object literal property names. Property names are |
| 542 // normalized to string literals during object literal parsing. |
| 543 PreParserExpression expression = PreParserExpression::Default(); |
| 544 expression.AddIdentifier(identifier.string_, zone_); |
| 545 return expression; |
487 } | 546 } |
488 PreParserExpression NewNumberLiteral(double number, | 547 PreParserExpression NewNumberLiteral(double number, |
489 int pos) { | 548 int pos) { |
490 return PreParserExpression::Default(); | 549 return PreParserExpression::Default(); |
491 } | 550 } |
492 PreParserExpression NewUndefinedLiteral(int pos) { | 551 PreParserExpression NewUndefinedLiteral(int pos) { |
493 return PreParserExpression::Default(); | 552 return PreParserExpression::Default(); |
494 } | 553 } |
495 PreParserExpression NewRegExpLiteral(PreParserIdentifier js_pattern, | 554 PreParserExpression NewRegExpLiteral(PreParserIdentifier js_pattern, |
496 int js_flags, int literal_index, | 555 int js_flags, int literal_index, |
497 int pos) { | 556 int pos) { |
498 return PreParserExpression::Default(); | 557 return PreParserExpression::Default(); |
499 } | 558 } |
500 PreParserExpression NewArrayLiteral(PreParserExpressionList values, | 559 PreParserExpression NewArrayLiteral(PreParserExpressionList values, |
501 int first_spread_index, int literal_index, | 560 int first_spread_index, int literal_index, |
502 int pos) { | 561 int pos) { |
503 return PreParserExpression::ArrayLiteral(); | 562 return PreParserExpression::ArrayLiteral(values.identifiers_); |
504 } | 563 } |
505 PreParserExpression NewClassLiteralProperty(PreParserExpression key, | 564 PreParserExpression NewClassLiteralProperty(PreParserExpression key, |
506 PreParserExpression value, | 565 PreParserExpression value, |
507 ClassLiteralProperty::Kind kind, | 566 ClassLiteralProperty::Kind kind, |
508 bool is_static, | 567 bool is_static, |
509 bool is_computed_name) { | 568 bool is_computed_name) { |
510 return PreParserExpression::Default(); | 569 return PreParserExpression::Default(); |
511 } | 570 } |
512 PreParserExpression NewObjectLiteralProperty(PreParserExpression key, | 571 PreParserExpression NewObjectLiteralProperty(PreParserExpression key, |
513 PreParserExpression value, | 572 PreParserExpression value, |
514 ObjectLiteralProperty::Kind kind, | 573 ObjectLiteralProperty::Kind kind, |
515 bool is_computed_name) { | 574 bool is_computed_name) { |
516 return PreParserExpression::Default(); | 575 return PreParserExpression::Default(value.identifiers_); |
517 } | 576 } |
518 PreParserExpression NewObjectLiteralProperty(PreParserExpression key, | 577 PreParserExpression NewObjectLiteralProperty(PreParserExpression key, |
519 PreParserExpression value, | 578 PreParserExpression value, |
520 bool is_computed_name) { | 579 bool is_computed_name) { |
521 return PreParserExpression::Default(); | 580 return PreParserExpression::Default(value.identifiers_); |
522 } | 581 } |
523 PreParserExpression NewObjectLiteral(PreParserExpressionList properties, | 582 PreParserExpression NewObjectLiteral(PreParserExpressionList properties, |
524 int literal_index, | 583 int literal_index, |
525 int boilerplate_properties, | 584 int boilerplate_properties, |
526 int pos) { | 585 int pos) { |
527 return PreParserExpression::ObjectLiteral(); | 586 return PreParserExpression::ObjectLiteral(properties.identifiers_); |
528 } | 587 } |
529 PreParserExpression NewVariableProxy(void* variable) { | 588 PreParserExpression NewVariableProxy(void* variable) { |
530 return PreParserExpression::Default(); | 589 return PreParserExpression::Default(); |
531 } | 590 } |
532 PreParserExpression NewProperty(PreParserExpression obj, | 591 PreParserExpression NewProperty(PreParserExpression obj, |
533 PreParserExpression key, | 592 PreParserExpression key, |
534 int pos) { | 593 int pos) { |
535 if (obj.IsThis()) { | 594 if (obj.IsThis()) { |
536 return PreParserExpression::ThisProperty(); | 595 return PreParserExpression::ThisProperty(); |
537 } | 596 } |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
686 return PreParserStatement::Default(); | 745 return PreParserStatement::Default(); |
687 } | 746 } |
688 | 747 |
689 // Return the object itself as AstVisitor and implement the needed | 748 // Return the object itself as AstVisitor and implement the needed |
690 // dummy method right in this class. | 749 // dummy method right in this class. |
691 PreParserFactory* visitor() { return this; } | 750 PreParserFactory* visitor() { return this; } |
692 int* ast_properties() { | 751 int* ast_properties() { |
693 static int dummy = 42; | 752 static int dummy = 42; |
694 return &dummy; | 753 return &dummy; |
695 } | 754 } |
| 755 |
| 756 private: |
| 757 Zone* zone_; |
696 }; | 758 }; |
697 | 759 |
698 | 760 |
699 struct PreParserFormalParameters : FormalParametersBase { | 761 struct PreParserFormalParameters : FormalParametersBase { |
700 explicit PreParserFormalParameters(DeclarationScope* scope) | 762 explicit PreParserFormalParameters(DeclarationScope* scope) |
701 : FormalParametersBase(scope) {} | 763 : FormalParametersBase(scope) {} |
702 int arity = 0; | 764 int arity = 0; |
703 | 765 |
704 int Arity() const { return arity; } | 766 int Arity() const { return arity; } |
705 PreParserIdentifier at(int i) { return PreParserIdentifier(); } // Dummy | 767 PreParserIdentifier at(int i) { return PreParserIdentifier(); } // Dummy |
(...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1401 } | 1463 } |
1402 | 1464 |
1403 V8_INLINE void MaterializeUnspreadArgumentsLiterals(int count) { | 1465 V8_INLINE void MaterializeUnspreadArgumentsLiterals(int count) { |
1404 for (int i = 0; i < count; ++i) { | 1466 for (int i = 0; i < count; ++i) { |
1405 function_state_->NextMaterializedLiteralIndex(); | 1467 function_state_->NextMaterializedLiteralIndex(); |
1406 } | 1468 } |
1407 } | 1469 } |
1408 | 1470 |
1409 V8_INLINE PreParserExpression | 1471 V8_INLINE PreParserExpression |
1410 ExpressionListToExpression(PreParserExpressionList args) { | 1472 ExpressionListToExpression(PreParserExpressionList args) { |
1411 return PreParserExpression::Default(); | 1473 return PreParserExpression::Default(args.identifiers_); |
1412 } | 1474 } |
1413 | 1475 |
1414 V8_INLINE void AddAccessorPrefixToFunctionName(bool is_get, | 1476 V8_INLINE void AddAccessorPrefixToFunctionName(bool is_get, |
1415 PreParserExpression function, | 1477 PreParserExpression function, |
1416 PreParserIdentifier name) {} | 1478 PreParserIdentifier name) {} |
1417 V8_INLINE void SetFunctionNameFromPropertyName(PreParserExpression property, | 1479 V8_INLINE void SetFunctionNameFromPropertyName(PreParserExpression property, |
1418 PreParserIdentifier name) {} | 1480 PreParserIdentifier name) {} |
1419 V8_INLINE void SetFunctionNameFromIdentifierRef( | 1481 V8_INLINE void SetFunctionNameFromIdentifierRef( |
1420 PreParserExpression value, PreParserExpression identifier) {} | 1482 PreParserExpression value, PreParserExpression identifier) {} |
1421 | 1483 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1479 function_state_->NextMaterializedLiteralIndex(); | 1541 function_state_->NextMaterializedLiteralIndex(); |
1480 function_state_->NextMaterializedLiteralIndex(); | 1542 function_state_->NextMaterializedLiteralIndex(); |
1481 } | 1543 } |
1482 return EmptyExpression(); | 1544 return EmptyExpression(); |
1483 } | 1545 } |
1484 | 1546 |
1485 } // namespace internal | 1547 } // namespace internal |
1486 } // namespace v8 | 1548 } // namespace v8 |
1487 | 1549 |
1488 #endif // V8_PARSING_PREPARSER_H | 1550 #endif // V8_PARSING_PREPARSER_H |
OLD | NEW |