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_AST_AST_H_ | 5 #ifndef V8_AST_AST_H_ |
6 #define V8_AST_AST_H_ | 6 #define V8_AST_AST_H_ |
7 | 7 |
8 #include "src/ast/ast-value-factory.h" | 8 #include "src/ast/ast-value-factory.h" |
9 #include "src/ast/modules.h" | 9 #include "src/ast/modules.h" |
10 #include "src/ast/variables.h" | 10 #include "src/ast/variables.h" |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 #define DEF_FORWARD_DECLARATION(type) class type; | 124 #define DEF_FORWARD_DECLARATION(type) class type; |
125 AST_NODE_LIST(DEF_FORWARD_DECLARATION) | 125 AST_NODE_LIST(DEF_FORWARD_DECLARATION) |
126 #undef DEF_FORWARD_DECLARATION | 126 #undef DEF_FORWARD_DECLARATION |
127 | 127 |
128 | 128 |
129 // Typedef only introduced to avoid unreadable code. | 129 // Typedef only introduced to avoid unreadable code. |
130 typedef ZoneList<Handle<String>> ZoneStringList; | 130 typedef ZoneList<Handle<String>> ZoneStringList; |
131 typedef ZoneList<Handle<Object>> ZoneObjectList; | 131 typedef ZoneList<Handle<Object>> ZoneObjectList; |
132 | 132 |
133 | 133 |
134 #define DECLARE_NODE_TYPE(type) \ | |
135 friend class AstNodeFactory; | |
136 | |
137 | |
138 class FeedbackVectorSlotCache { | 134 class FeedbackVectorSlotCache { |
139 public: | 135 public: |
140 explicit FeedbackVectorSlotCache(Zone* zone) | 136 explicit FeedbackVectorSlotCache(Zone* zone) |
141 : zone_(zone), | 137 : zone_(zone), |
142 hash_map_(base::HashMap::PointersMatch, | 138 hash_map_(base::HashMap::PointersMatch, |
143 ZoneHashMap::kDefaultHashMapCapacity, | 139 ZoneHashMap::kDefaultHashMapCapacity, |
144 ZoneAllocationPolicy(zone)) {} | 140 ZoneAllocationPolicy(zone)) {} |
145 | 141 |
146 void Put(Variable* variable, FeedbackVectorSlot slot) { | 142 void Put(Variable* variable, FeedbackVectorSlot slot) { |
147 ZoneHashMap::Entry* entry = hash_map_.LookupOrInsert( | 143 ZoneHashMap::Entry* entry = hash_map_.LookupOrInsert( |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 void set_base_id(int id) { base_id_ = id; } | 350 void set_base_id(int id) { base_id_ = id; } |
355 static int num_ids() { return parent_num_ids() + 2; } | 351 static int num_ids() { return parent_num_ids() + 2; } |
356 BailoutId id() const { return BailoutId(local_id(0)); } | 352 BailoutId id() const { return BailoutId(local_id(0)); } |
357 TypeFeedbackId test_id() const { return TypeFeedbackId(local_id(1)); } | 353 TypeFeedbackId test_id() const { return TypeFeedbackId(local_id(1)); } |
358 | 354 |
359 protected: | 355 protected: |
360 Expression(Zone* zone, int pos, NodeType type) | 356 Expression(Zone* zone, int pos, NodeType type) |
361 : AstNode(pos, type), | 357 : AstNode(pos, type), |
362 bit_field_(0), | 358 bit_field_(0), |
363 base_id_(BailoutId::None().ToInt()) {} | 359 base_id_(BailoutId::None().ToInt()) {} |
| 360 |
364 static int parent_num_ids() { return 0; } | 361 static int parent_num_ids() { return 0; } |
365 void set_to_boolean_types(uint16_t types) { | 362 void set_to_boolean_types(uint16_t types) { |
366 bit_field_ = ToBooleanTypesField::update(bit_field_, types); | 363 bit_field_ = ToBooleanTypesField::update(bit_field_, types); |
367 } | 364 } |
368 | |
369 int base_id() const { | 365 int base_id() const { |
370 DCHECK(!BailoutId(base_id_).IsNone()); | 366 DCHECK(!BailoutId(base_id_).IsNone()); |
371 return base_id_; | 367 return base_id_; |
372 } | 368 } |
373 | 369 |
374 private: | 370 private: |
375 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 371 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
376 | 372 |
377 uint16_t bit_field_; | 373 uint16_t bit_field_; |
378 int base_id_; | 374 int base_id_; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
425 | 421 |
426 BreakableType breakable_type_; | 422 BreakableType breakable_type_; |
427 int base_id_; | 423 int base_id_; |
428 Label break_target_; | 424 Label break_target_; |
429 ZoneList<const AstRawString*>* labels_; | 425 ZoneList<const AstRawString*>* labels_; |
430 }; | 426 }; |
431 | 427 |
432 | 428 |
433 class Block final : public BreakableStatement { | 429 class Block final : public BreakableStatement { |
434 public: | 430 public: |
435 DECLARE_NODE_TYPE(Block) | |
436 | |
437 ZoneList<Statement*>* statements() { return &statements_; } | 431 ZoneList<Statement*>* statements() { return &statements_; } |
438 bool ignore_completion_value() const { return ignore_completion_value_; } | 432 bool ignore_completion_value() const { return ignore_completion_value_; } |
439 | 433 |
440 static int num_ids() { return parent_num_ids() + 1; } | 434 static int num_ids() { return parent_num_ids() + 1; } |
441 BailoutId DeclsId() const { return BailoutId(local_id(0)); } | 435 BailoutId DeclsId() const { return BailoutId(local_id(0)); } |
442 | 436 |
443 bool IsJump() const { | 437 bool IsJump() const { |
444 return !statements_.is_empty() && statements_.last()->IsJump() | 438 return !statements_.is_empty() && statements_.last()->IsJump() |
445 && labels() == NULL; // Good enough as an approximation... | 439 && labels() == NULL; // Good enough as an approximation... |
446 } | 440 } |
447 | 441 |
448 Scope* scope() const { return scope_; } | 442 Scope* scope() const { return scope_; } |
449 void set_scope(Scope* scope) { scope_ = scope; } | 443 void set_scope(Scope* scope) { scope_ = scope; } |
450 | 444 |
451 protected: | 445 private: |
| 446 friend class AstNodeFactory; |
| 447 |
452 Block(Zone* zone, ZoneList<const AstRawString*>* labels, int capacity, | 448 Block(Zone* zone, ZoneList<const AstRawString*>* labels, int capacity, |
453 bool ignore_completion_value, int pos) | 449 bool ignore_completion_value, int pos) |
454 : BreakableStatement(zone, labels, TARGET_FOR_NAMED_ONLY, pos, kBlock), | 450 : BreakableStatement(zone, labels, TARGET_FOR_NAMED_ONLY, pos, kBlock), |
455 statements_(capacity, zone), | 451 statements_(capacity, zone), |
456 ignore_completion_value_(ignore_completion_value), | 452 ignore_completion_value_(ignore_completion_value), |
457 scope_(NULL) {} | 453 scope_(NULL) {} |
458 static int parent_num_ids() { return BreakableStatement::num_ids(); } | 454 static int parent_num_ids() { return BreakableStatement::num_ids(); } |
459 | |
460 private: | |
461 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 455 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
462 | 456 |
463 ZoneList<Statement*> statements_; | 457 ZoneList<Statement*> statements_; |
464 bool ignore_completion_value_; | 458 bool ignore_completion_value_; |
465 Scope* scope_; | 459 Scope* scope_; |
466 }; | 460 }; |
467 | 461 |
468 | 462 |
469 class DoExpression final : public Expression { | 463 class DoExpression final : public Expression { |
470 public: | 464 public: |
471 DECLARE_NODE_TYPE(DoExpression) | |
472 | |
473 Block* block() { return block_; } | 465 Block* block() { return block_; } |
474 void set_block(Block* b) { block_ = b; } | 466 void set_block(Block* b) { block_ = b; } |
475 VariableProxy* result() { return result_; } | 467 VariableProxy* result() { return result_; } |
476 void set_result(VariableProxy* v) { result_ = v; } | 468 void set_result(VariableProxy* v) { result_ = v; } |
477 FunctionLiteral* represented_function() { return represented_function_; } | 469 FunctionLiteral* represented_function() { return represented_function_; } |
478 void set_represented_function(FunctionLiteral* f) { | 470 void set_represented_function(FunctionLiteral* f) { |
479 represented_function_ = f; | 471 represented_function_ = f; |
480 } | 472 } |
481 bool IsAnonymousFunctionDefinition() const; | 473 bool IsAnonymousFunctionDefinition() const; |
482 | 474 |
483 protected: | 475 private: |
| 476 friend class AstNodeFactory; |
| 477 |
484 DoExpression(Zone* zone, Block* block, VariableProxy* result, int pos) | 478 DoExpression(Zone* zone, Block* block, VariableProxy* result, int pos) |
485 : Expression(zone, pos, kDoExpression), | 479 : Expression(zone, pos, kDoExpression), |
486 block_(block), | 480 block_(block), |
487 result_(result), | 481 result_(result), |
488 represented_function_(nullptr) { | 482 represented_function_(nullptr) { |
489 DCHECK_NOT_NULL(block_); | 483 DCHECK_NOT_NULL(block_); |
490 DCHECK_NOT_NULL(result_); | 484 DCHECK_NOT_NULL(result_); |
491 } | 485 } |
492 static int parent_num_ids() { return Expression::num_ids(); } | 486 static int parent_num_ids() { return Expression::num_ids(); } |
493 | |
494 private: | |
495 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 487 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
496 | 488 |
497 Block* block_; | 489 Block* block_; |
498 VariableProxy* result_; | 490 VariableProxy* result_; |
499 FunctionLiteral* represented_function_; | 491 FunctionLiteral* represented_function_; |
500 }; | 492 }; |
501 | 493 |
502 | 494 |
503 class Declaration : public AstNode { | 495 class Declaration : public AstNode { |
504 public: | 496 public: |
(...skipping 13 matching lines...) Expand all Loading... |
518 VariableMode mode_; | 510 VariableMode mode_; |
519 VariableProxy* proxy_; | 511 VariableProxy* proxy_; |
520 | 512 |
521 // Nested scope from which the declaration originated. | 513 // Nested scope from which the declaration originated. |
522 Scope* scope_; | 514 Scope* scope_; |
523 }; | 515 }; |
524 | 516 |
525 | 517 |
526 class VariableDeclaration final : public Declaration { | 518 class VariableDeclaration final : public Declaration { |
527 public: | 519 public: |
528 DECLARE_NODE_TYPE(VariableDeclaration) | |
529 | |
530 InitializationFlag initialization() const { | 520 InitializationFlag initialization() const { |
531 return mode() == VAR ? kCreatedInitialized : kNeedsInitialization; | 521 return mode() == VAR ? kCreatedInitialized : kNeedsInitialization; |
532 } | 522 } |
533 | 523 |
534 protected: | 524 private: |
| 525 friend class AstNodeFactory; |
| 526 |
535 VariableDeclaration(VariableProxy* proxy, VariableMode mode, Scope* scope, | 527 VariableDeclaration(VariableProxy* proxy, VariableMode mode, Scope* scope, |
536 int pos) | 528 int pos) |
537 : Declaration(proxy, mode, scope, pos, kVariableDeclaration) {} | 529 : Declaration(proxy, mode, scope, pos, kVariableDeclaration) {} |
538 }; | 530 }; |
539 | 531 |
540 | 532 |
541 class FunctionDeclaration final : public Declaration { | 533 class FunctionDeclaration final : public Declaration { |
542 public: | 534 public: |
543 DECLARE_NODE_TYPE(FunctionDeclaration) | |
544 | |
545 FunctionLiteral* fun() const { return fun_; } | 535 FunctionLiteral* fun() const { return fun_; } |
546 void set_fun(FunctionLiteral* f) { fun_ = f; } | 536 void set_fun(FunctionLiteral* f) { fun_ = f; } |
547 InitializationFlag initialization() const { return kCreatedInitialized; } | 537 InitializationFlag initialization() const { return kCreatedInitialized; } |
548 | 538 |
549 protected: | 539 private: |
| 540 friend class AstNodeFactory; |
| 541 |
550 FunctionDeclaration(VariableProxy* proxy, VariableMode mode, | 542 FunctionDeclaration(VariableProxy* proxy, VariableMode mode, |
551 FunctionLiteral* fun, Scope* scope, int pos) | 543 FunctionLiteral* fun, Scope* scope, int pos) |
552 : Declaration(proxy, mode, scope, pos, kFunctionDeclaration), fun_(fun) { | 544 : Declaration(proxy, mode, scope, pos, kFunctionDeclaration), fun_(fun) { |
553 DCHECK(mode == VAR || mode == LET || mode == CONST); | 545 DCHECK(mode == VAR || mode == LET || mode == CONST); |
554 DCHECK(fun != NULL); | 546 DCHECK(fun != NULL); |
555 } | 547 } |
556 | 548 |
557 private: | |
558 FunctionLiteral* fun_; | 549 FunctionLiteral* fun_; |
559 }; | 550 }; |
560 | 551 |
561 | 552 |
562 class IterationStatement : public BreakableStatement { | 553 class IterationStatement : public BreakableStatement { |
563 public: | 554 public: |
564 Statement* body() const { return body_; } | 555 Statement* body() const { return body_; } |
565 void set_body(Statement* s) { body_ = s; } | 556 void set_body(Statement* s) { body_ = s; } |
566 | 557 |
567 int yield_count() const { return yield_count_; } | 558 int yield_count() const { return yield_count_; } |
(...skipping 24 matching lines...) Expand all Loading... |
592 | 583 |
593 Statement* body_; | 584 Statement* body_; |
594 Label continue_target_; | 585 Label continue_target_; |
595 int yield_count_; | 586 int yield_count_; |
596 int first_yield_id_; | 587 int first_yield_id_; |
597 }; | 588 }; |
598 | 589 |
599 | 590 |
600 class DoWhileStatement final : public IterationStatement { | 591 class DoWhileStatement final : public IterationStatement { |
601 public: | 592 public: |
602 DECLARE_NODE_TYPE(DoWhileStatement) | |
603 | |
604 void Initialize(Expression* cond, Statement* body) { | 593 void Initialize(Expression* cond, Statement* body) { |
605 IterationStatement::Initialize(body); | 594 IterationStatement::Initialize(body); |
606 cond_ = cond; | 595 cond_ = cond; |
607 } | 596 } |
608 | 597 |
609 Expression* cond() const { return cond_; } | 598 Expression* cond() const { return cond_; } |
610 void set_cond(Expression* e) { cond_ = e; } | 599 void set_cond(Expression* e) { cond_ = e; } |
611 | 600 |
612 static int num_ids() { return parent_num_ids() + 2; } | 601 static int num_ids() { return parent_num_ids() + 2; } |
613 BailoutId ContinueId() const { return BailoutId(local_id(0)); } | 602 BailoutId ContinueId() const { return BailoutId(local_id(0)); } |
614 BailoutId StackCheckId() const { return BackEdgeId(); } | 603 BailoutId StackCheckId() const { return BackEdgeId(); } |
615 BailoutId BackEdgeId() const { return BailoutId(local_id(1)); } | 604 BailoutId BackEdgeId() const { return BailoutId(local_id(1)); } |
616 | 605 |
617 protected: | 606 private: |
| 607 friend class AstNodeFactory; |
| 608 |
618 DoWhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 609 DoWhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
619 : IterationStatement(zone, labels, pos, kDoWhileStatement), cond_(NULL) {} | 610 : IterationStatement(zone, labels, pos, kDoWhileStatement), cond_(NULL) {} |
620 static int parent_num_ids() { return IterationStatement::num_ids(); } | 611 static int parent_num_ids() { return IterationStatement::num_ids(); } |
621 | |
622 private: | |
623 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 612 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
624 | 613 |
625 Expression* cond_; | 614 Expression* cond_; |
626 }; | 615 }; |
627 | 616 |
628 | 617 |
629 class WhileStatement final : public IterationStatement { | 618 class WhileStatement final : public IterationStatement { |
630 public: | 619 public: |
631 DECLARE_NODE_TYPE(WhileStatement) | |
632 | |
633 void Initialize(Expression* cond, Statement* body) { | 620 void Initialize(Expression* cond, Statement* body) { |
634 IterationStatement::Initialize(body); | 621 IterationStatement::Initialize(body); |
635 cond_ = cond; | 622 cond_ = cond; |
636 } | 623 } |
637 | 624 |
638 Expression* cond() const { return cond_; } | 625 Expression* cond() const { return cond_; } |
639 void set_cond(Expression* e) { cond_ = e; } | 626 void set_cond(Expression* e) { cond_ = e; } |
640 | 627 |
641 static int num_ids() { return parent_num_ids() + 1; } | 628 static int num_ids() { return parent_num_ids() + 1; } |
642 BailoutId ContinueId() const { return EntryId(); } | 629 BailoutId ContinueId() const { return EntryId(); } |
643 BailoutId StackCheckId() const { return BodyId(); } | 630 BailoutId StackCheckId() const { return BodyId(); } |
644 BailoutId BodyId() const { return BailoutId(local_id(0)); } | 631 BailoutId BodyId() const { return BailoutId(local_id(0)); } |
645 | 632 |
646 protected: | 633 private: |
| 634 friend class AstNodeFactory; |
| 635 |
647 WhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 636 WhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
648 : IterationStatement(zone, labels, pos, kWhileStatement), cond_(NULL) {} | 637 : IterationStatement(zone, labels, pos, kWhileStatement), cond_(NULL) {} |
649 static int parent_num_ids() { return IterationStatement::num_ids(); } | 638 static int parent_num_ids() { return IterationStatement::num_ids(); } |
650 | |
651 private: | |
652 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 639 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
653 | 640 |
654 Expression* cond_; | 641 Expression* cond_; |
655 }; | 642 }; |
656 | 643 |
657 | 644 |
658 class ForStatement final : public IterationStatement { | 645 class ForStatement final : public IterationStatement { |
659 public: | 646 public: |
660 DECLARE_NODE_TYPE(ForStatement) | |
661 | |
662 void Initialize(Statement* init, | 647 void Initialize(Statement* init, |
663 Expression* cond, | 648 Expression* cond, |
664 Statement* next, | 649 Statement* next, |
665 Statement* body) { | 650 Statement* body) { |
666 IterationStatement::Initialize(body); | 651 IterationStatement::Initialize(body); |
667 init_ = init; | 652 init_ = init; |
668 cond_ = cond; | 653 cond_ = cond; |
669 next_ = next; | 654 next_ = next; |
670 } | 655 } |
671 | 656 |
672 Statement* init() const { return init_; } | 657 Statement* init() const { return init_; } |
673 Expression* cond() const { return cond_; } | 658 Expression* cond() const { return cond_; } |
674 Statement* next() const { return next_; } | 659 Statement* next() const { return next_; } |
675 | 660 |
676 void set_init(Statement* s) { init_ = s; } | 661 void set_init(Statement* s) { init_ = s; } |
677 void set_cond(Expression* e) { cond_ = e; } | 662 void set_cond(Expression* e) { cond_ = e; } |
678 void set_next(Statement* s) { next_ = s; } | 663 void set_next(Statement* s) { next_ = s; } |
679 | 664 |
680 static int num_ids() { return parent_num_ids() + 2; } | 665 static int num_ids() { return parent_num_ids() + 2; } |
681 BailoutId ContinueId() const { return BailoutId(local_id(0)); } | 666 BailoutId ContinueId() const { return BailoutId(local_id(0)); } |
682 BailoutId StackCheckId() const { return BodyId(); } | 667 BailoutId StackCheckId() const { return BodyId(); } |
683 BailoutId BodyId() const { return BailoutId(local_id(1)); } | 668 BailoutId BodyId() const { return BailoutId(local_id(1)); } |
684 | 669 |
685 protected: | 670 private: |
| 671 friend class AstNodeFactory; |
| 672 |
686 ForStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 673 ForStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
687 : IterationStatement(zone, labels, pos, kForStatement), | 674 : IterationStatement(zone, labels, pos, kForStatement), |
688 init_(NULL), | 675 init_(NULL), |
689 cond_(NULL), | 676 cond_(NULL), |
690 next_(NULL) {} | 677 next_(NULL) {} |
691 static int parent_num_ids() { return IterationStatement::num_ids(); } | 678 static int parent_num_ids() { return IterationStatement::num_ids(); } |
692 | |
693 private: | |
694 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 679 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
695 | 680 |
696 Statement* init_; | 681 Statement* init_; |
697 Expression* cond_; | 682 Expression* cond_; |
698 Statement* next_; | 683 Statement* next_; |
699 }; | 684 }; |
700 | 685 |
701 | 686 |
702 class ForEachStatement : public IterationStatement { | 687 class ForEachStatement : public IterationStatement { |
703 public: | 688 public: |
(...skipping 10 matching lines...) Expand all Loading... |
714 | 699 |
715 protected: | 700 protected: |
716 ForEachStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, | 701 ForEachStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, |
717 NodeType type) | 702 NodeType type) |
718 : IterationStatement(zone, labels, pos, type) {} | 703 : IterationStatement(zone, labels, pos, type) {} |
719 }; | 704 }; |
720 | 705 |
721 | 706 |
722 class ForInStatement final : public ForEachStatement { | 707 class ForInStatement final : public ForEachStatement { |
723 public: | 708 public: |
724 DECLARE_NODE_TYPE(ForInStatement) | |
725 | |
726 void Initialize(Expression* each, Expression* subject, Statement* body) { | 709 void Initialize(Expression* each, Expression* subject, Statement* body) { |
727 ForEachStatement::Initialize(body); | 710 ForEachStatement::Initialize(body); |
728 each_ = each; | 711 each_ = each; |
729 subject_ = subject; | 712 subject_ = subject; |
730 } | 713 } |
731 | 714 |
732 Expression* enumerable() const { | 715 Expression* enumerable() const { |
733 return subject(); | 716 return subject(); |
734 } | 717 } |
735 | 718 |
(...skipping 19 matching lines...) Expand all Loading... |
755 static int num_ids() { return parent_num_ids() + 6; } | 738 static int num_ids() { return parent_num_ids() + 6; } |
756 BailoutId BodyId() const { return BailoutId(local_id(0)); } | 739 BailoutId BodyId() const { return BailoutId(local_id(0)); } |
757 BailoutId EnumId() const { return BailoutId(local_id(1)); } | 740 BailoutId EnumId() const { return BailoutId(local_id(1)); } |
758 BailoutId ToObjectId() const { return BailoutId(local_id(2)); } | 741 BailoutId ToObjectId() const { return BailoutId(local_id(2)); } |
759 BailoutId PrepareId() const { return BailoutId(local_id(3)); } | 742 BailoutId PrepareId() const { return BailoutId(local_id(3)); } |
760 BailoutId FilterId() const { return BailoutId(local_id(4)); } | 743 BailoutId FilterId() const { return BailoutId(local_id(4)); } |
761 BailoutId AssignmentId() const { return BailoutId(local_id(5)); } | 744 BailoutId AssignmentId() const { return BailoutId(local_id(5)); } |
762 BailoutId ContinueId() const { return EntryId(); } | 745 BailoutId ContinueId() const { return EntryId(); } |
763 BailoutId StackCheckId() const { return BodyId(); } | 746 BailoutId StackCheckId() const { return BodyId(); } |
764 | 747 |
765 protected: | 748 private: |
| 749 friend class AstNodeFactory; |
| 750 |
766 ForInStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 751 ForInStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
767 : ForEachStatement(zone, labels, pos, kForInStatement), | 752 : ForEachStatement(zone, labels, pos, kForInStatement), |
768 each_(nullptr), | 753 each_(nullptr), |
769 subject_(nullptr), | 754 subject_(nullptr), |
770 for_in_type_(SLOW_FOR_IN) {} | 755 for_in_type_(SLOW_FOR_IN) {} |
771 static int parent_num_ids() { return ForEachStatement::num_ids(); } | 756 static int parent_num_ids() { return ForEachStatement::num_ids(); } |
772 | |
773 private: | |
774 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 757 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
775 | 758 |
776 Expression* each_; | 759 Expression* each_; |
777 Expression* subject_; | 760 Expression* subject_; |
778 ForInType for_in_type_; | 761 ForInType for_in_type_; |
779 FeedbackVectorSlot each_slot_; | 762 FeedbackVectorSlot each_slot_; |
780 FeedbackVectorSlot for_in_feedback_slot_; | 763 FeedbackVectorSlot for_in_feedback_slot_; |
781 }; | 764 }; |
782 | 765 |
783 | 766 |
784 class ForOfStatement final : public ForEachStatement { | 767 class ForOfStatement final : public ForEachStatement { |
785 public: | 768 public: |
786 DECLARE_NODE_TYPE(ForOfStatement) | |
787 | |
788 void Initialize(Statement* body, Variable* iterator, | 769 void Initialize(Statement* body, Variable* iterator, |
789 Expression* assign_iterator, Expression* next_result, | 770 Expression* assign_iterator, Expression* next_result, |
790 Expression* result_done, Expression* assign_each) { | 771 Expression* result_done, Expression* assign_each) { |
791 ForEachStatement::Initialize(body); | 772 ForEachStatement::Initialize(body); |
792 iterator_ = iterator; | 773 iterator_ = iterator; |
793 assign_iterator_ = assign_iterator; | 774 assign_iterator_ = assign_iterator; |
794 next_result_ = next_result; | 775 next_result_ = next_result; |
795 result_done_ = result_done; | 776 result_done_ = result_done; |
796 assign_each_ = assign_each; | 777 assign_each_ = assign_each; |
797 } | 778 } |
(...skipping 26 matching lines...) Expand all Loading... |
824 void set_next_result(Expression* e) { next_result_ = e; } | 805 void set_next_result(Expression* e) { next_result_ = e; } |
825 void set_result_done(Expression* e) { result_done_ = e; } | 806 void set_result_done(Expression* e) { result_done_ = e; } |
826 void set_assign_each(Expression* e) { assign_each_ = e; } | 807 void set_assign_each(Expression* e) { assign_each_ = e; } |
827 | 808 |
828 BailoutId ContinueId() const { return EntryId(); } | 809 BailoutId ContinueId() const { return EntryId(); } |
829 BailoutId StackCheckId() const { return BackEdgeId(); } | 810 BailoutId StackCheckId() const { return BackEdgeId(); } |
830 | 811 |
831 static int num_ids() { return parent_num_ids() + 1; } | 812 static int num_ids() { return parent_num_ids() + 1; } |
832 BailoutId BackEdgeId() const { return BailoutId(local_id(0)); } | 813 BailoutId BackEdgeId() const { return BailoutId(local_id(0)); } |
833 | 814 |
834 protected: | 815 private: |
| 816 friend class AstNodeFactory; |
| 817 |
835 ForOfStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 818 ForOfStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
836 : ForEachStatement(zone, labels, pos, kForOfStatement), | 819 : ForEachStatement(zone, labels, pos, kForOfStatement), |
837 iterator_(NULL), | 820 iterator_(NULL), |
838 assign_iterator_(NULL), | 821 assign_iterator_(NULL), |
839 next_result_(NULL), | 822 next_result_(NULL), |
840 result_done_(NULL), | 823 result_done_(NULL), |
841 assign_each_(NULL) {} | 824 assign_each_(NULL) {} |
842 static int parent_num_ids() { return ForEachStatement::num_ids(); } | 825 static int parent_num_ids() { return ForEachStatement::num_ids(); } |
843 | |
844 private: | |
845 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 826 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
846 | 827 |
847 Variable* iterator_; | 828 Variable* iterator_; |
848 Expression* assign_iterator_; | 829 Expression* assign_iterator_; |
849 Expression* next_result_; | 830 Expression* next_result_; |
850 Expression* result_done_; | 831 Expression* result_done_; |
851 Expression* assign_each_; | 832 Expression* assign_each_; |
852 }; | 833 }; |
853 | 834 |
854 | 835 |
855 class ExpressionStatement final : public Statement { | 836 class ExpressionStatement final : public Statement { |
856 public: | 837 public: |
857 DECLARE_NODE_TYPE(ExpressionStatement) | |
858 | |
859 void set_expression(Expression* e) { expression_ = e; } | 838 void set_expression(Expression* e) { expression_ = e; } |
860 Expression* expression() const { return expression_; } | 839 Expression* expression() const { return expression_; } |
861 bool IsJump() const { return expression_->IsThrow(); } | 840 bool IsJump() const { return expression_->IsThrow(); } |
862 | 841 |
863 protected: | 842 private: |
| 843 friend class AstNodeFactory; |
| 844 |
864 ExpressionStatement(Zone* zone, Expression* expression, int pos) | 845 ExpressionStatement(Zone* zone, Expression* expression, int pos) |
865 : Statement(zone, pos, kExpressionStatement), expression_(expression) {} | 846 : Statement(zone, pos, kExpressionStatement), expression_(expression) {} |
866 | 847 |
867 private: | |
868 Expression* expression_; | 848 Expression* expression_; |
869 }; | 849 }; |
870 | 850 |
871 | 851 |
872 class JumpStatement : public Statement { | 852 class JumpStatement : public Statement { |
873 public: | 853 public: |
874 bool IsJump() const { return true; } | 854 bool IsJump() const { return true; } |
875 | 855 |
876 protected: | 856 protected: |
877 JumpStatement(Zone* zone, int pos, NodeType type) | 857 JumpStatement(Zone* zone, int pos, NodeType type) |
878 : Statement(zone, pos, type) {} | 858 : Statement(zone, pos, type) {} |
879 }; | 859 }; |
880 | 860 |
881 | 861 |
882 class ContinueStatement final : public JumpStatement { | 862 class ContinueStatement final : public JumpStatement { |
883 public: | 863 public: |
884 DECLARE_NODE_TYPE(ContinueStatement) | |
885 | |
886 IterationStatement* target() const { return target_; } | 864 IterationStatement* target() const { return target_; } |
887 | 865 |
888 protected: | 866 private: |
| 867 friend class AstNodeFactory; |
| 868 |
889 ContinueStatement(Zone* zone, IterationStatement* target, int pos) | 869 ContinueStatement(Zone* zone, IterationStatement* target, int pos) |
890 : JumpStatement(zone, pos, kContinueStatement), target_(target) {} | 870 : JumpStatement(zone, pos, kContinueStatement), target_(target) {} |
891 | 871 |
892 private: | |
893 IterationStatement* target_; | 872 IterationStatement* target_; |
894 }; | 873 }; |
895 | 874 |
896 | 875 |
897 class BreakStatement final : public JumpStatement { | 876 class BreakStatement final : public JumpStatement { |
898 public: | 877 public: |
899 DECLARE_NODE_TYPE(BreakStatement) | |
900 | |
901 BreakableStatement* target() const { return target_; } | 878 BreakableStatement* target() const { return target_; } |
902 | 879 |
903 protected: | 880 private: |
| 881 friend class AstNodeFactory; |
| 882 |
904 BreakStatement(Zone* zone, BreakableStatement* target, int pos) | 883 BreakStatement(Zone* zone, BreakableStatement* target, int pos) |
905 : JumpStatement(zone, pos, kBreakStatement), target_(target) {} | 884 : JumpStatement(zone, pos, kBreakStatement), target_(target) {} |
906 | 885 |
907 private: | |
908 BreakableStatement* target_; | 886 BreakableStatement* target_; |
909 }; | 887 }; |
910 | 888 |
911 | 889 |
912 class ReturnStatement final : public JumpStatement { | 890 class ReturnStatement final : public JumpStatement { |
913 public: | 891 public: |
914 DECLARE_NODE_TYPE(ReturnStatement) | |
915 | |
916 Expression* expression() const { return expression_; } | 892 Expression* expression() const { return expression_; } |
917 | 893 |
918 void set_expression(Expression* e) { expression_ = e; } | 894 void set_expression(Expression* e) { expression_ = e; } |
919 | 895 |
920 protected: | 896 private: |
| 897 friend class AstNodeFactory; |
| 898 |
921 ReturnStatement(Zone* zone, Expression* expression, int pos) | 899 ReturnStatement(Zone* zone, Expression* expression, int pos) |
922 : JumpStatement(zone, pos, kReturnStatement), expression_(expression) {} | 900 : JumpStatement(zone, pos, kReturnStatement), expression_(expression) {} |
923 | 901 |
924 private: | |
925 Expression* expression_; | 902 Expression* expression_; |
926 }; | 903 }; |
927 | 904 |
928 | 905 |
929 class WithStatement final : public Statement { | 906 class WithStatement final : public Statement { |
930 public: | 907 public: |
931 DECLARE_NODE_TYPE(WithStatement) | |
932 | |
933 Scope* scope() { return scope_; } | 908 Scope* scope() { return scope_; } |
934 Expression* expression() const { return expression_; } | 909 Expression* expression() const { return expression_; } |
935 void set_expression(Expression* e) { expression_ = e; } | 910 void set_expression(Expression* e) { expression_ = e; } |
936 Statement* statement() const { return statement_; } | 911 Statement* statement() const { return statement_; } |
937 void set_statement(Statement* s) { statement_ = s; } | 912 void set_statement(Statement* s) { statement_ = s; } |
938 | 913 |
939 void set_base_id(int id) { base_id_ = id; } | 914 void set_base_id(int id) { base_id_ = id; } |
940 static int num_ids() { return parent_num_ids() + 2; } | 915 static int num_ids() { return parent_num_ids() + 2; } |
941 BailoutId ToObjectId() const { return BailoutId(local_id(0)); } | 916 BailoutId ToObjectId() const { return BailoutId(local_id(0)); } |
942 BailoutId EntryId() const { return BailoutId(local_id(1)); } | 917 BailoutId EntryId() const { return BailoutId(local_id(1)); } |
943 | 918 |
944 protected: | 919 private: |
| 920 friend class AstNodeFactory; |
| 921 |
945 WithStatement(Zone* zone, Scope* scope, Expression* expression, | 922 WithStatement(Zone* zone, Scope* scope, Expression* expression, |
946 Statement* statement, int pos) | 923 Statement* statement, int pos) |
947 : Statement(zone, pos, kWithStatement), | 924 : Statement(zone, pos, kWithStatement), |
948 base_id_(BailoutId::None().ToInt()), | 925 base_id_(BailoutId::None().ToInt()), |
949 scope_(scope), | 926 scope_(scope), |
950 expression_(expression), | 927 expression_(expression), |
951 statement_(statement) {} | 928 statement_(statement) {} |
| 929 |
952 static int parent_num_ids() { return 0; } | 930 static int parent_num_ids() { return 0; } |
953 | |
954 int base_id() const { | 931 int base_id() const { |
955 DCHECK(!BailoutId(base_id_).IsNone()); | 932 DCHECK(!BailoutId(base_id_).IsNone()); |
956 return base_id_; | 933 return base_id_; |
957 } | 934 } |
958 | |
959 private: | |
960 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 935 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
961 | 936 |
962 int base_id_; | 937 int base_id_; |
963 Scope* scope_; | 938 Scope* scope_; |
964 Expression* expression_; | 939 Expression* expression_; |
965 Statement* statement_; | 940 Statement* statement_; |
966 }; | 941 }; |
967 | 942 |
968 | 943 |
969 class CaseClause final : public Expression { | 944 class CaseClause final : public Expression { |
970 public: | 945 public: |
971 DECLARE_NODE_TYPE(CaseClause) | |
972 | |
973 bool is_default() const { return label_ == NULL; } | 946 bool is_default() const { return label_ == NULL; } |
974 Expression* label() const { | 947 Expression* label() const { |
975 CHECK(!is_default()); | 948 CHECK(!is_default()); |
976 return label_; | 949 return label_; |
977 } | 950 } |
978 void set_label(Expression* e) { label_ = e; } | 951 void set_label(Expression* e) { label_ = e; } |
979 Label* body_target() { return &body_target_; } | 952 Label* body_target() { return &body_target_; } |
980 ZoneList<Statement*>* statements() const { return statements_; } | 953 ZoneList<Statement*>* statements() const { return statements_; } |
981 | 954 |
982 static int num_ids() { return parent_num_ids() + 2; } | 955 static int num_ids() { return parent_num_ids() + 2; } |
983 BailoutId EntryId() const { return BailoutId(local_id(0)); } | 956 BailoutId EntryId() const { return BailoutId(local_id(0)); } |
984 TypeFeedbackId CompareId() { return TypeFeedbackId(local_id(1)); } | 957 TypeFeedbackId CompareId() { return TypeFeedbackId(local_id(1)); } |
985 | 958 |
986 Type* compare_type() { return compare_type_; } | 959 Type* compare_type() { return compare_type_; } |
987 void set_compare_type(Type* type) { compare_type_ = type; } | 960 void set_compare_type(Type* type) { compare_type_ = type; } |
988 | 961 |
989 protected: | 962 private: |
| 963 friend class AstNodeFactory; |
| 964 |
990 static int parent_num_ids() { return Expression::num_ids(); } | 965 static int parent_num_ids() { return Expression::num_ids(); } |
991 | |
992 private: | |
993 CaseClause(Zone* zone, Expression* label, ZoneList<Statement*>* statements, | 966 CaseClause(Zone* zone, Expression* label, ZoneList<Statement*>* statements, |
994 int pos); | 967 int pos); |
995 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 968 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
996 | 969 |
997 Expression* label_; | 970 Expression* label_; |
998 Label body_target_; | 971 Label body_target_; |
999 ZoneList<Statement*>* statements_; | 972 ZoneList<Statement*>* statements_; |
1000 Type* compare_type_; | 973 Type* compare_type_; |
1001 }; | 974 }; |
1002 | 975 |
1003 | 976 |
1004 class SwitchStatement final : public BreakableStatement { | 977 class SwitchStatement final : public BreakableStatement { |
1005 public: | 978 public: |
1006 DECLARE_NODE_TYPE(SwitchStatement) | |
1007 | |
1008 void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) { | 979 void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) { |
1009 tag_ = tag; | 980 tag_ = tag; |
1010 cases_ = cases; | 981 cases_ = cases; |
1011 } | 982 } |
1012 | 983 |
1013 Expression* tag() const { return tag_; } | 984 Expression* tag() const { return tag_; } |
1014 ZoneList<CaseClause*>* cases() const { return cases_; } | 985 ZoneList<CaseClause*>* cases() const { return cases_; } |
1015 | 986 |
1016 void set_tag(Expression* t) { tag_ = t; } | 987 void set_tag(Expression* t) { tag_ = t; } |
1017 | 988 |
1018 protected: | 989 private: |
| 990 friend class AstNodeFactory; |
| 991 |
1019 SwitchStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 992 SwitchStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
1020 : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos, | 993 : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos, |
1021 kSwitchStatement), | 994 kSwitchStatement), |
1022 tag_(NULL), | 995 tag_(NULL), |
1023 cases_(NULL) {} | 996 cases_(NULL) {} |
1024 | 997 |
1025 private: | |
1026 Expression* tag_; | 998 Expression* tag_; |
1027 ZoneList<CaseClause*>* cases_; | 999 ZoneList<CaseClause*>* cases_; |
1028 }; | 1000 }; |
1029 | 1001 |
1030 | 1002 |
1031 // If-statements always have non-null references to their then- and | 1003 // If-statements always have non-null references to their then- and |
1032 // else-parts. When parsing if-statements with no explicit else-part, | 1004 // else-parts. When parsing if-statements with no explicit else-part, |
1033 // the parser implicitly creates an empty statement. Use the | 1005 // the parser implicitly creates an empty statement. Use the |
1034 // HasThenStatement() and HasElseStatement() functions to check if a | 1006 // HasThenStatement() and HasElseStatement() functions to check if a |
1035 // given if-statement has a then- or an else-part containing code. | 1007 // given if-statement has a then- or an else-part containing code. |
1036 class IfStatement final : public Statement { | 1008 class IfStatement final : public Statement { |
1037 public: | 1009 public: |
1038 DECLARE_NODE_TYPE(IfStatement) | |
1039 | |
1040 bool HasThenStatement() const { return !then_statement()->IsEmpty(); } | 1010 bool HasThenStatement() const { return !then_statement()->IsEmpty(); } |
1041 bool HasElseStatement() const { return !else_statement()->IsEmpty(); } | 1011 bool HasElseStatement() const { return !else_statement()->IsEmpty(); } |
1042 | 1012 |
1043 Expression* condition() const { return condition_; } | 1013 Expression* condition() const { return condition_; } |
1044 Statement* then_statement() const { return then_statement_; } | 1014 Statement* then_statement() const { return then_statement_; } |
1045 Statement* else_statement() const { return else_statement_; } | 1015 Statement* else_statement() const { return else_statement_; } |
1046 | 1016 |
1047 void set_condition(Expression* e) { condition_ = e; } | 1017 void set_condition(Expression* e) { condition_ = e; } |
1048 void set_then_statement(Statement* s) { then_statement_ = s; } | 1018 void set_then_statement(Statement* s) { then_statement_ = s; } |
1049 void set_else_statement(Statement* s) { else_statement_ = s; } | 1019 void set_else_statement(Statement* s) { else_statement_ = s; } |
1050 | 1020 |
1051 bool IsJump() const { | 1021 bool IsJump() const { |
1052 return HasThenStatement() && then_statement()->IsJump() | 1022 return HasThenStatement() && then_statement()->IsJump() |
1053 && HasElseStatement() && else_statement()->IsJump(); | 1023 && HasElseStatement() && else_statement()->IsJump(); |
1054 } | 1024 } |
1055 | 1025 |
1056 void set_base_id(int id) { base_id_ = id; } | 1026 void set_base_id(int id) { base_id_ = id; } |
1057 static int num_ids() { return parent_num_ids() + 3; } | 1027 static int num_ids() { return parent_num_ids() + 3; } |
1058 BailoutId IfId() const { return BailoutId(local_id(0)); } | 1028 BailoutId IfId() const { return BailoutId(local_id(0)); } |
1059 BailoutId ThenId() const { return BailoutId(local_id(1)); } | 1029 BailoutId ThenId() const { return BailoutId(local_id(1)); } |
1060 BailoutId ElseId() const { return BailoutId(local_id(2)); } | 1030 BailoutId ElseId() const { return BailoutId(local_id(2)); } |
1061 | 1031 |
1062 protected: | 1032 private: |
| 1033 friend class AstNodeFactory; |
| 1034 |
1063 IfStatement(Zone* zone, Expression* condition, Statement* then_statement, | 1035 IfStatement(Zone* zone, Expression* condition, Statement* then_statement, |
1064 Statement* else_statement, int pos) | 1036 Statement* else_statement, int pos) |
1065 : Statement(zone, pos, kIfStatement), | 1037 : Statement(zone, pos, kIfStatement), |
1066 base_id_(BailoutId::None().ToInt()), | 1038 base_id_(BailoutId::None().ToInt()), |
1067 condition_(condition), | 1039 condition_(condition), |
1068 then_statement_(then_statement), | 1040 then_statement_(then_statement), |
1069 else_statement_(else_statement) {} | 1041 else_statement_(else_statement) {} |
| 1042 |
1070 static int parent_num_ids() { return 0; } | 1043 static int parent_num_ids() { return 0; } |
1071 | |
1072 int base_id() const { | 1044 int base_id() const { |
1073 DCHECK(!BailoutId(base_id_).IsNone()); | 1045 DCHECK(!BailoutId(base_id_).IsNone()); |
1074 return base_id_; | 1046 return base_id_; |
1075 } | 1047 } |
1076 | |
1077 private: | |
1078 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1048 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
1079 | 1049 |
1080 int base_id_; | 1050 int base_id_; |
1081 Expression* condition_; | 1051 Expression* condition_; |
1082 Statement* then_statement_; | 1052 Statement* then_statement_; |
1083 Statement* else_statement_; | 1053 Statement* else_statement_; |
1084 }; | 1054 }; |
1085 | 1055 |
1086 | 1056 |
1087 class TryStatement : public Statement { | 1057 class TryStatement : public Statement { |
(...skipping 26 matching lines...) Expand all Loading... |
1114 | 1084 |
1115 HandlerTable::CatchPrediction catch_prediction_; | 1085 HandlerTable::CatchPrediction catch_prediction_; |
1116 | 1086 |
1117 private: | 1087 private: |
1118 Block* try_block_; | 1088 Block* try_block_; |
1119 }; | 1089 }; |
1120 | 1090 |
1121 | 1091 |
1122 class TryCatchStatement final : public TryStatement { | 1092 class TryCatchStatement final : public TryStatement { |
1123 public: | 1093 public: |
1124 DECLARE_NODE_TYPE(TryCatchStatement) | |
1125 | |
1126 Scope* scope() { return scope_; } | 1094 Scope* scope() { return scope_; } |
1127 Variable* variable() { return variable_; } | 1095 Variable* variable() { return variable_; } |
1128 Block* catch_block() const { return catch_block_; } | 1096 Block* catch_block() const { return catch_block_; } |
1129 void set_catch_block(Block* b) { catch_block_ = b; } | 1097 void set_catch_block(Block* b) { catch_block_ = b; } |
1130 | 1098 |
1131 // The clear_pending_message flag indicates whether or not to clear the | 1099 // The clear_pending_message flag indicates whether or not to clear the |
1132 // isolate's pending exception message before executing the catch_block. In | 1100 // isolate's pending exception message before executing the catch_block. In |
1133 // the normal use case, this flag is always on because the message object | 1101 // the normal use case, this flag is always on because the message object |
1134 // is not needed anymore when entering the catch block and should not be kept | 1102 // is not needed anymore when entering the catch block and should not be kept |
1135 // alive. | 1103 // alive. |
1136 // The use case where the flag is off is when the catch block is guaranteed to | 1104 // The use case where the flag is off is when the catch block is guaranteed to |
1137 // rethrow the caught exception (using %ReThrow), which reuses the pending | 1105 // rethrow the caught exception (using %ReThrow), which reuses the pending |
1138 // message instead of generating a new one. | 1106 // message instead of generating a new one. |
1139 // (When the catch block doesn't rethrow but is guaranteed to perform an | 1107 // (When the catch block doesn't rethrow but is guaranteed to perform an |
1140 // ordinary throw, not clearing the old message is safe but not very useful.) | 1108 // ordinary throw, not clearing the old message is safe but not very useful.) |
1141 bool clear_pending_message() const { | 1109 bool clear_pending_message() const { |
1142 return catch_prediction_ != HandlerTable::UNCAUGHT; | 1110 return catch_prediction_ != HandlerTable::UNCAUGHT; |
1143 } | 1111 } |
1144 | 1112 |
1145 protected: | 1113 private: |
| 1114 friend class AstNodeFactory; |
| 1115 |
1146 TryCatchStatement(Zone* zone, Block* try_block, Scope* scope, | 1116 TryCatchStatement(Zone* zone, Block* try_block, Scope* scope, |
1147 Variable* variable, Block* catch_block, | 1117 Variable* variable, Block* catch_block, |
1148 HandlerTable::CatchPrediction catch_prediction, int pos) | 1118 HandlerTable::CatchPrediction catch_prediction, int pos) |
1149 : TryStatement(zone, try_block, pos, kTryCatchStatement), | 1119 : TryStatement(zone, try_block, pos, kTryCatchStatement), |
1150 scope_(scope), | 1120 scope_(scope), |
1151 variable_(variable), | 1121 variable_(variable), |
1152 catch_block_(catch_block) { | 1122 catch_block_(catch_block) { |
1153 catch_prediction_ = catch_prediction; | 1123 catch_prediction_ = catch_prediction; |
1154 } | 1124 } |
1155 | 1125 |
1156 private: | |
1157 Scope* scope_; | 1126 Scope* scope_; |
1158 Variable* variable_; | 1127 Variable* variable_; |
1159 Block* catch_block_; | 1128 Block* catch_block_; |
1160 }; | 1129 }; |
1161 | 1130 |
1162 | 1131 |
1163 class TryFinallyStatement final : public TryStatement { | 1132 class TryFinallyStatement final : public TryStatement { |
1164 public: | 1133 public: |
1165 DECLARE_NODE_TYPE(TryFinallyStatement) | |
1166 | |
1167 Block* finally_block() const { return finally_block_; } | 1134 Block* finally_block() const { return finally_block_; } |
1168 void set_finally_block(Block* b) { finally_block_ = b; } | 1135 void set_finally_block(Block* b) { finally_block_ = b; } |
1169 | 1136 |
1170 protected: | 1137 private: |
| 1138 friend class AstNodeFactory; |
| 1139 |
1171 TryFinallyStatement(Zone* zone, Block* try_block, Block* finally_block, | 1140 TryFinallyStatement(Zone* zone, Block* try_block, Block* finally_block, |
1172 int pos) | 1141 int pos) |
1173 : TryStatement(zone, try_block, pos, kTryFinallyStatement), | 1142 : TryStatement(zone, try_block, pos, kTryFinallyStatement), |
1174 finally_block_(finally_block) {} | 1143 finally_block_(finally_block) {} |
1175 | 1144 |
1176 private: | |
1177 Block* finally_block_; | 1145 Block* finally_block_; |
1178 }; | 1146 }; |
1179 | 1147 |
1180 | 1148 |
1181 class DebuggerStatement final : public Statement { | 1149 class DebuggerStatement final : public Statement { |
1182 public: | 1150 public: |
1183 DECLARE_NODE_TYPE(DebuggerStatement) | |
1184 | |
1185 void set_base_id(int id) { base_id_ = id; } | 1151 void set_base_id(int id) { base_id_ = id; } |
1186 static int num_ids() { return parent_num_ids() + 1; } | 1152 static int num_ids() { return parent_num_ids() + 1; } |
1187 BailoutId DebugBreakId() const { return BailoutId(local_id(0)); } | 1153 BailoutId DebugBreakId() const { return BailoutId(local_id(0)); } |
1188 | 1154 |
1189 protected: | 1155 private: |
| 1156 friend class AstNodeFactory; |
| 1157 |
1190 DebuggerStatement(Zone* zone, int pos) | 1158 DebuggerStatement(Zone* zone, int pos) |
1191 : Statement(zone, pos, kDebuggerStatement), | 1159 : Statement(zone, pos, kDebuggerStatement), |
1192 base_id_(BailoutId::None().ToInt()) {} | 1160 base_id_(BailoutId::None().ToInt()) {} |
| 1161 |
1193 static int parent_num_ids() { return 0; } | 1162 static int parent_num_ids() { return 0; } |
1194 | |
1195 int base_id() const { | 1163 int base_id() const { |
1196 DCHECK(!BailoutId(base_id_).IsNone()); | 1164 DCHECK(!BailoutId(base_id_).IsNone()); |
1197 return base_id_; | 1165 return base_id_; |
1198 } | 1166 } |
1199 | |
1200 private: | |
1201 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1167 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
1202 | 1168 |
1203 int base_id_; | 1169 int base_id_; |
1204 }; | 1170 }; |
1205 | 1171 |
1206 | 1172 |
1207 class EmptyStatement final : public Statement { | 1173 class EmptyStatement final : public Statement { |
1208 public: | 1174 private: |
1209 DECLARE_NODE_TYPE(EmptyStatement) | 1175 friend class AstNodeFactory; |
1210 | |
1211 protected: | |
1212 EmptyStatement(Zone* zone, int pos) : Statement(zone, pos, kEmptyStatement) {} | 1176 EmptyStatement(Zone* zone, int pos) : Statement(zone, pos, kEmptyStatement) {} |
1213 }; | 1177 }; |
1214 | 1178 |
1215 | 1179 |
1216 // Delegates to another statement, which may be overwritten. | 1180 // Delegates to another statement, which may be overwritten. |
1217 // This was introduced to implement ES2015 Annex B3.3 for conditionally making | 1181 // This was introduced to implement ES2015 Annex B3.3 for conditionally making |
1218 // sloppy-mode block-scoped functions have a var binding, which is changed | 1182 // sloppy-mode block-scoped functions have a var binding, which is changed |
1219 // from one statement to another during parsing. | 1183 // from one statement to another during parsing. |
1220 class SloppyBlockFunctionStatement final : public Statement { | 1184 class SloppyBlockFunctionStatement final : public Statement { |
1221 public: | 1185 public: |
1222 DECLARE_NODE_TYPE(SloppyBlockFunctionStatement) | |
1223 | |
1224 Statement* statement() const { return statement_; } | 1186 Statement* statement() const { return statement_; } |
1225 void set_statement(Statement* statement) { statement_ = statement; } | 1187 void set_statement(Statement* statement) { statement_ = statement; } |
1226 Scope* scope() const { return scope_; } | 1188 Scope* scope() const { return scope_; } |
1227 | 1189 |
1228 private: | 1190 private: |
| 1191 friend class AstNodeFactory; |
| 1192 |
1229 SloppyBlockFunctionStatement(Zone* zone, Statement* statement, Scope* scope) | 1193 SloppyBlockFunctionStatement(Zone* zone, Statement* statement, Scope* scope) |
1230 : Statement(zone, kNoSourcePosition, kSloppyBlockFunctionStatement), | 1194 : Statement(zone, kNoSourcePosition, kSloppyBlockFunctionStatement), |
1231 statement_(statement), | 1195 statement_(statement), |
1232 scope_(scope) {} | 1196 scope_(scope) {} |
1233 | 1197 |
1234 Statement* statement_; | 1198 Statement* statement_; |
1235 Scope* const scope_; | 1199 Scope* const scope_; |
1236 }; | 1200 }; |
1237 | 1201 |
1238 | 1202 |
1239 class Literal final : public Expression { | 1203 class Literal final : public Expression { |
1240 public: | 1204 public: |
1241 DECLARE_NODE_TYPE(Literal) | |
1242 | |
1243 bool IsPropertyName() const { return value_->IsPropertyName(); } | 1205 bool IsPropertyName() const { return value_->IsPropertyName(); } |
1244 | 1206 |
1245 Handle<String> AsPropertyName() { | 1207 Handle<String> AsPropertyName() { |
1246 DCHECK(IsPropertyName()); | 1208 DCHECK(IsPropertyName()); |
1247 return Handle<String>::cast(value()); | 1209 return Handle<String>::cast(value()); |
1248 } | 1210 } |
1249 | 1211 |
1250 const AstRawString* AsRawPropertyName() { | 1212 const AstRawString* AsRawPropertyName() { |
1251 DCHECK(IsPropertyName()); | 1213 DCHECK(IsPropertyName()); |
1252 return value_->AsString(); | 1214 return value_->AsString(); |
1253 } | 1215 } |
1254 | 1216 |
1255 bool ToBooleanIsTrue() const { return value()->BooleanValue(); } | 1217 bool ToBooleanIsTrue() const { return value()->BooleanValue(); } |
1256 bool ToBooleanIsFalse() const { return !value()->BooleanValue(); } | 1218 bool ToBooleanIsFalse() const { return !value()->BooleanValue(); } |
1257 | 1219 |
1258 Handle<Object> value() const { return value_->value(); } | 1220 Handle<Object> value() const { return value_->value(); } |
1259 const AstValue* raw_value() const { return value_; } | 1221 const AstValue* raw_value() const { return value_; } |
1260 | 1222 |
1261 // Support for using Literal as a HashMap key. NOTE: Currently, this works | 1223 // Support for using Literal as a HashMap key. NOTE: Currently, this works |
1262 // only for string and number literals! | 1224 // only for string and number literals! |
1263 uint32_t Hash(); | 1225 uint32_t Hash(); |
1264 static bool Match(void* literal1, void* literal2); | 1226 static bool Match(void* literal1, void* literal2); |
1265 | 1227 |
1266 static int num_ids() { return parent_num_ids() + 1; } | 1228 static int num_ids() { return parent_num_ids() + 1; } |
1267 TypeFeedbackId LiteralFeedbackId() const { | 1229 TypeFeedbackId LiteralFeedbackId() const { |
1268 return TypeFeedbackId(local_id(0)); | 1230 return TypeFeedbackId(local_id(0)); |
1269 } | 1231 } |
1270 | 1232 |
1271 protected: | 1233 private: |
| 1234 friend class AstNodeFactory; |
| 1235 |
1272 Literal(Zone* zone, const AstValue* value, int position) | 1236 Literal(Zone* zone, const AstValue* value, int position) |
1273 : Expression(zone, position, kLiteral), value_(value) {} | 1237 : Expression(zone, position, kLiteral), value_(value) {} |
| 1238 |
1274 static int parent_num_ids() { return Expression::num_ids(); } | 1239 static int parent_num_ids() { return Expression::num_ids(); } |
1275 | |
1276 private: | |
1277 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1240 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
1278 | 1241 |
1279 const AstValue* value_; | 1242 const AstValue* value_; |
1280 }; | 1243 }; |
1281 | 1244 |
1282 | 1245 |
1283 class AstLiteralReindexer; | 1246 class AstLiteralReindexer; |
1284 | 1247 |
1285 // Base class for literals that needs space in the corresponding JSFunction. | 1248 // Base class for literals that needs space in the corresponding JSFunction. |
1286 class MaterializedLiteral : public Expression { | 1249 class MaterializedLiteral : public Expression { |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1371 } | 1334 } |
1372 void SetSlot(FeedbackVectorSlot slot, int offset = 0) { | 1335 void SetSlot(FeedbackVectorSlot slot, int offset = 0) { |
1373 DCHECK_LT(offset, static_cast<int>(arraysize(slots_))); | 1336 DCHECK_LT(offset, static_cast<int>(arraysize(slots_))); |
1374 slots_[offset] = slot; | 1337 slots_[offset] = slot; |
1375 } | 1338 } |
1376 | 1339 |
1377 void set_receiver_type(Handle<Map> map) { receiver_type_ = map; } | 1340 void set_receiver_type(Handle<Map> map) { receiver_type_ = map; } |
1378 | 1341 |
1379 bool NeedsSetFunctionName() const; | 1342 bool NeedsSetFunctionName() const; |
1380 | 1343 |
1381 protected: | 1344 private: |
1382 friend class AstNodeFactory; | 1345 friend class AstNodeFactory; |
1383 | 1346 |
1384 ObjectLiteralProperty(Expression* key, Expression* value, Kind kind, | 1347 ObjectLiteralProperty(Expression* key, Expression* value, Kind kind, |
1385 bool is_static, bool is_computed_name); | 1348 bool is_static, bool is_computed_name); |
1386 ObjectLiteralProperty(AstValueFactory* ast_value_factory, Expression* key, | 1349 ObjectLiteralProperty(AstValueFactory* ast_value_factory, Expression* key, |
1387 Expression* value, bool is_static, | 1350 Expression* value, bool is_static, |
1388 bool is_computed_name); | 1351 bool is_computed_name); |
1389 | 1352 |
1390 private: | |
1391 Expression* key_; | 1353 Expression* key_; |
1392 Expression* value_; | 1354 Expression* value_; |
1393 FeedbackVectorSlot slots_[2]; | 1355 FeedbackVectorSlot slots_[2]; |
1394 Kind kind_; | 1356 Kind kind_; |
1395 bool emit_store_; | 1357 bool emit_store_; |
1396 bool is_static_; | 1358 bool is_static_; |
1397 bool is_computed_name_; | 1359 bool is_computed_name_; |
1398 Handle<Map> receiver_type_; | 1360 Handle<Map> receiver_type_; |
1399 }; | 1361 }; |
1400 | 1362 |
1401 | 1363 |
1402 // An object literal has a boilerplate object that is used | 1364 // An object literal has a boilerplate object that is used |
1403 // for minimizing the work when constructing it at runtime. | 1365 // for minimizing the work when constructing it at runtime. |
1404 class ObjectLiteral final : public MaterializedLiteral { | 1366 class ObjectLiteral final : public MaterializedLiteral { |
1405 public: | 1367 public: |
1406 typedef ObjectLiteralProperty Property; | 1368 typedef ObjectLiteralProperty Property; |
1407 | 1369 |
1408 DECLARE_NODE_TYPE(ObjectLiteral) | |
1409 | |
1410 Handle<FixedArray> constant_properties() const { | 1370 Handle<FixedArray> constant_properties() const { |
1411 return constant_properties_; | 1371 return constant_properties_; |
1412 } | 1372 } |
1413 int properties_count() const { return constant_properties_->length() / 2; } | 1373 int properties_count() const { return constant_properties_->length() / 2; } |
1414 ZoneList<Property*>* properties() const { return properties_; } | 1374 ZoneList<Property*>* properties() const { return properties_; } |
1415 bool fast_elements() const { return fast_elements_; } | 1375 bool fast_elements() const { return fast_elements_; } |
1416 bool may_store_doubles() const { return may_store_doubles_; } | 1376 bool may_store_doubles() const { return may_store_doubles_; } |
1417 bool has_elements() const { return has_elements_; } | 1377 bool has_elements() const { return has_elements_; } |
1418 bool has_shallow_properties() const { | 1378 bool has_shallow_properties() const { |
1419 return depth() == 1 && !has_elements() && !may_store_doubles(); | 1379 return depth() == 1 && !has_elements() && !may_store_doubles(); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1470 // ObjectLiteral can vary, so num_ids() is not a static method. | 1430 // ObjectLiteral can vary, so num_ids() is not a static method. |
1471 int num_ids() const { | 1431 int num_ids() const { |
1472 return parent_num_ids() + 1 + 2 * properties()->length(); | 1432 return parent_num_ids() + 1 + 2 * properties()->length(); |
1473 } | 1433 } |
1474 | 1434 |
1475 // Object literals need one feedback slot for each non-trivial value, as well | 1435 // Object literals need one feedback slot for each non-trivial value, as well |
1476 // as some slots for home objects. | 1436 // as some slots for home objects. |
1477 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 1437 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
1478 FeedbackVectorSlotCache* cache); | 1438 FeedbackVectorSlotCache* cache); |
1479 | 1439 |
1480 protected: | 1440 private: |
| 1441 friend class AstNodeFactory; |
| 1442 |
1481 ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index, | 1443 ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index, |
1482 uint32_t boilerplate_properties, int pos) | 1444 uint32_t boilerplate_properties, int pos) |
1483 : MaterializedLiteral(zone, literal_index, pos, kObjectLiteral), | 1445 : MaterializedLiteral(zone, literal_index, pos, kObjectLiteral), |
1484 boilerplate_properties_(boilerplate_properties), | 1446 boilerplate_properties_(boilerplate_properties), |
1485 fast_elements_(false), | 1447 fast_elements_(false), |
1486 has_elements_(false), | 1448 has_elements_(false), |
1487 may_store_doubles_(false), | 1449 may_store_doubles_(false), |
1488 properties_(properties) {} | 1450 properties_(properties) {} |
| 1451 |
1489 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } | 1452 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } |
| 1453 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
1490 | 1454 |
1491 private: | |
1492 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | |
1493 uint32_t boilerplate_properties_ : 29; | 1455 uint32_t boilerplate_properties_ : 29; |
1494 bool fast_elements_ : 1; | 1456 bool fast_elements_ : 1; |
1495 bool has_elements_ : 1; | 1457 bool has_elements_ : 1; |
1496 bool may_store_doubles_ : 1; | 1458 bool may_store_doubles_ : 1; |
1497 FeedbackVectorSlot slot_; | 1459 FeedbackVectorSlot slot_; |
1498 Handle<FixedArray> constant_properties_; | 1460 Handle<FixedArray> constant_properties_; |
1499 ZoneList<Property*>* properties_; | 1461 ZoneList<Property*>* properties_; |
1500 }; | 1462 }; |
1501 | 1463 |
1502 | 1464 |
(...skipping 15 matching lines...) Expand all Loading... |
1518 } | 1480 } |
1519 | 1481 |
1520 private: | 1482 private: |
1521 Zone* zone_; | 1483 Zone* zone_; |
1522 }; | 1484 }; |
1523 | 1485 |
1524 | 1486 |
1525 // Node for capturing a regexp literal. | 1487 // Node for capturing a regexp literal. |
1526 class RegExpLiteral final : public MaterializedLiteral { | 1488 class RegExpLiteral final : public MaterializedLiteral { |
1527 public: | 1489 public: |
1528 DECLARE_NODE_TYPE(RegExpLiteral) | |
1529 | |
1530 Handle<String> pattern() const { return pattern_->string(); } | 1490 Handle<String> pattern() const { return pattern_->string(); } |
1531 int flags() const { return flags_; } | 1491 int flags() const { return flags_; } |
1532 | 1492 |
1533 protected: | 1493 private: |
| 1494 friend class AstNodeFactory; |
| 1495 |
1534 RegExpLiteral(Zone* zone, const AstRawString* pattern, int flags, | 1496 RegExpLiteral(Zone* zone, const AstRawString* pattern, int flags, |
1535 int literal_index, int pos) | 1497 int literal_index, int pos) |
1536 : MaterializedLiteral(zone, literal_index, pos, kRegExpLiteral), | 1498 : MaterializedLiteral(zone, literal_index, pos, kRegExpLiteral), |
1537 flags_(flags), | 1499 flags_(flags), |
1538 pattern_(pattern) { | 1500 pattern_(pattern) { |
1539 set_depth(1); | 1501 set_depth(1); |
1540 } | 1502 } |
1541 | 1503 |
1542 private: | |
1543 int const flags_; | 1504 int const flags_; |
1544 const AstRawString* const pattern_; | 1505 const AstRawString* const pattern_; |
1545 }; | 1506 }; |
1546 | 1507 |
1547 | 1508 |
1548 // An array literal has a literals object that is used | 1509 // An array literal has a literals object that is used |
1549 // for minimizing the work when constructing it at runtime. | 1510 // for minimizing the work when constructing it at runtime. |
1550 class ArrayLiteral final : public MaterializedLiteral { | 1511 class ArrayLiteral final : public MaterializedLiteral { |
1551 public: | 1512 public: |
1552 DECLARE_NODE_TYPE(ArrayLiteral) | |
1553 | |
1554 Handle<FixedArray> constant_elements() const { return constant_elements_; } | 1513 Handle<FixedArray> constant_elements() const { return constant_elements_; } |
1555 ElementsKind constant_elements_kind() const { | 1514 ElementsKind constant_elements_kind() const { |
1556 DCHECK_EQ(2, constant_elements_->length()); | 1515 DCHECK_EQ(2, constant_elements_->length()); |
1557 return static_cast<ElementsKind>( | 1516 return static_cast<ElementsKind>( |
1558 Smi::cast(constant_elements_->get(0))->value()); | 1517 Smi::cast(constant_elements_->get(0))->value()); |
1559 } | 1518 } |
1560 | 1519 |
1561 ZoneList<Expression*>* values() const { return values_; } | 1520 ZoneList<Expression*>* values() const { return values_; } |
1562 | 1521 |
1563 BailoutId CreateLiteralId() const { return BailoutId(local_id(0)); } | 1522 BailoutId CreateLiteralId() const { return BailoutId(local_id(0)); } |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1597 enum Flags { | 1556 enum Flags { |
1598 kNoFlags = 0, | 1557 kNoFlags = 0, |
1599 kShallowElements = 1, | 1558 kShallowElements = 1, |
1600 kDisableMementos = 1 << 1 | 1559 kDisableMementos = 1 << 1 |
1601 }; | 1560 }; |
1602 | 1561 |
1603 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 1562 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
1604 FeedbackVectorSlotCache* cache); | 1563 FeedbackVectorSlotCache* cache); |
1605 FeedbackVectorSlot LiteralFeedbackSlot() const { return literal_slot_; } | 1564 FeedbackVectorSlot LiteralFeedbackSlot() const { return literal_slot_; } |
1606 | 1565 |
1607 protected: | 1566 private: |
| 1567 friend class AstNodeFactory; |
| 1568 |
1608 ArrayLiteral(Zone* zone, ZoneList<Expression*>* values, | 1569 ArrayLiteral(Zone* zone, ZoneList<Expression*>* values, |
1609 int first_spread_index, int literal_index, int pos) | 1570 int first_spread_index, int literal_index, int pos) |
1610 : MaterializedLiteral(zone, literal_index, pos, kArrayLiteral), | 1571 : MaterializedLiteral(zone, literal_index, pos, kArrayLiteral), |
1611 first_spread_index_(first_spread_index), | 1572 first_spread_index_(first_spread_index), |
1612 values_(values) {} | 1573 values_(values) {} |
| 1574 |
1613 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } | 1575 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } |
1614 | |
1615 private: | |
1616 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1576 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
1617 | 1577 |
1618 int first_spread_index_; | 1578 int first_spread_index_; |
1619 FeedbackVectorSlot literal_slot_; | 1579 FeedbackVectorSlot literal_slot_; |
1620 Handle<FixedArray> constant_elements_; | 1580 Handle<FixedArray> constant_elements_; |
1621 ZoneList<Expression*>* values_; | 1581 ZoneList<Expression*>* values_; |
1622 }; | 1582 }; |
1623 | 1583 |
1624 | 1584 |
1625 class VariableProxy final : public Expression { | 1585 class VariableProxy final : public Expression { |
1626 public: | 1586 public: |
1627 DECLARE_NODE_TYPE(VariableProxy) | |
1628 | |
1629 bool IsValidReferenceExpression() const { | 1587 bool IsValidReferenceExpression() const { |
1630 return !is_this() && !is_new_target(); | 1588 return !is_this() && !is_new_target(); |
1631 } | 1589 } |
1632 | 1590 |
1633 bool IsArguments() const { return is_resolved() && var()->is_arguments(); } | 1591 bool IsArguments() const { return is_resolved() && var()->is_arguments(); } |
1634 | 1592 |
1635 Handle<String> name() const { return raw_name()->string(); } | 1593 Handle<String> name() const { return raw_name()->string(); } |
1636 const AstRawString* raw_name() const { | 1594 const AstRawString* raw_name() const { |
1637 return is_resolved() ? var_->raw_name() : raw_name_; | 1595 return is_resolved() ? var_->raw_name() : raw_name_; |
1638 } | 1596 } |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1676 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 1634 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
1677 FeedbackVectorSlotCache* cache); | 1635 FeedbackVectorSlotCache* cache); |
1678 | 1636 |
1679 FeedbackVectorSlot VariableFeedbackSlot() { return variable_feedback_slot_; } | 1637 FeedbackVectorSlot VariableFeedbackSlot() { return variable_feedback_slot_; } |
1680 | 1638 |
1681 static int num_ids() { return parent_num_ids() + 1; } | 1639 static int num_ids() { return parent_num_ids() + 1; } |
1682 BailoutId BeforeId() const { return BailoutId(local_id(0)); } | 1640 BailoutId BeforeId() const { return BailoutId(local_id(0)); } |
1683 void set_next_unresolved(VariableProxy* next) { next_unresolved_ = next; } | 1641 void set_next_unresolved(VariableProxy* next) { next_unresolved_ = next; } |
1684 VariableProxy* next_unresolved() { return next_unresolved_; } | 1642 VariableProxy* next_unresolved() { return next_unresolved_; } |
1685 | 1643 |
1686 protected: | 1644 private: |
| 1645 friend class AstNodeFactory; |
| 1646 |
1687 VariableProxy(Zone* zone, Variable* var, int start_position, | 1647 VariableProxy(Zone* zone, Variable* var, int start_position, |
1688 int end_position); | 1648 int end_position); |
1689 | |
1690 VariableProxy(Zone* zone, const AstRawString* name, | 1649 VariableProxy(Zone* zone, const AstRawString* name, |
1691 Variable::Kind variable_kind, int start_position, | 1650 Variable::Kind variable_kind, int start_position, |
1692 int end_position); | 1651 int end_position); |
1693 VariableProxy(Zone* zone, const VariableProxy* copy_from); | 1652 VariableProxy(Zone* zone, const VariableProxy* copy_from); |
| 1653 |
1694 static int parent_num_ids() { return Expression::num_ids(); } | 1654 static int parent_num_ids() { return Expression::num_ids(); } |
1695 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1655 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
1696 | 1656 |
1697 class IsThisField : public BitField8<bool, 0, 1> {}; | 1657 class IsThisField : public BitField8<bool, 0, 1> {}; |
1698 class IsAssignedField : public BitField8<bool, 1, 1> {}; | 1658 class IsAssignedField : public BitField8<bool, 1, 1> {}; |
1699 class IsResolvedField : public BitField8<bool, 2, 1> {}; | 1659 class IsResolvedField : public BitField8<bool, 2, 1> {}; |
1700 class IsNewTargetField : public BitField8<bool, 3, 1> {}; | 1660 class IsNewTargetField : public BitField8<bool, 3, 1> {}; |
1701 | 1661 |
1702 // Start with 16-bit (or smaller) field, which should get packed together | 1662 // Start with 16-bit (or smaller) field, which should get packed together |
1703 // with Expression's trailing 16-bit field. | 1663 // with Expression's trailing 16-bit field. |
(...skipping 17 matching lines...) Expand all Loading... |
1721 VARIABLE, | 1681 VARIABLE, |
1722 NAMED_PROPERTY, | 1682 NAMED_PROPERTY, |
1723 KEYED_PROPERTY, | 1683 KEYED_PROPERTY, |
1724 NAMED_SUPER_PROPERTY, | 1684 NAMED_SUPER_PROPERTY, |
1725 KEYED_SUPER_PROPERTY | 1685 KEYED_SUPER_PROPERTY |
1726 }; | 1686 }; |
1727 | 1687 |
1728 | 1688 |
1729 class Property final : public Expression { | 1689 class Property final : public Expression { |
1730 public: | 1690 public: |
1731 DECLARE_NODE_TYPE(Property) | |
1732 | |
1733 bool IsValidReferenceExpression() const { return true; } | 1691 bool IsValidReferenceExpression() const { return true; } |
1734 | 1692 |
1735 Expression* obj() const { return obj_; } | 1693 Expression* obj() const { return obj_; } |
1736 Expression* key() const { return key_; } | 1694 Expression* key() const { return key_; } |
1737 | 1695 |
1738 void set_obj(Expression* e) { obj_ = e; } | 1696 void set_obj(Expression* e) { obj_ = e; } |
1739 void set_key(Expression* e) { key_ = e; } | 1697 void set_key(Expression* e) { key_ = e; } |
1740 | 1698 |
1741 static int num_ids() { return parent_num_ids() + 1; } | 1699 static int num_ids() { return parent_num_ids() + 1; } |
1742 BailoutId LoadId() const { return BailoutId(local_id(0)); } | 1700 BailoutId LoadId() const { return BailoutId(local_id(0)); } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1788 } | 1746 } |
1789 | 1747 |
1790 static LhsKind GetAssignType(Property* property) { | 1748 static LhsKind GetAssignType(Property* property) { |
1791 if (property == NULL) return VARIABLE; | 1749 if (property == NULL) return VARIABLE; |
1792 bool super_access = property->IsSuperAccess(); | 1750 bool super_access = property->IsSuperAccess(); |
1793 return (property->key()->IsPropertyName()) | 1751 return (property->key()->IsPropertyName()) |
1794 ? (super_access ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY) | 1752 ? (super_access ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY) |
1795 : (super_access ? KEYED_SUPER_PROPERTY : KEYED_PROPERTY); | 1753 : (super_access ? KEYED_SUPER_PROPERTY : KEYED_PROPERTY); |
1796 } | 1754 } |
1797 | 1755 |
1798 protected: | 1756 private: |
| 1757 friend class AstNodeFactory; |
| 1758 |
1799 Property(Zone* zone, Expression* obj, Expression* key, int pos) | 1759 Property(Zone* zone, Expression* obj, Expression* key, int pos) |
1800 : Expression(zone, pos, kProperty), | 1760 : Expression(zone, pos, kProperty), |
1801 bit_field_(IsForCallField::encode(false) | | 1761 bit_field_(IsForCallField::encode(false) | |
1802 IsStringAccessField::encode(false) | | 1762 IsStringAccessField::encode(false) | |
1803 InlineCacheStateField::encode(UNINITIALIZED)), | 1763 InlineCacheStateField::encode(UNINITIALIZED)), |
1804 obj_(obj), | 1764 obj_(obj), |
1805 key_(key) {} | 1765 key_(key) {} |
| 1766 |
1806 static int parent_num_ids() { return Expression::num_ids(); } | 1767 static int parent_num_ids() { return Expression::num_ids(); } |
1807 | |
1808 private: | |
1809 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1768 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
1810 | 1769 |
1811 class IsForCallField : public BitField8<bool, 0, 1> {}; | 1770 class IsForCallField : public BitField8<bool, 0, 1> {}; |
1812 class IsStringAccessField : public BitField8<bool, 1, 1> {}; | 1771 class IsStringAccessField : public BitField8<bool, 1, 1> {}; |
1813 class KeyTypeField : public BitField8<IcCheckType, 2, 1> {}; | 1772 class KeyTypeField : public BitField8<IcCheckType, 2, 1> {}; |
1814 class InlineCacheStateField : public BitField8<InlineCacheState, 3, 4> {}; | 1773 class InlineCacheStateField : public BitField8<InlineCacheState, 3, 4> {}; |
| 1774 |
1815 uint8_t bit_field_; | 1775 uint8_t bit_field_; |
1816 FeedbackVectorSlot property_feedback_slot_; | 1776 FeedbackVectorSlot property_feedback_slot_; |
1817 Expression* obj_; | 1777 Expression* obj_; |
1818 Expression* key_; | 1778 Expression* key_; |
1819 SmallMapList receiver_types_; | 1779 SmallMapList receiver_types_; |
1820 }; | 1780 }; |
1821 | 1781 |
1822 | 1782 |
1823 class Call final : public Expression { | 1783 class Call final : public Expression { |
1824 public: | 1784 public: |
1825 DECLARE_NODE_TYPE(Call) | |
1826 | |
1827 Expression* expression() const { return expression_; } | 1785 Expression* expression() const { return expression_; } |
1828 ZoneList<Expression*>* arguments() const { return arguments_; } | 1786 ZoneList<Expression*>* arguments() const { return arguments_; } |
1829 | 1787 |
1830 void set_expression(Expression* e) { expression_ = e; } | 1788 void set_expression(Expression* e) { expression_ = e; } |
1831 | 1789 |
1832 // Type feedback information. | 1790 // Type feedback information. |
1833 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 1791 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
1834 FeedbackVectorSlotCache* cache); | 1792 FeedbackVectorSlotCache* cache); |
1835 | 1793 |
1836 FeedbackVectorSlot CallFeedbackSlot() const { return stub_slot_; } | 1794 FeedbackVectorSlot CallFeedbackSlot() const { return stub_slot_; } |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1907 // Helpers to determine how to handle the call. | 1865 // Helpers to determine how to handle the call. |
1908 CallType GetCallType(Isolate* isolate) const; | 1866 CallType GetCallType(Isolate* isolate) const; |
1909 bool IsUsingCallFeedbackSlot(Isolate* isolate) const; | 1867 bool IsUsingCallFeedbackSlot(Isolate* isolate) const; |
1910 bool IsUsingCallFeedbackICSlot(Isolate* isolate) const; | 1868 bool IsUsingCallFeedbackICSlot(Isolate* isolate) const; |
1911 | 1869 |
1912 #ifdef DEBUG | 1870 #ifdef DEBUG |
1913 // Used to assert that the FullCodeGenerator records the return site. | 1871 // Used to assert that the FullCodeGenerator records the return site. |
1914 bool return_is_recorded_; | 1872 bool return_is_recorded_; |
1915 #endif | 1873 #endif |
1916 | 1874 |
1917 protected: | 1875 private: |
| 1876 friend class AstNodeFactory; |
| 1877 |
1918 Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, | 1878 Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, |
1919 int pos) | 1879 int pos) |
1920 : Expression(zone, pos, kCall), | 1880 : Expression(zone, pos, kCall), |
1921 bit_field_(IsUninitializedField::encode(false)), | 1881 bit_field_(IsUninitializedField::encode(false)), |
1922 expression_(expression), | 1882 expression_(expression), |
1923 arguments_(arguments) { | 1883 arguments_(arguments) { |
1924 if (expression->IsProperty()) { | 1884 if (expression->IsProperty()) { |
1925 expression->AsProperty()->mark_for_call(); | 1885 expression->AsProperty()->mark_for_call(); |
1926 } | 1886 } |
1927 } | 1887 } |
| 1888 |
1928 static int parent_num_ids() { return Expression::num_ids(); } | 1889 static int parent_num_ids() { return Expression::num_ids(); } |
1929 | |
1930 private: | |
1931 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1890 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
1932 | 1891 |
1933 class IsUninitializedField : public BitField8<bool, 0, 1> {}; | 1892 class IsUninitializedField : public BitField8<bool, 0, 1> {}; |
1934 class IsTailField : public BitField8<bool, 1, 1> {}; | 1893 class IsTailField : public BitField8<bool, 1, 1> {}; |
| 1894 |
1935 uint8_t bit_field_; | 1895 uint8_t bit_field_; |
1936 FeedbackVectorSlot ic_slot_; | 1896 FeedbackVectorSlot ic_slot_; |
1937 FeedbackVectorSlot stub_slot_; | 1897 FeedbackVectorSlot stub_slot_; |
1938 Expression* expression_; | 1898 Expression* expression_; |
1939 ZoneList<Expression*>* arguments_; | 1899 ZoneList<Expression*>* arguments_; |
1940 Handle<JSFunction> target_; | 1900 Handle<JSFunction> target_; |
1941 Handle<AllocationSite> allocation_site_; | 1901 Handle<AllocationSite> allocation_site_; |
1942 }; | 1902 }; |
1943 | 1903 |
1944 | 1904 |
1945 class CallNew final : public Expression { | 1905 class CallNew final : public Expression { |
1946 public: | 1906 public: |
1947 DECLARE_NODE_TYPE(CallNew) | |
1948 | |
1949 Expression* expression() const { return expression_; } | 1907 Expression* expression() const { return expression_; } |
1950 ZoneList<Expression*>* arguments() const { return arguments_; } | 1908 ZoneList<Expression*>* arguments() const { return arguments_; } |
1951 | 1909 |
1952 void set_expression(Expression* e) { expression_ = e; } | 1910 void set_expression(Expression* e) { expression_ = e; } |
1953 | 1911 |
1954 // Type feedback information. | 1912 // Type feedback information. |
1955 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 1913 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
1956 FeedbackVectorSlotCache* cache) { | 1914 FeedbackVectorSlotCache* cache) { |
1957 callnew_feedback_slot_ = spec->AddGeneralSlot(); | 1915 callnew_feedback_slot_ = spec->AddGeneralSlot(); |
1958 // Construct calls have two slots, one right after the other. | 1916 // Construct calls have two slots, one right after the other. |
(...skipping 19 matching lines...) Expand all Loading... |
1978 void set_allocation_site(Handle<AllocationSite> site) { | 1936 void set_allocation_site(Handle<AllocationSite> site) { |
1979 allocation_site_ = site; | 1937 allocation_site_ = site; |
1980 } | 1938 } |
1981 void set_is_monomorphic(bool monomorphic) { is_monomorphic_ = monomorphic; } | 1939 void set_is_monomorphic(bool monomorphic) { is_monomorphic_ = monomorphic; } |
1982 void set_target(Handle<JSFunction> target) { target_ = target; } | 1940 void set_target(Handle<JSFunction> target) { target_ = target; } |
1983 void SetKnownGlobalTarget(Handle<JSFunction> target) { | 1941 void SetKnownGlobalTarget(Handle<JSFunction> target) { |
1984 target_ = target; | 1942 target_ = target; |
1985 is_monomorphic_ = true; | 1943 is_monomorphic_ = true; |
1986 } | 1944 } |
1987 | 1945 |
1988 protected: | 1946 private: |
| 1947 friend class AstNodeFactory; |
| 1948 |
1989 CallNew(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, | 1949 CallNew(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, |
1990 int pos) | 1950 int pos) |
1991 : Expression(zone, pos, kCallNew), | 1951 : Expression(zone, pos, kCallNew), |
1992 is_monomorphic_(false), | 1952 is_monomorphic_(false), |
1993 expression_(expression), | 1953 expression_(expression), |
1994 arguments_(arguments) {} | 1954 arguments_(arguments) {} |
1995 | 1955 |
1996 static int parent_num_ids() { return Expression::num_ids(); } | 1956 static int parent_num_ids() { return Expression::num_ids(); } |
1997 | |
1998 private: | |
1999 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1957 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
2000 | 1958 |
2001 bool is_monomorphic_; | 1959 bool is_monomorphic_; |
2002 FeedbackVectorSlot callnew_feedback_slot_; | 1960 FeedbackVectorSlot callnew_feedback_slot_; |
2003 Expression* expression_; | 1961 Expression* expression_; |
2004 ZoneList<Expression*>* arguments_; | 1962 ZoneList<Expression*>* arguments_; |
2005 Handle<JSFunction> target_; | 1963 Handle<JSFunction> target_; |
2006 Handle<AllocationSite> allocation_site_; | 1964 Handle<AllocationSite> allocation_site_; |
2007 }; | 1965 }; |
2008 | 1966 |
2009 | 1967 |
2010 // The CallRuntime class does not represent any official JavaScript | 1968 // The CallRuntime class does not represent any official JavaScript |
2011 // language construct. Instead it is used to call a C or JS function | 1969 // language construct. Instead it is used to call a C or JS function |
2012 // with a set of arguments. This is used from the builtins that are | 1970 // with a set of arguments. This is used from the builtins that are |
2013 // implemented in JavaScript (see "v8natives.js"). | 1971 // implemented in JavaScript (see "v8natives.js"). |
2014 class CallRuntime final : public Expression { | 1972 class CallRuntime final : public Expression { |
2015 public: | 1973 public: |
2016 DECLARE_NODE_TYPE(CallRuntime) | |
2017 | |
2018 ZoneList<Expression*>* arguments() const { return arguments_; } | 1974 ZoneList<Expression*>* arguments() const { return arguments_; } |
2019 bool is_jsruntime() const { return function_ == NULL; } | 1975 bool is_jsruntime() const { return function_ == NULL; } |
2020 | 1976 |
2021 int context_index() const { | 1977 int context_index() const { |
2022 DCHECK(is_jsruntime()); | 1978 DCHECK(is_jsruntime()); |
2023 return context_index_; | 1979 return context_index_; |
2024 } | 1980 } |
2025 const Runtime::Function* function() const { | 1981 const Runtime::Function* function() const { |
2026 DCHECK(!is_jsruntime()); | 1982 DCHECK(!is_jsruntime()); |
2027 return function_; | 1983 return function_; |
2028 } | 1984 } |
2029 | 1985 |
2030 static int num_ids() { return parent_num_ids() + 1; } | 1986 static int num_ids() { return parent_num_ids() + 1; } |
2031 BailoutId CallId() { return BailoutId(local_id(0)); } | 1987 BailoutId CallId() { return BailoutId(local_id(0)); } |
2032 | 1988 |
2033 const char* debug_name() { | 1989 const char* debug_name() { |
2034 return is_jsruntime() ? "(context function)" : function_->name; | 1990 return is_jsruntime() ? "(context function)" : function_->name; |
2035 } | 1991 } |
2036 | 1992 |
2037 protected: | 1993 private: |
| 1994 friend class AstNodeFactory; |
| 1995 |
2038 CallRuntime(Zone* zone, const Runtime::Function* function, | 1996 CallRuntime(Zone* zone, const Runtime::Function* function, |
2039 ZoneList<Expression*>* arguments, int pos) | 1997 ZoneList<Expression*>* arguments, int pos) |
2040 : Expression(zone, pos, kCallRuntime), | 1998 : Expression(zone, pos, kCallRuntime), |
2041 function_(function), | 1999 function_(function), |
2042 arguments_(arguments) {} | 2000 arguments_(arguments) {} |
2043 | |
2044 CallRuntime(Zone* zone, int context_index, ZoneList<Expression*>* arguments, | 2001 CallRuntime(Zone* zone, int context_index, ZoneList<Expression*>* arguments, |
2045 int pos) | 2002 int pos) |
2046 : Expression(zone, pos, kCallRuntime), | 2003 : Expression(zone, pos, kCallRuntime), |
2047 context_index_(context_index), | 2004 context_index_(context_index), |
2048 function_(NULL), | 2005 function_(NULL), |
2049 arguments_(arguments) {} | 2006 arguments_(arguments) {} |
2050 | 2007 |
2051 static int parent_num_ids() { return Expression::num_ids(); } | 2008 static int parent_num_ids() { return Expression::num_ids(); } |
2052 | |
2053 private: | |
2054 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2009 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
2055 | 2010 |
2056 int context_index_; | 2011 int context_index_; |
2057 const Runtime::Function* function_; | 2012 const Runtime::Function* function_; |
2058 ZoneList<Expression*>* arguments_; | 2013 ZoneList<Expression*>* arguments_; |
2059 }; | 2014 }; |
2060 | 2015 |
2061 | 2016 |
2062 class UnaryOperation final : public Expression { | 2017 class UnaryOperation final : public Expression { |
2063 public: | 2018 public: |
2064 DECLARE_NODE_TYPE(UnaryOperation) | |
2065 | |
2066 Token::Value op() const { return op_; } | 2019 Token::Value op() const { return op_; } |
2067 Expression* expression() const { return expression_; } | 2020 Expression* expression() const { return expression_; } |
2068 void set_expression(Expression* e) { expression_ = e; } | 2021 void set_expression(Expression* e) { expression_ = e; } |
2069 | 2022 |
2070 // For unary not (Token::NOT), the AST ids where true and false will | 2023 // For unary not (Token::NOT), the AST ids where true and false will |
2071 // actually be materialized, respectively. | 2024 // actually be materialized, respectively. |
2072 static int num_ids() { return parent_num_ids() + 2; } | 2025 static int num_ids() { return parent_num_ids() + 2; } |
2073 BailoutId MaterializeTrueId() const { return BailoutId(local_id(0)); } | 2026 BailoutId MaterializeTrueId() const { return BailoutId(local_id(0)); } |
2074 BailoutId MaterializeFalseId() const { return BailoutId(local_id(1)); } | 2027 BailoutId MaterializeFalseId() const { return BailoutId(local_id(1)); } |
2075 | 2028 |
2076 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); | 2029 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); |
2077 | 2030 |
2078 protected: | 2031 private: |
| 2032 friend class AstNodeFactory; |
| 2033 |
2079 UnaryOperation(Zone* zone, Token::Value op, Expression* expression, int pos) | 2034 UnaryOperation(Zone* zone, Token::Value op, Expression* expression, int pos) |
2080 : Expression(zone, pos, kUnaryOperation), | 2035 : Expression(zone, pos, kUnaryOperation), |
2081 op_(op), | 2036 op_(op), |
2082 expression_(expression) { | 2037 expression_(expression) { |
2083 DCHECK(Token::IsUnaryOp(op)); | 2038 DCHECK(Token::IsUnaryOp(op)); |
2084 } | 2039 } |
| 2040 |
2085 static int parent_num_ids() { return Expression::num_ids(); } | 2041 static int parent_num_ids() { return Expression::num_ids(); } |
2086 | |
2087 private: | |
2088 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2042 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
2089 | 2043 |
2090 Token::Value op_; | 2044 Token::Value op_; |
2091 Expression* expression_; | 2045 Expression* expression_; |
2092 }; | 2046 }; |
2093 | 2047 |
2094 | 2048 |
2095 class BinaryOperation final : public Expression { | 2049 class BinaryOperation final : public Expression { |
2096 public: | 2050 public: |
2097 DECLARE_NODE_TYPE(BinaryOperation) | |
2098 | |
2099 Token::Value op() const { return static_cast<Token::Value>(op_); } | 2051 Token::Value op() const { return static_cast<Token::Value>(op_); } |
2100 Expression* left() const { return left_; } | 2052 Expression* left() const { return left_; } |
2101 void set_left(Expression* e) { left_ = e; } | 2053 void set_left(Expression* e) { left_ = e; } |
2102 Expression* right() const { return right_; } | 2054 Expression* right() const { return right_; } |
2103 void set_right(Expression* e) { right_ = e; } | 2055 void set_right(Expression* e) { right_ = e; } |
2104 Handle<AllocationSite> allocation_site() const { return allocation_site_; } | 2056 Handle<AllocationSite> allocation_site() const { return allocation_site_; } |
2105 void set_allocation_site(Handle<AllocationSite> allocation_site) { | 2057 void set_allocation_site(Handle<AllocationSite> allocation_site) { |
2106 allocation_site_ = allocation_site; | 2058 allocation_site_ = allocation_site; |
2107 } | 2059 } |
2108 | 2060 |
(...skipping 29 matching lines...) Expand all Loading... |
2138 Maybe<int> fixed_right_arg() const { | 2090 Maybe<int> fixed_right_arg() const { |
2139 return has_fixed_right_arg_ ? Just(fixed_right_arg_value_) : Nothing<int>(); | 2091 return has_fixed_right_arg_ ? Just(fixed_right_arg_value_) : Nothing<int>(); |
2140 } | 2092 } |
2141 void set_fixed_right_arg(Maybe<int> arg) { | 2093 void set_fixed_right_arg(Maybe<int> arg) { |
2142 has_fixed_right_arg_ = arg.IsJust(); | 2094 has_fixed_right_arg_ = arg.IsJust(); |
2143 if (arg.IsJust()) fixed_right_arg_value_ = arg.FromJust(); | 2095 if (arg.IsJust()) fixed_right_arg_value_ = arg.FromJust(); |
2144 } | 2096 } |
2145 | 2097 |
2146 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); | 2098 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); |
2147 | 2099 |
2148 protected: | 2100 private: |
| 2101 friend class AstNodeFactory; |
| 2102 |
2149 BinaryOperation(Zone* zone, Token::Value op, Expression* left, | 2103 BinaryOperation(Zone* zone, Token::Value op, Expression* left, |
2150 Expression* right, int pos) | 2104 Expression* right, int pos) |
2151 : Expression(zone, pos, kBinaryOperation), | 2105 : Expression(zone, pos, kBinaryOperation), |
2152 op_(static_cast<byte>(op)), | 2106 op_(static_cast<byte>(op)), |
2153 has_fixed_right_arg_(false), | 2107 has_fixed_right_arg_(false), |
2154 fixed_right_arg_value_(0), | 2108 fixed_right_arg_value_(0), |
2155 left_(left), | 2109 left_(left), |
2156 right_(right) { | 2110 right_(right) { |
2157 DCHECK(Token::IsBinaryOp(op)); | 2111 DCHECK(Token::IsBinaryOp(op)); |
2158 } | 2112 } |
| 2113 |
2159 static int parent_num_ids() { return Expression::num_ids(); } | 2114 static int parent_num_ids() { return Expression::num_ids(); } |
2160 | |
2161 private: | |
2162 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2115 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
2163 | 2116 |
2164 const byte op_; // actually Token::Value | 2117 const byte op_; // actually Token::Value |
2165 // TODO(rossberg): the fixed arg should probably be represented as a Constant | 2118 // TODO(rossberg): the fixed arg should probably be represented as a Constant |
2166 // type for the RHS. Currenty it's actually a Maybe<int> | 2119 // type for the RHS. Currenty it's actually a Maybe<int> |
2167 bool has_fixed_right_arg_; | 2120 bool has_fixed_right_arg_; |
2168 int fixed_right_arg_value_; | 2121 int fixed_right_arg_value_; |
2169 Expression* left_; | 2122 Expression* left_; |
2170 Expression* right_; | 2123 Expression* right_; |
2171 Handle<AllocationSite> allocation_site_; | 2124 Handle<AllocationSite> allocation_site_; |
2172 FeedbackVectorSlot type_feedback_slot_; | 2125 FeedbackVectorSlot type_feedback_slot_; |
2173 }; | 2126 }; |
2174 | 2127 |
2175 | 2128 |
2176 class CountOperation final : public Expression { | 2129 class CountOperation final : public Expression { |
2177 public: | 2130 public: |
2178 DECLARE_NODE_TYPE(CountOperation) | |
2179 | |
2180 bool is_prefix() const { return IsPrefixField::decode(bit_field_); } | 2131 bool is_prefix() const { return IsPrefixField::decode(bit_field_); } |
2181 bool is_postfix() const { return !is_prefix(); } | 2132 bool is_postfix() const { return !is_prefix(); } |
2182 | 2133 |
2183 Token::Value op() const { return TokenField::decode(bit_field_); } | 2134 Token::Value op() const { return TokenField::decode(bit_field_); } |
2184 Token::Value binary_op() { | 2135 Token::Value binary_op() { |
2185 return (op() == Token::INC) ? Token::ADD : Token::SUB; | 2136 return (op() == Token::INC) ? Token::ADD : Token::SUB; |
2186 } | 2137 } |
2187 | 2138 |
2188 Expression* expression() const { return expression_; } | 2139 Expression* expression() const { return expression_; } |
2189 void set_expression(Expression* e) { expression_ = e; } | 2140 void set_expression(Expression* e) { expression_ = e; } |
(...skipping 25 matching lines...) Expand all Loading... |
2215 | 2166 |
2216 // Feedback slot for binary operation is only used by ignition. | 2167 // Feedback slot for binary operation is only used by ignition. |
2217 FeedbackVectorSlot CountBinaryOpFeedbackSlot() const { | 2168 FeedbackVectorSlot CountBinaryOpFeedbackSlot() const { |
2218 return binary_operation_slot_; | 2169 return binary_operation_slot_; |
2219 } | 2170 } |
2220 | 2171 |
2221 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 2172 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
2222 FeedbackVectorSlotCache* cache); | 2173 FeedbackVectorSlotCache* cache); |
2223 FeedbackVectorSlot CountSlot() const { return slot_; } | 2174 FeedbackVectorSlot CountSlot() const { return slot_; } |
2224 | 2175 |
2225 protected: | 2176 private: |
| 2177 friend class AstNodeFactory; |
| 2178 |
2226 CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr, | 2179 CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr, |
2227 int pos) | 2180 int pos) |
2228 : Expression(zone, pos, kCountOperation), | 2181 : Expression(zone, pos, kCountOperation), |
2229 bit_field_( | 2182 bit_field_( |
2230 IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) | | 2183 IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) | |
2231 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)), | 2184 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)), |
2232 type_(NULL), | 2185 type_(NULL), |
2233 expression_(expr) {} | 2186 expression_(expr) {} |
| 2187 |
2234 static int parent_num_ids() { return Expression::num_ids(); } | 2188 static int parent_num_ids() { return Expression::num_ids(); } |
2235 | |
2236 private: | |
2237 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2189 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
2238 | 2190 |
2239 class IsPrefixField : public BitField16<bool, 0, 1> {}; | 2191 class IsPrefixField : public BitField16<bool, 0, 1> {}; |
2240 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {}; | 2192 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {}; |
2241 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 3> {}; | 2193 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 3> {}; |
2242 class TokenField : public BitField16<Token::Value, 5, 8> {}; | 2194 class TokenField : public BitField16<Token::Value, 5, 8> {}; |
2243 | 2195 |
2244 // Starts with 16-bit field, which should get packed together with | 2196 // Starts with 16-bit field, which should get packed together with |
2245 // Expression's trailing 16-bit field. | 2197 // Expression's trailing 16-bit field. |
2246 uint16_t bit_field_; | 2198 uint16_t bit_field_; |
2247 FeedbackVectorSlot slot_; | 2199 FeedbackVectorSlot slot_; |
2248 FeedbackVectorSlot binary_operation_slot_; | 2200 FeedbackVectorSlot binary_operation_slot_; |
2249 Type* type_; | 2201 Type* type_; |
2250 Expression* expression_; | 2202 Expression* expression_; |
2251 SmallMapList receiver_types_; | 2203 SmallMapList receiver_types_; |
2252 }; | 2204 }; |
2253 | 2205 |
2254 | 2206 |
2255 class CompareOperation final : public Expression { | 2207 class CompareOperation final : public Expression { |
2256 public: | 2208 public: |
2257 DECLARE_NODE_TYPE(CompareOperation) | |
2258 | |
2259 Token::Value op() const { return op_; } | 2209 Token::Value op() const { return op_; } |
2260 Expression* left() const { return left_; } | 2210 Expression* left() const { return left_; } |
2261 Expression* right() const { return right_; } | 2211 Expression* right() const { return right_; } |
2262 | 2212 |
2263 void set_left(Expression* e) { left_ = e; } | 2213 void set_left(Expression* e) { left_ = e; } |
2264 void set_right(Expression* e) { right_ = e; } | 2214 void set_right(Expression* e) { right_ = e; } |
2265 | 2215 |
2266 // Type feedback information. | 2216 // Type feedback information. |
2267 static int num_ids() { return parent_num_ids() + 1; } | 2217 static int num_ids() { return parent_num_ids() + 1; } |
2268 TypeFeedbackId CompareOperationFeedbackId() const { | 2218 TypeFeedbackId CompareOperationFeedbackId() const { |
2269 return TypeFeedbackId(local_id(0)); | 2219 return TypeFeedbackId(local_id(0)); |
2270 } | 2220 } |
2271 Type* combined_type() const { return combined_type_; } | 2221 Type* combined_type() const { return combined_type_; } |
2272 void set_combined_type(Type* type) { combined_type_ = type; } | 2222 void set_combined_type(Type* type) { combined_type_ = type; } |
2273 | 2223 |
2274 // Match special cases. | 2224 // Match special cases. |
2275 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check); | 2225 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check); |
2276 bool IsLiteralCompareUndefined(Expression** expr); | 2226 bool IsLiteralCompareUndefined(Expression** expr); |
2277 bool IsLiteralCompareNull(Expression** expr); | 2227 bool IsLiteralCompareNull(Expression** expr); |
2278 | 2228 |
2279 protected: | 2229 private: |
| 2230 friend class AstNodeFactory; |
| 2231 |
2280 CompareOperation(Zone* zone, Token::Value op, Expression* left, | 2232 CompareOperation(Zone* zone, Token::Value op, Expression* left, |
2281 Expression* right, int pos) | 2233 Expression* right, int pos) |
2282 : Expression(zone, pos, kCompareOperation), | 2234 : Expression(zone, pos, kCompareOperation), |
2283 op_(op), | 2235 op_(op), |
2284 left_(left), | 2236 left_(left), |
2285 right_(right), | 2237 right_(right), |
2286 combined_type_(Type::None()) { | 2238 combined_type_(Type::None()) { |
2287 DCHECK(Token::IsCompareOp(op)); | 2239 DCHECK(Token::IsCompareOp(op)); |
2288 } | 2240 } |
| 2241 |
2289 static int parent_num_ids() { return Expression::num_ids(); } | 2242 static int parent_num_ids() { return Expression::num_ids(); } |
2290 | |
2291 private: | |
2292 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2243 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
2293 | 2244 |
2294 Token::Value op_; | 2245 Token::Value op_; |
2295 Expression* left_; | 2246 Expression* left_; |
2296 Expression* right_; | 2247 Expression* right_; |
2297 | 2248 |
2298 Type* combined_type_; | 2249 Type* combined_type_; |
2299 }; | 2250 }; |
2300 | 2251 |
2301 | 2252 |
2302 class Spread final : public Expression { | 2253 class Spread final : public Expression { |
2303 public: | 2254 public: |
2304 DECLARE_NODE_TYPE(Spread) | |
2305 | |
2306 Expression* expression() const { return expression_; } | 2255 Expression* expression() const { return expression_; } |
2307 void set_expression(Expression* e) { expression_ = e; } | 2256 void set_expression(Expression* e) { expression_ = e; } |
2308 | 2257 |
2309 int expression_position() const { return expr_pos_; } | 2258 int expression_position() const { return expr_pos_; } |
2310 | 2259 |
2311 static int num_ids() { return parent_num_ids(); } | 2260 static int num_ids() { return parent_num_ids(); } |
2312 | 2261 |
2313 protected: | 2262 private: |
| 2263 friend class AstNodeFactory; |
| 2264 |
2314 Spread(Zone* zone, Expression* expression, int pos, int expr_pos) | 2265 Spread(Zone* zone, Expression* expression, int pos, int expr_pos) |
2315 : Expression(zone, pos, kSpread), | 2266 : Expression(zone, pos, kSpread), |
2316 expr_pos_(expr_pos), | 2267 expr_pos_(expr_pos), |
2317 expression_(expression) {} | 2268 expression_(expression) {} |
| 2269 |
2318 static int parent_num_ids() { return Expression::num_ids(); } | 2270 static int parent_num_ids() { return Expression::num_ids(); } |
2319 | |
2320 private: | |
2321 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2271 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
2322 | 2272 |
2323 int expr_pos_; | 2273 int expr_pos_; |
2324 Expression* expression_; | 2274 Expression* expression_; |
2325 }; | 2275 }; |
2326 | 2276 |
2327 | 2277 |
2328 class Conditional final : public Expression { | 2278 class Conditional final : public Expression { |
2329 public: | 2279 public: |
2330 DECLARE_NODE_TYPE(Conditional) | |
2331 | |
2332 Expression* condition() const { return condition_; } | 2280 Expression* condition() const { return condition_; } |
2333 Expression* then_expression() const { return then_expression_; } | 2281 Expression* then_expression() const { return then_expression_; } |
2334 Expression* else_expression() const { return else_expression_; } | 2282 Expression* else_expression() const { return else_expression_; } |
2335 | 2283 |
2336 void set_condition(Expression* e) { condition_ = e; } | 2284 void set_condition(Expression* e) { condition_ = e; } |
2337 void set_then_expression(Expression* e) { then_expression_ = e; } | 2285 void set_then_expression(Expression* e) { then_expression_ = e; } |
2338 void set_else_expression(Expression* e) { else_expression_ = e; } | 2286 void set_else_expression(Expression* e) { else_expression_ = e; } |
2339 | 2287 |
2340 void MarkTail() { | 2288 void MarkTail() { |
2341 then_expression_->MarkTail(); | 2289 then_expression_->MarkTail(); |
2342 else_expression_->MarkTail(); | 2290 else_expression_->MarkTail(); |
2343 } | 2291 } |
2344 | 2292 |
2345 static int num_ids() { return parent_num_ids() + 2; } | 2293 static int num_ids() { return parent_num_ids() + 2; } |
2346 BailoutId ThenId() const { return BailoutId(local_id(0)); } | 2294 BailoutId ThenId() const { return BailoutId(local_id(0)); } |
2347 BailoutId ElseId() const { return BailoutId(local_id(1)); } | 2295 BailoutId ElseId() const { return BailoutId(local_id(1)); } |
2348 | 2296 |
2349 protected: | 2297 private: |
| 2298 friend class AstNodeFactory; |
| 2299 |
2350 Conditional(Zone* zone, Expression* condition, Expression* then_expression, | 2300 Conditional(Zone* zone, Expression* condition, Expression* then_expression, |
2351 Expression* else_expression, int position) | 2301 Expression* else_expression, int position) |
2352 : Expression(zone, position, kConditional), | 2302 : Expression(zone, position, kConditional), |
2353 condition_(condition), | 2303 condition_(condition), |
2354 then_expression_(then_expression), | 2304 then_expression_(then_expression), |
2355 else_expression_(else_expression) {} | 2305 else_expression_(else_expression) {} |
| 2306 |
2356 static int parent_num_ids() { return Expression::num_ids(); } | 2307 static int parent_num_ids() { return Expression::num_ids(); } |
2357 | |
2358 private: | |
2359 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2308 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
2360 | 2309 |
2361 Expression* condition_; | 2310 Expression* condition_; |
2362 Expression* then_expression_; | 2311 Expression* then_expression_; |
2363 Expression* else_expression_; | 2312 Expression* else_expression_; |
2364 }; | 2313 }; |
2365 | 2314 |
2366 | 2315 |
2367 class Assignment final : public Expression { | 2316 class Assignment final : public Expression { |
2368 public: | 2317 public: |
2369 DECLARE_NODE_TYPE(Assignment) | |
2370 | |
2371 Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; } | 2318 Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; } |
2372 | 2319 |
2373 Token::Value binary_op() const; | 2320 Token::Value binary_op() const; |
2374 | 2321 |
2375 Token::Value op() const { return TokenField::decode(bit_field_); } | 2322 Token::Value op() const { return TokenField::decode(bit_field_); } |
2376 Expression* target() const { return target_; } | 2323 Expression* target() const { return target_; } |
2377 Expression* value() const { return value_; } | 2324 Expression* value() const { return value_; } |
2378 | 2325 |
2379 void set_target(Expression* e) { target_ = e; } | 2326 void set_target(Expression* e) { target_ = e; } |
2380 void set_value(Expression* e) { value_ = e; } | 2327 void set_value(Expression* e) { value_ = e; } |
(...skipping 27 matching lines...) Expand all Loading... |
2408 bit_field_ = KeyTypeField::update(bit_field_, key_type); | 2355 bit_field_ = KeyTypeField::update(bit_field_, key_type); |
2409 } | 2356 } |
2410 void set_store_mode(KeyedAccessStoreMode mode) { | 2357 void set_store_mode(KeyedAccessStoreMode mode) { |
2411 bit_field_ = StoreModeField::update(bit_field_, mode); | 2358 bit_field_ = StoreModeField::update(bit_field_, mode); |
2412 } | 2359 } |
2413 | 2360 |
2414 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 2361 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
2415 FeedbackVectorSlotCache* cache); | 2362 FeedbackVectorSlotCache* cache); |
2416 FeedbackVectorSlot AssignmentSlot() const { return slot_; } | 2363 FeedbackVectorSlot AssignmentSlot() const { return slot_; } |
2417 | 2364 |
2418 protected: | 2365 private: |
| 2366 friend class AstNodeFactory; |
| 2367 |
2419 Assignment(Zone* zone, Token::Value op, Expression* target, Expression* value, | 2368 Assignment(Zone* zone, Token::Value op, Expression* target, Expression* value, |
2420 int pos); | 2369 int pos); |
| 2370 |
2421 static int parent_num_ids() { return Expression::num_ids(); } | 2371 static int parent_num_ids() { return Expression::num_ids(); } |
2422 | |
2423 private: | |
2424 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2372 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
2425 | 2373 |
2426 class IsUninitializedField : public BitField16<bool, 0, 1> {}; | 2374 class IsUninitializedField : public BitField16<bool, 0, 1> {}; |
2427 class KeyTypeField | 2375 class KeyTypeField |
2428 : public BitField16<IcCheckType, IsUninitializedField::kNext, 1> {}; | 2376 : public BitField16<IcCheckType, IsUninitializedField::kNext, 1> {}; |
2429 class StoreModeField | 2377 class StoreModeField |
2430 : public BitField16<KeyedAccessStoreMode, KeyTypeField::kNext, 3> {}; | 2378 : public BitField16<KeyedAccessStoreMode, KeyTypeField::kNext, 3> {}; |
2431 class TokenField : public BitField16<Token::Value, StoreModeField::kNext, 8> { | 2379 class TokenField : public BitField16<Token::Value, StoreModeField::kNext, 8> { |
2432 }; | 2380 }; |
2433 | 2381 |
(...skipping 16 matching lines...) Expand all Loading... |
2450 // phases, RewritableExpressions are considered as exceptions of AST nodes | 2398 // phases, RewritableExpressions are considered as exceptions of AST nodes |
2451 // in the following sense: | 2399 // in the following sense: |
2452 // | 2400 // |
2453 // 1. IsRewritableExpression and AsRewritableExpression behave as usual. | 2401 // 1. IsRewritableExpression and AsRewritableExpression behave as usual. |
2454 // 2. All other Is* and As* methods are practically delegated to the | 2402 // 2. All other Is* and As* methods are practically delegated to the |
2455 // wrapped node, i.e. IsArrayLiteral() will return true iff the | 2403 // wrapped node, i.e. IsArrayLiteral() will return true iff the |
2456 // wrapped node is an array literal. | 2404 // wrapped node is an array literal. |
2457 // | 2405 // |
2458 // Furthermore, an invariant that should be respected is that the wrapped | 2406 // Furthermore, an invariant that should be respected is that the wrapped |
2459 // node is not a RewritableExpression. | 2407 // node is not a RewritableExpression. |
2460 class RewritableExpression : public Expression { | 2408 class RewritableExpression final : public Expression { |
2461 public: | 2409 public: |
2462 DECLARE_NODE_TYPE(RewritableExpression) | |
2463 | |
2464 Expression* expression() const { return expr_; } | 2410 Expression* expression() const { return expr_; } |
2465 bool is_rewritten() const { return is_rewritten_; } | 2411 bool is_rewritten() const { return is_rewritten_; } |
2466 | 2412 |
2467 void Rewrite(Expression* new_expression) { | 2413 void Rewrite(Expression* new_expression) { |
2468 DCHECK(!is_rewritten()); | 2414 DCHECK(!is_rewritten()); |
2469 DCHECK_NOT_NULL(new_expression); | 2415 DCHECK_NOT_NULL(new_expression); |
2470 DCHECK(!new_expression->IsRewritableExpression()); | 2416 DCHECK(!new_expression->IsRewritableExpression()); |
2471 expr_ = new_expression; | 2417 expr_ = new_expression; |
2472 is_rewritten_ = true; | 2418 is_rewritten_ = true; |
2473 } | 2419 } |
2474 | 2420 |
2475 static int num_ids() { return parent_num_ids(); } | 2421 static int num_ids() { return parent_num_ids(); } |
2476 | 2422 |
2477 protected: | 2423 private: |
| 2424 friend class AstNodeFactory; |
| 2425 |
2478 RewritableExpression(Zone* zone, Expression* expression) | 2426 RewritableExpression(Zone* zone, Expression* expression) |
2479 : Expression(zone, expression->position(), kRewritableExpression), | 2427 : Expression(zone, expression->position(), kRewritableExpression), |
2480 is_rewritten_(false), | 2428 is_rewritten_(false), |
2481 expr_(expression) { | 2429 expr_(expression) { |
2482 DCHECK(!expression->IsRewritableExpression()); | 2430 DCHECK(!expression->IsRewritableExpression()); |
2483 } | 2431 } |
2484 | 2432 |
2485 private: | |
2486 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2433 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
2487 | 2434 |
2488 bool is_rewritten_; | 2435 bool is_rewritten_; |
2489 Expression* expr_; | 2436 Expression* expr_; |
2490 }; | 2437 }; |
2491 | 2438 |
2492 // Our Yield is different from the JS yield in that it "returns" its argument as | 2439 // Our Yield is different from the JS yield in that it "returns" its argument as |
2493 // is, without wrapping it in an iterator result object. Such wrapping, if | 2440 // is, without wrapping it in an iterator result object. Such wrapping, if |
2494 // desired, must be done beforehand (see the parser). | 2441 // desired, must be done beforehand (see the parser). |
2495 class Yield final : public Expression { | 2442 class Yield final : public Expression { |
2496 public: | 2443 public: |
2497 DECLARE_NODE_TYPE(Yield) | |
2498 | |
2499 enum OnException { kOnExceptionThrow, kOnExceptionRethrow }; | 2444 enum OnException { kOnExceptionThrow, kOnExceptionRethrow }; |
2500 | 2445 |
2501 Expression* generator_object() const { return generator_object_; } | 2446 Expression* generator_object() const { return generator_object_; } |
2502 Expression* expression() const { return expression_; } | 2447 Expression* expression() const { return expression_; } |
2503 bool rethrow_on_exception() const { | 2448 bool rethrow_on_exception() const { |
2504 return on_exception_ == kOnExceptionRethrow; | 2449 return on_exception_ == kOnExceptionRethrow; |
2505 } | 2450 } |
2506 int yield_id() const { return yield_id_; } | 2451 int yield_id() const { return yield_id_; } |
2507 | 2452 |
2508 void set_generator_object(Expression* e) { generator_object_ = e; } | 2453 void set_generator_object(Expression* e) { generator_object_ = e; } |
2509 void set_expression(Expression* e) { expression_ = e; } | 2454 void set_expression(Expression* e) { expression_ = e; } |
2510 void set_yield_id(int yield_id) { yield_id_ = yield_id; } | 2455 void set_yield_id(int yield_id) { yield_id_ = yield_id; } |
2511 | 2456 |
2512 protected: | 2457 private: |
| 2458 friend class AstNodeFactory; |
| 2459 |
2513 Yield(Zone* zone, Expression* generator_object, Expression* expression, | 2460 Yield(Zone* zone, Expression* generator_object, Expression* expression, |
2514 int pos, OnException on_exception) | 2461 int pos, OnException on_exception) |
2515 : Expression(zone, pos, kYield), | 2462 : Expression(zone, pos, kYield), |
2516 on_exception_(on_exception), | 2463 on_exception_(on_exception), |
2517 yield_id_(-1), | 2464 yield_id_(-1), |
2518 generator_object_(generator_object), | 2465 generator_object_(generator_object), |
2519 expression_(expression) {} | 2466 expression_(expression) {} |
2520 | 2467 |
2521 private: | |
2522 OnException on_exception_; | 2468 OnException on_exception_; |
2523 int yield_id_; | 2469 int yield_id_; |
2524 Expression* generator_object_; | 2470 Expression* generator_object_; |
2525 Expression* expression_; | 2471 Expression* expression_; |
2526 }; | 2472 }; |
2527 | 2473 |
2528 | 2474 |
2529 class Throw final : public Expression { | 2475 class Throw final : public Expression { |
2530 public: | 2476 public: |
2531 DECLARE_NODE_TYPE(Throw) | |
2532 | |
2533 Expression* exception() const { return exception_; } | 2477 Expression* exception() const { return exception_; } |
2534 void set_exception(Expression* e) { exception_ = e; } | 2478 void set_exception(Expression* e) { exception_ = e; } |
2535 | 2479 |
2536 protected: | 2480 private: |
| 2481 friend class AstNodeFactory; |
| 2482 |
2537 Throw(Zone* zone, Expression* exception, int pos) | 2483 Throw(Zone* zone, Expression* exception, int pos) |
2538 : Expression(zone, pos, kThrow), exception_(exception) {} | 2484 : Expression(zone, pos, kThrow), exception_(exception) {} |
2539 | 2485 |
2540 private: | |
2541 Expression* exception_; | 2486 Expression* exception_; |
2542 }; | 2487 }; |
2543 | 2488 |
2544 | 2489 |
2545 class FunctionLiteral final : public Expression { | 2490 class FunctionLiteral final : public Expression { |
2546 public: | 2491 public: |
2547 enum FunctionType { | 2492 enum FunctionType { |
2548 kAnonymousExpression, | 2493 kAnonymousExpression, |
2549 kNamedExpression, | 2494 kNamedExpression, |
2550 kDeclaration, | 2495 kDeclaration, |
2551 kAccessorOrMethod | 2496 kAccessorOrMethod |
2552 }; | 2497 }; |
2553 | 2498 |
2554 enum ParameterFlag { kNoDuplicateParameters, kHasDuplicateParameters }; | 2499 enum ParameterFlag { kNoDuplicateParameters, kHasDuplicateParameters }; |
2555 | 2500 |
2556 enum EagerCompileHint { kShouldEagerCompile, kShouldLazyCompile }; | 2501 enum EagerCompileHint { kShouldEagerCompile, kShouldLazyCompile }; |
2557 | 2502 |
2558 DECLARE_NODE_TYPE(FunctionLiteral) | |
2559 | |
2560 Handle<String> name() const { return raw_name_->string(); } | 2503 Handle<String> name() const { return raw_name_->string(); } |
2561 const AstString* raw_name() const { return raw_name_; } | 2504 const AstString* raw_name() const { return raw_name_; } |
2562 void set_raw_name(const AstString* name) { raw_name_ = name; } | 2505 void set_raw_name(const AstString* name) { raw_name_ = name; } |
2563 DeclarationScope* scope() const { return scope_; } | 2506 DeclarationScope* scope() const { return scope_; } |
2564 ZoneList<Statement*>* body() const { return body_; } | 2507 ZoneList<Statement*>* body() const { return body_; } |
2565 void set_function_token_position(int pos) { function_token_position_ = pos; } | 2508 void set_function_token_position(int pos) { function_token_position_ = pos; } |
2566 int function_token_position() const { return function_token_position_; } | 2509 int function_token_position() const { return function_token_position_; } |
2567 int start_position() const; | 2510 int start_position() const; |
2568 int end_position() const; | 2511 int end_position() const; |
2569 int SourceSize() const { return end_position() - start_position(); } | 2512 int SourceSize() const { return end_position() - start_position(); } |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2668 dont_optimize_reason_ = reason; | 2611 dont_optimize_reason_ = reason; |
2669 } | 2612 } |
2670 | 2613 |
2671 bool IsAnonymousFunctionDefinition() const { | 2614 bool IsAnonymousFunctionDefinition() const { |
2672 return is_anonymous_expression(); | 2615 return is_anonymous_expression(); |
2673 } | 2616 } |
2674 | 2617 |
2675 int yield_count() { return yield_count_; } | 2618 int yield_count() { return yield_count_; } |
2676 void set_yield_count(int yield_count) { yield_count_ = yield_count; } | 2619 void set_yield_count(int yield_count) { yield_count_ = yield_count; } |
2677 | 2620 |
2678 protected: | 2621 private: |
| 2622 friend class AstNodeFactory; |
| 2623 |
2679 FunctionLiteral(Zone* zone, const AstString* name, | 2624 FunctionLiteral(Zone* zone, const AstString* name, |
2680 AstValueFactory* ast_value_factory, DeclarationScope* scope, | 2625 AstValueFactory* ast_value_factory, DeclarationScope* scope, |
2681 ZoneList<Statement*>* body, int materialized_literal_count, | 2626 ZoneList<Statement*>* body, int materialized_literal_count, |
2682 int expected_property_count, int parameter_count, | 2627 int expected_property_count, int parameter_count, |
2683 FunctionType function_type, | 2628 FunctionType function_type, |
2684 ParameterFlag has_duplicate_parameters, | 2629 ParameterFlag has_duplicate_parameters, |
2685 EagerCompileHint eager_compile_hint, FunctionKind kind, | 2630 EagerCompileHint eager_compile_hint, FunctionKind kind, |
2686 int position, bool is_function) | 2631 int position, bool is_function) |
2687 : Expression(zone, position, kFunctionLiteral), | 2632 : Expression(zone, position, kFunctionLiteral), |
2688 dont_optimize_reason_(kNoReason), | 2633 dont_optimize_reason_(kNoReason), |
(...skipping 10 matching lines...) Expand all Loading... |
2699 bitfield_ = | 2644 bitfield_ = |
2700 FunctionTypeBits::encode(function_type) | Pretenure::encode(false) | | 2645 FunctionTypeBits::encode(function_type) | Pretenure::encode(false) | |
2701 HasDuplicateParameters::encode(has_duplicate_parameters == | 2646 HasDuplicateParameters::encode(has_duplicate_parameters == |
2702 kHasDuplicateParameters) | | 2647 kHasDuplicateParameters) | |
2703 IsFunction::encode(is_function) | | 2648 IsFunction::encode(is_function) | |
2704 ShouldEagerCompile::encode(eager_compile_hint == kShouldEagerCompile) | | 2649 ShouldEagerCompile::encode(eager_compile_hint == kShouldEagerCompile) | |
2705 FunctionKindBits::encode(kind) | ShouldBeUsedOnceHint::encode(false); | 2650 FunctionKindBits::encode(kind) | ShouldBeUsedOnceHint::encode(false); |
2706 DCHECK(IsValidFunctionKind(kind)); | 2651 DCHECK(IsValidFunctionKind(kind)); |
2707 } | 2652 } |
2708 | 2653 |
2709 private: | |
2710 class FunctionTypeBits : public BitField16<FunctionType, 0, 2> {}; | 2654 class FunctionTypeBits : public BitField16<FunctionType, 0, 2> {}; |
2711 class Pretenure : public BitField16<bool, 2, 1> {}; | 2655 class Pretenure : public BitField16<bool, 2, 1> {}; |
2712 class HasDuplicateParameters : public BitField16<bool, 3, 1> {}; | 2656 class HasDuplicateParameters : public BitField16<bool, 3, 1> {}; |
2713 class IsFunction : public BitField16<bool, 4, 1> {}; | 2657 class IsFunction : public BitField16<bool, 4, 1> {}; |
2714 class ShouldEagerCompile : public BitField16<bool, 5, 1> {}; | 2658 class ShouldEagerCompile : public BitField16<bool, 5, 1> {}; |
2715 class ShouldBeUsedOnceHint : public BitField16<bool, 6, 1> {}; | 2659 class ShouldBeUsedOnceHint : public BitField16<bool, 6, 1> {}; |
2716 class FunctionKindBits : public BitField16<FunctionKind, 7, 9> {}; | 2660 class FunctionKindBits : public BitField16<FunctionKind, 7, 9> {}; |
2717 | 2661 |
2718 // Start with 16-bit field, which should get packed together | 2662 // Start with 16-bit field, which should get packed together |
2719 // with Expression's trailing 16-bit field. | 2663 // with Expression's trailing 16-bit field. |
(...skipping 13 matching lines...) Expand all Loading... |
2733 const AstString* raw_inferred_name_; | 2677 const AstString* raw_inferred_name_; |
2734 Handle<String> inferred_name_; | 2678 Handle<String> inferred_name_; |
2735 AstProperties ast_properties_; | 2679 AstProperties ast_properties_; |
2736 }; | 2680 }; |
2737 | 2681 |
2738 | 2682 |
2739 class ClassLiteral final : public Expression { | 2683 class ClassLiteral final : public Expression { |
2740 public: | 2684 public: |
2741 typedef ObjectLiteralProperty Property; | 2685 typedef ObjectLiteralProperty Property; |
2742 | 2686 |
2743 DECLARE_NODE_TYPE(ClassLiteral) | |
2744 | |
2745 VariableProxy* class_variable_proxy() const { return class_variable_proxy_; } | 2687 VariableProxy* class_variable_proxy() const { return class_variable_proxy_; } |
2746 Expression* extends() const { return extends_; } | 2688 Expression* extends() const { return extends_; } |
2747 void set_extends(Expression* e) { extends_ = e; } | 2689 void set_extends(Expression* e) { extends_ = e; } |
2748 FunctionLiteral* constructor() const { return constructor_; } | 2690 FunctionLiteral* constructor() const { return constructor_; } |
2749 void set_constructor(FunctionLiteral* f) { constructor_ = f; } | 2691 void set_constructor(FunctionLiteral* f) { constructor_ = f; } |
2750 ZoneList<Property*>* properties() const { return properties_; } | 2692 ZoneList<Property*>* properties() const { return properties_; } |
2751 int start_position() const { return position(); } | 2693 int start_position() const { return position(); } |
2752 int end_position() const { return end_position_; } | 2694 int end_position() const { return end_position_; } |
2753 | 2695 |
2754 BailoutId CreateLiteralId() const { return BailoutId(local_id(0)); } | 2696 BailoutId CreateLiteralId() const { return BailoutId(local_id(0)); } |
(...skipping 12 matching lines...) Expand all Loading... |
2767 FeedbackVectorSlotCache* cache); | 2709 FeedbackVectorSlotCache* cache); |
2768 | 2710 |
2769 bool NeedsProxySlot() const { | 2711 bool NeedsProxySlot() const { |
2770 return class_variable_proxy() != nullptr && | 2712 return class_variable_proxy() != nullptr && |
2771 class_variable_proxy()->var()->IsUnallocated(); | 2713 class_variable_proxy()->var()->IsUnallocated(); |
2772 } | 2714 } |
2773 | 2715 |
2774 FeedbackVectorSlot PrototypeSlot() const { return prototype_slot_; } | 2716 FeedbackVectorSlot PrototypeSlot() const { return prototype_slot_; } |
2775 FeedbackVectorSlot ProxySlot() const { return proxy_slot_; } | 2717 FeedbackVectorSlot ProxySlot() const { return proxy_slot_; } |
2776 | 2718 |
| 2719 private: |
| 2720 friend class AstNodeFactory; |
2777 | 2721 |
2778 protected: | |
2779 ClassLiteral(Zone* zone, VariableProxy* class_variable_proxy, | 2722 ClassLiteral(Zone* zone, VariableProxy* class_variable_proxy, |
2780 Expression* extends, FunctionLiteral* constructor, | 2723 Expression* extends, FunctionLiteral* constructor, |
2781 ZoneList<Property*>* properties, int start_position, | 2724 ZoneList<Property*>* properties, int start_position, |
2782 int end_position) | 2725 int end_position) |
2783 : Expression(zone, start_position, kClassLiteral), | 2726 : Expression(zone, start_position, kClassLiteral), |
2784 end_position_(end_position), | 2727 end_position_(end_position), |
2785 class_variable_proxy_(class_variable_proxy), | 2728 class_variable_proxy_(class_variable_proxy), |
2786 extends_(extends), | 2729 extends_(extends), |
2787 constructor_(constructor), | 2730 constructor_(constructor), |
2788 properties_(properties) {} | 2731 properties_(properties) {} |
2789 | 2732 |
2790 static int parent_num_ids() { return Expression::num_ids(); } | 2733 static int parent_num_ids() { return Expression::num_ids(); } |
2791 | |
2792 private: | |
2793 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2734 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
2794 | 2735 |
2795 int end_position_; | 2736 int end_position_; |
2796 FeedbackVectorSlot prototype_slot_; | 2737 FeedbackVectorSlot prototype_slot_; |
2797 FeedbackVectorSlot proxy_slot_; | 2738 FeedbackVectorSlot proxy_slot_; |
2798 VariableProxy* class_variable_proxy_; | 2739 VariableProxy* class_variable_proxy_; |
2799 Expression* extends_; | 2740 Expression* extends_; |
2800 FunctionLiteral* constructor_; | 2741 FunctionLiteral* constructor_; |
2801 ZoneList<Property*>* properties_; | 2742 ZoneList<Property*>* properties_; |
2802 }; | 2743 }; |
2803 | 2744 |
2804 | 2745 |
2805 class NativeFunctionLiteral final : public Expression { | 2746 class NativeFunctionLiteral final : public Expression { |
2806 public: | 2747 public: |
2807 DECLARE_NODE_TYPE(NativeFunctionLiteral) | |
2808 | |
2809 Handle<String> name() const { return name_->string(); } | 2748 Handle<String> name() const { return name_->string(); } |
2810 v8::Extension* extension() const { return extension_; } | 2749 v8::Extension* extension() const { return extension_; } |
2811 | 2750 |
2812 protected: | 2751 private: |
| 2752 friend class AstNodeFactory; |
| 2753 |
2813 NativeFunctionLiteral(Zone* zone, const AstRawString* name, | 2754 NativeFunctionLiteral(Zone* zone, const AstRawString* name, |
2814 v8::Extension* extension, int pos) | 2755 v8::Extension* extension, int pos) |
2815 : Expression(zone, pos, kNativeFunctionLiteral), | 2756 : Expression(zone, pos, kNativeFunctionLiteral), |
2816 name_(name), | 2757 name_(name), |
2817 extension_(extension) {} | 2758 extension_(extension) {} |
2818 | 2759 |
2819 private: | |
2820 const AstRawString* name_; | 2760 const AstRawString* name_; |
2821 v8::Extension* extension_; | 2761 v8::Extension* extension_; |
2822 }; | 2762 }; |
2823 | 2763 |
2824 | 2764 |
2825 class ThisFunction final : public Expression { | 2765 class ThisFunction final : public Expression { |
2826 public: | 2766 private: |
2827 DECLARE_NODE_TYPE(ThisFunction) | 2767 friend class AstNodeFactory; |
2828 | |
2829 protected: | |
2830 ThisFunction(Zone* zone, int pos) : Expression(zone, pos, kThisFunction) {} | 2768 ThisFunction(Zone* zone, int pos) : Expression(zone, pos, kThisFunction) {} |
2831 }; | 2769 }; |
2832 | 2770 |
2833 | 2771 |
2834 class SuperPropertyReference final : public Expression { | 2772 class SuperPropertyReference final : public Expression { |
2835 public: | 2773 public: |
2836 DECLARE_NODE_TYPE(SuperPropertyReference) | |
2837 | |
2838 VariableProxy* this_var() const { return this_var_; } | 2774 VariableProxy* this_var() const { return this_var_; } |
2839 void set_this_var(VariableProxy* v) { this_var_ = v; } | 2775 void set_this_var(VariableProxy* v) { this_var_ = v; } |
2840 Expression* home_object() const { return home_object_; } | 2776 Expression* home_object() const { return home_object_; } |
2841 void set_home_object(Expression* e) { home_object_ = e; } | 2777 void set_home_object(Expression* e) { home_object_ = e; } |
2842 | 2778 |
2843 protected: | 2779 private: |
| 2780 friend class AstNodeFactory; |
| 2781 |
2844 SuperPropertyReference(Zone* zone, VariableProxy* this_var, | 2782 SuperPropertyReference(Zone* zone, VariableProxy* this_var, |
2845 Expression* home_object, int pos) | 2783 Expression* home_object, int pos) |
2846 : Expression(zone, pos, kSuperPropertyReference), | 2784 : Expression(zone, pos, kSuperPropertyReference), |
2847 this_var_(this_var), | 2785 this_var_(this_var), |
2848 home_object_(home_object) { | 2786 home_object_(home_object) { |
2849 DCHECK(this_var->is_this()); | 2787 DCHECK(this_var->is_this()); |
2850 DCHECK(home_object->IsProperty()); | 2788 DCHECK(home_object->IsProperty()); |
2851 } | 2789 } |
2852 | 2790 |
2853 private: | |
2854 VariableProxy* this_var_; | 2791 VariableProxy* this_var_; |
2855 Expression* home_object_; | 2792 Expression* home_object_; |
2856 }; | 2793 }; |
2857 | 2794 |
2858 | 2795 |
2859 class SuperCallReference final : public Expression { | 2796 class SuperCallReference final : public Expression { |
2860 public: | 2797 public: |
2861 DECLARE_NODE_TYPE(SuperCallReference) | |
2862 | |
2863 VariableProxy* this_var() const { return this_var_; } | 2798 VariableProxy* this_var() const { return this_var_; } |
2864 void set_this_var(VariableProxy* v) { this_var_ = v; } | 2799 void set_this_var(VariableProxy* v) { this_var_ = v; } |
2865 VariableProxy* new_target_var() const { return new_target_var_; } | 2800 VariableProxy* new_target_var() const { return new_target_var_; } |
2866 void set_new_target_var(VariableProxy* v) { new_target_var_ = v; } | 2801 void set_new_target_var(VariableProxy* v) { new_target_var_ = v; } |
2867 VariableProxy* this_function_var() const { return this_function_var_; } | 2802 VariableProxy* this_function_var() const { return this_function_var_; } |
2868 void set_this_function_var(VariableProxy* v) { this_function_var_ = v; } | 2803 void set_this_function_var(VariableProxy* v) { this_function_var_ = v; } |
2869 | 2804 |
2870 protected: | 2805 private: |
| 2806 friend class AstNodeFactory; |
| 2807 |
2871 SuperCallReference(Zone* zone, VariableProxy* this_var, | 2808 SuperCallReference(Zone* zone, VariableProxy* this_var, |
2872 VariableProxy* new_target_var, | 2809 VariableProxy* new_target_var, |
2873 VariableProxy* this_function_var, int pos) | 2810 VariableProxy* this_function_var, int pos) |
2874 : Expression(zone, pos, kSuperCallReference), | 2811 : Expression(zone, pos, kSuperCallReference), |
2875 this_var_(this_var), | 2812 this_var_(this_var), |
2876 new_target_var_(new_target_var), | 2813 new_target_var_(new_target_var), |
2877 this_function_var_(this_function_var) { | 2814 this_function_var_(this_function_var) { |
2878 DCHECK(this_var->is_this()); | 2815 DCHECK(this_var->is_this()); |
2879 DCHECK(new_target_var->raw_name()->IsOneByteEqualTo(".new.target")); | 2816 DCHECK(new_target_var->raw_name()->IsOneByteEqualTo(".new.target")); |
2880 DCHECK(this_function_var->raw_name()->IsOneByteEqualTo(".this_function")); | 2817 DCHECK(this_function_var->raw_name()->IsOneByteEqualTo(".this_function")); |
2881 } | 2818 } |
2882 | 2819 |
2883 private: | |
2884 VariableProxy* this_var_; | 2820 VariableProxy* this_var_; |
2885 VariableProxy* new_target_var_; | 2821 VariableProxy* new_target_var_; |
2886 VariableProxy* this_function_var_; | 2822 VariableProxy* this_function_var_; |
2887 }; | 2823 }; |
2888 | 2824 |
2889 | 2825 |
2890 // This class is produced when parsing the () in arrow functions without any | 2826 // This class is produced when parsing the () in arrow functions without any |
2891 // arguments and is not actually a valid expression. | 2827 // arguments and is not actually a valid expression. |
2892 class EmptyParentheses final : public Expression { | 2828 class EmptyParentheses final : public Expression { |
2893 public: | 2829 private: |
2894 DECLARE_NODE_TYPE(EmptyParentheses) | 2830 friend class AstNodeFactory; |
2895 | 2831 |
2896 private: | |
2897 EmptyParentheses(Zone* zone, int pos) | 2832 EmptyParentheses(Zone* zone, int pos) |
2898 : Expression(zone, pos, kEmptyParentheses) {} | 2833 : Expression(zone, pos, kEmptyParentheses) {} |
2899 }; | 2834 }; |
2900 | 2835 |
2901 | 2836 |
2902 #undef DECLARE_NODE_TYPE | |
2903 | |
2904 | 2837 |
2905 // ---------------------------------------------------------------------------- | 2838 // ---------------------------------------------------------------------------- |
2906 // Basic visitor | 2839 // Basic visitor |
2907 // Sub-class should parametrize AstVisitor with itself, e.g.: | 2840 // Sub-class should parametrize AstVisitor with itself, e.g.: |
2908 // class SpecificVisitor : public AstVisitor<SpecificVisitor> { ... } | 2841 // class SpecificVisitor : public AstVisitor<SpecificVisitor> { ... } |
2909 | 2842 |
2910 template <class Subclass> | 2843 template <class Subclass> |
2911 class AstVisitor BASE_EMBEDDED { | 2844 class AstVisitor BASE_EMBEDDED { |
2912 public: | 2845 public: |
2913 void Visit(AstNode* node) { impl()->Visit(node); } | 2846 void Visit(AstNode* node) { impl()->Visit(node); } |
(...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3544 : NULL; \ | 3477 : NULL; \ |
3545 } | 3478 } |
3546 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) | 3479 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
3547 #undef DECLARE_NODE_FUNCTIONS | 3480 #undef DECLARE_NODE_FUNCTIONS |
3548 | 3481 |
3549 | 3482 |
3550 } // namespace internal | 3483 } // namespace internal |
3551 } // namespace v8 | 3484 } // namespace v8 |
3552 | 3485 |
3553 #endif // V8_AST_AST_H_ | 3486 #endif // V8_AST_AST_H_ |
OLD | NEW |