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/assembler.h" | 8 #include "src/assembler.h" |
9 #include "src/ast/ast-value-factory.h" | 9 #include "src/ast/ast-value-factory.h" |
10 #include "src/ast/modules.h" | 10 #include "src/ast/modules.h" |
(...skipping 772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
783 each_ = each; | 783 each_ = each; |
784 subject_ = subject; | 784 subject_ = subject; |
785 } | 785 } |
786 | 786 |
787 Expression* each() const { return each_; } | 787 Expression* each() const { return each_; } |
788 Expression* subject() const { return subject_; } | 788 Expression* subject() const { return subject_; } |
789 | 789 |
790 void set_each(Expression* e) { each_ = e; } | 790 void set_each(Expression* e) { each_ = e; } |
791 void set_subject(Expression* e) { subject_ = e; } | 791 void set_subject(Expression* e) { subject_ = e; } |
792 | 792 |
793 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | |
794 FeedbackVectorSlotCache* cache) override; | |
795 FeedbackVectorSlot EachFeedbackSlot() const { return each_slot_; } | |
796 | |
797 static const char* VisitModeString(VisitMode mode) { | 793 static const char* VisitModeString(VisitMode mode) { |
798 return mode == ITERATE ? "for-of" : "for-in"; | 794 return mode == ITERATE ? "for-of" : "for-in"; |
799 } | 795 } |
800 | 796 |
801 protected: | 797 protected: |
802 ForEachStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 798 ForEachStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
803 : IterationStatement(zone, labels, pos), each_(NULL), subject_(NULL) {} | 799 : IterationStatement(zone, labels, pos), each_(NULL), subject_(NULL) {} |
804 | 800 |
805 private: | 801 private: |
806 Expression* each_; | 802 Expression* each_; |
807 Expression* subject_; | 803 Expression* subject_; |
808 FeedbackVectorSlot each_slot_; | |
809 }; | 804 }; |
810 | 805 |
811 | 806 |
812 class ForInStatement final : public ForEachStatement { | 807 class ForInStatement final : public ForEachStatement { |
813 public: | 808 public: |
814 DECLARE_NODE_TYPE(ForInStatement) | 809 DECLARE_NODE_TYPE(ForInStatement) |
815 | 810 |
816 Expression* enumerable() const { | 811 Expression* enumerable() const { |
817 return subject(); | 812 return subject(); |
818 } | 813 } |
819 | 814 |
820 // Type feedback information. | 815 // Type feedback information. |
821 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 816 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
822 FeedbackVectorSlotCache* cache) override { | 817 FeedbackVectorSlotCache* cache) override; |
823 ForEachStatement::AssignFeedbackVectorSlots(isolate, spec, cache); | 818 FeedbackVectorSlot EachFeedbackSlot() const { return each_slot_; } |
824 for_in_feedback_slot_ = spec->AddGeneralSlot(); | |
825 } | |
826 | |
827 FeedbackVectorSlot ForInFeedbackSlot() { | 819 FeedbackVectorSlot ForInFeedbackSlot() { |
828 DCHECK(!for_in_feedback_slot_.IsInvalid()); | 820 DCHECK(!for_in_feedback_slot_.IsInvalid()); |
829 return for_in_feedback_slot_; | 821 return for_in_feedback_slot_; |
830 } | 822 } |
831 | 823 |
832 enum ForInType { FAST_FOR_IN, SLOW_FOR_IN }; | 824 enum ForInType { FAST_FOR_IN, SLOW_FOR_IN }; |
833 ForInType for_in_type() const { return for_in_type_; } | 825 ForInType for_in_type() const { return for_in_type_; } |
834 void set_for_in_type(ForInType type) { for_in_type_ = type; } | 826 void set_for_in_type(ForInType type) { for_in_type_ = type; } |
835 | 827 |
836 static int num_ids() { return parent_num_ids() + 6; } | 828 static int num_ids() { return parent_num_ids() + 6; } |
837 BailoutId BodyId() const { return BailoutId(local_id(0)); } | 829 BailoutId BodyId() const { return BailoutId(local_id(0)); } |
838 BailoutId EnumId() const { return BailoutId(local_id(1)); } | 830 BailoutId EnumId() const { return BailoutId(local_id(1)); } |
839 BailoutId ToObjectId() const { return BailoutId(local_id(2)); } | 831 BailoutId ToObjectId() const { return BailoutId(local_id(2)); } |
840 BailoutId PrepareId() const { return BailoutId(local_id(3)); } | 832 BailoutId PrepareId() const { return BailoutId(local_id(3)); } |
841 BailoutId FilterId() const { return BailoutId(local_id(4)); } | 833 BailoutId FilterId() const { return BailoutId(local_id(4)); } |
842 BailoutId AssignmentId() const { return BailoutId(local_id(5)); } | 834 BailoutId AssignmentId() const { return BailoutId(local_id(5)); } |
843 BailoutId ContinueId() const override { return EntryId(); } | 835 BailoutId ContinueId() const override { return EntryId(); } |
844 BailoutId StackCheckId() const override { return BodyId(); } | 836 BailoutId StackCheckId() const override { return BodyId(); } |
845 | 837 |
846 protected: | 838 protected: |
847 ForInStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) | 839 ForInStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) |
848 : ForEachStatement(zone, labels, pos), for_in_type_(SLOW_FOR_IN) {} | 840 : ForEachStatement(zone, labels, pos), for_in_type_(SLOW_FOR_IN) {} |
849 static int parent_num_ids() { return ForEachStatement::num_ids(); } | 841 static int parent_num_ids() { return ForEachStatement::num_ids(); } |
850 | 842 |
851 private: | 843 private: |
852 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 844 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
853 | 845 |
854 ForInType for_in_type_; | 846 ForInType for_in_type_; |
| 847 FeedbackVectorSlot each_slot_; |
855 FeedbackVectorSlot for_in_feedback_slot_; | 848 FeedbackVectorSlot for_in_feedback_slot_; |
856 }; | 849 }; |
857 | 850 |
858 | 851 |
859 class ForOfStatement final : public ForEachStatement { | 852 class ForOfStatement final : public ForEachStatement { |
860 public: | 853 public: |
861 DECLARE_NODE_TYPE(ForOfStatement) | 854 DECLARE_NODE_TYPE(ForOfStatement) |
862 | 855 |
863 void Initialize(Expression* each, | 856 void Initialize(Expression* each, |
864 Expression* subject, | 857 Expression* subject, |
(...skipping 2671 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3536 : NULL; \ | 3529 : NULL; \ |
3537 } | 3530 } |
3538 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) | 3531 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
3539 #undef DECLARE_NODE_FUNCTIONS | 3532 #undef DECLARE_NODE_FUNCTIONS |
3540 | 3533 |
3541 | 3534 |
3542 } // namespace internal | 3535 } // namespace internal |
3543 } // namespace v8 | 3536 } // namespace v8 |
3544 | 3537 |
3545 #endif // V8_AST_AST_H_ | 3538 #endif // V8_AST_AST_H_ |
OLD | NEW |