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

Side by Side Diff: src/ast/ast.h

Issue 1565153002: Add a generic mechanism for expression rewriting (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rewrite according to comments and small fix Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « BUILD.gn ('k') | src/ast/ast-expression-rewriter.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 487 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 bool ignore_completion_value_; 498 bool ignore_completion_value_;
499 Scope* scope_; 499 Scope* scope_;
500 }; 500 };
501 501
502 502
503 class DoExpression final : public Expression { 503 class DoExpression final : public Expression {
504 public: 504 public:
505 DECLARE_NODE_TYPE(DoExpression) 505 DECLARE_NODE_TYPE(DoExpression)
506 506
507 Block* block() { return block_; } 507 Block* block() { return block_; }
508 void set_block(Block* b) { block_ = b; }
508 VariableProxy* result() { return result_; } 509 VariableProxy* result() { return result_; }
510 void set_result(VariableProxy* v) { result_ = v; }
509 511
510 void MarkTail() override { block_->MarkTail(); } 512 void MarkTail() override { block_->MarkTail(); }
511 513
512 protected: 514 protected:
513 DoExpression(Zone* zone, Block* block, VariableProxy* result, int pos) 515 DoExpression(Zone* zone, Block* block, VariableProxy* result, int pos)
514 : Expression(zone, pos), block_(block), result_(result) { 516 : Expression(zone, pos), block_(block), result_(result) {
515 DCHECK_NOT_NULL(block_); 517 DCHECK_NOT_NULL(block_);
516 DCHECK_NOT_NULL(result_); 518 DCHECK_NOT_NULL(result_);
517 } 519 }
518 static int parent_num_ids() { return Expression::num_ids(); } 520 static int parent_num_ids() { return Expression::num_ids(); }
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 bool is_class_declaration_; 578 bool is_class_declaration_;
577 int declaration_group_start_; 579 int declaration_group_start_;
578 }; 580 };
579 581
580 582
581 class FunctionDeclaration final : public Declaration { 583 class FunctionDeclaration final : public Declaration {
582 public: 584 public:
583 DECLARE_NODE_TYPE(FunctionDeclaration) 585 DECLARE_NODE_TYPE(FunctionDeclaration)
584 586
585 FunctionLiteral* fun() const { return fun_; } 587 FunctionLiteral* fun() const { return fun_; }
588 void set_fun(FunctionLiteral* f) { fun_ = f; }
586 InitializationFlag initialization() const override { 589 InitializationFlag initialization() const override {
587 return kCreatedInitialized; 590 return kCreatedInitialized;
588 } 591 }
589 bool IsInlineable() const override; 592 bool IsInlineable() const override;
590 593
591 protected: 594 protected:
592 FunctionDeclaration(Zone* zone, 595 FunctionDeclaration(Zone* zone,
593 VariableProxy* proxy, 596 VariableProxy* proxy,
594 VariableMode mode, 597 VariableMode mode,
595 FunctionLiteral* fun, 598 FunctionLiteral* fun,
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 class DoWhileStatement final : public IterationStatement { 702 class DoWhileStatement final : public IterationStatement {
700 public: 703 public:
701 DECLARE_NODE_TYPE(DoWhileStatement) 704 DECLARE_NODE_TYPE(DoWhileStatement)
702 705
703 void Initialize(Expression* cond, Statement* body) { 706 void Initialize(Expression* cond, Statement* body) {
704 IterationStatement::Initialize(body); 707 IterationStatement::Initialize(body);
705 cond_ = cond; 708 cond_ = cond;
706 } 709 }
707 710
708 Expression* cond() const { return cond_; } 711 Expression* cond() const { return cond_; }
712 void set_cond(Expression* e) { cond_ = e; }
709 713
710 static int num_ids() { return parent_num_ids() + 2; } 714 static int num_ids() { return parent_num_ids() + 2; }
711 BailoutId ContinueId() const override { return BailoutId(local_id(0)); } 715 BailoutId ContinueId() const override { return BailoutId(local_id(0)); }
712 BailoutId StackCheckId() const override { return BackEdgeId(); } 716 BailoutId StackCheckId() const override { return BackEdgeId(); }
713 BailoutId BackEdgeId() const { return BailoutId(local_id(1)); } 717 BailoutId BackEdgeId() const { return BailoutId(local_id(1)); }
714 718
715 protected: 719 protected:
716 DoWhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) 720 DoWhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos)
717 : IterationStatement(zone, labels, pos), cond_(NULL) {} 721 : IterationStatement(zone, labels, pos), cond_(NULL) {}
718 static int parent_num_ids() { return IterationStatement::num_ids(); } 722 static int parent_num_ids() { return IterationStatement::num_ids(); }
719 723
720 private: 724 private:
721 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 725 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
722 726
723 Expression* cond_; 727 Expression* cond_;
724 }; 728 };
725 729
726 730
727 class WhileStatement final : public IterationStatement { 731 class WhileStatement final : public IterationStatement {
728 public: 732 public:
729 DECLARE_NODE_TYPE(WhileStatement) 733 DECLARE_NODE_TYPE(WhileStatement)
730 734
731 void Initialize(Expression* cond, Statement* body) { 735 void Initialize(Expression* cond, Statement* body) {
732 IterationStatement::Initialize(body); 736 IterationStatement::Initialize(body);
733 cond_ = cond; 737 cond_ = cond;
734 } 738 }
735 739
736 Expression* cond() const { return cond_; } 740 Expression* cond() const { return cond_; }
741 void set_cond(Expression* e) { cond_ = e; }
737 742
738 static int num_ids() { return parent_num_ids() + 1; } 743 static int num_ids() { return parent_num_ids() + 1; }
739 BailoutId ContinueId() const override { return EntryId(); } 744 BailoutId ContinueId() const override { return EntryId(); }
740 BailoutId StackCheckId() const override { return BodyId(); } 745 BailoutId StackCheckId() const override { return BodyId(); }
741 BailoutId BodyId() const { return BailoutId(local_id(0)); } 746 BailoutId BodyId() const { return BailoutId(local_id(0)); }
742 747
743 protected: 748 protected:
744 WhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) 749 WhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos)
745 : IterationStatement(zone, labels, pos), cond_(NULL) {} 750 : IterationStatement(zone, labels, pos), cond_(NULL) {}
746 static int parent_num_ids() { return IterationStatement::num_ids(); } 751 static int parent_num_ids() { return IterationStatement::num_ids(); }
(...skipping 16 matching lines...) Expand all
763 IterationStatement::Initialize(body); 768 IterationStatement::Initialize(body);
764 init_ = init; 769 init_ = init;
765 cond_ = cond; 770 cond_ = cond;
766 next_ = next; 771 next_ = next;
767 } 772 }
768 773
769 Statement* init() const { return init_; } 774 Statement* init() const { return init_; }
770 Expression* cond() const { return cond_; } 775 Expression* cond() const { return cond_; }
771 Statement* next() const { return next_; } 776 Statement* next() const { return next_; }
772 777
778 void set_init(Statement* s) { init_ = s; }
779 void set_cond(Expression* e) { cond_ = e; }
780 void set_next(Statement* s) { next_ = s; }
781
773 static int num_ids() { return parent_num_ids() + 2; } 782 static int num_ids() { return parent_num_ids() + 2; }
774 BailoutId ContinueId() const override { return BailoutId(local_id(0)); } 783 BailoutId ContinueId() const override { return BailoutId(local_id(0)); }
775 BailoutId StackCheckId() const override { return BodyId(); } 784 BailoutId StackCheckId() const override { return BodyId(); }
776 BailoutId BodyId() const { return BailoutId(local_id(1)); } 785 BailoutId BodyId() const { return BailoutId(local_id(1)); }
777 786
778 protected: 787 protected:
779 ForStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) 788 ForStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos)
780 : IterationStatement(zone, labels, pos), 789 : IterationStatement(zone, labels, pos),
781 init_(NULL), 790 init_(NULL),
782 cond_(NULL), 791 cond_(NULL),
(...skipping 18 matching lines...) Expand all
801 810
802 void Initialize(Expression* each, Expression* subject, Statement* body) { 811 void Initialize(Expression* each, Expression* subject, Statement* body) {
803 IterationStatement::Initialize(body); 812 IterationStatement::Initialize(body);
804 each_ = each; 813 each_ = each;
805 subject_ = subject; 814 subject_ = subject;
806 } 815 }
807 816
808 Expression* each() const { return each_; } 817 Expression* each() const { return each_; }
809 Expression* subject() const { return subject_; } 818 Expression* subject() const { return subject_; }
810 819
820 void set_each(Expression* e) { each_ = e; }
821 void set_subject(Expression* e) { subject_ = e; }
822
811 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 823 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
812 FeedbackVectorSlotCache* cache) override; 824 FeedbackVectorSlotCache* cache) override;
813 FeedbackVectorSlot EachFeedbackSlot() const { return each_slot_; } 825 FeedbackVectorSlot EachFeedbackSlot() const { return each_slot_; }
814 826
815 protected: 827 protected:
816 ForEachStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) 828 ForEachStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos)
817 : IterationStatement(zone, labels, pos), each_(NULL), subject_(NULL) {} 829 : IterationStatement(zone, labels, pos), each_(NULL), subject_(NULL) {}
818 830
819 private: 831 private:
820 Expression* each_; 832 Expression* each_;
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
905 // result.done 917 // result.done
906 Expression* result_done() const { 918 Expression* result_done() const {
907 return result_done_; 919 return result_done_;
908 } 920 }
909 921
910 // each = result.value 922 // each = result.value
911 Expression* assign_each() const { 923 Expression* assign_each() const {
912 return assign_each_; 924 return assign_each_;
913 } 925 }
914 926
927 void set_assign_iterator(Expression* e) { assign_iterator_ = e; }
928 void set_next_result(Expression* e) { next_result_ = e; }
929 void set_result_done(Expression* e) { result_done_ = e; }
930 void set_assign_each(Expression* e) { assign_each_ = e; }
nickie 2016/01/11 10:24:18 Small fix #1: these four lines had inadvertently b
931
915 BailoutId ContinueId() const override { return EntryId(); } 932 BailoutId ContinueId() const override { return EntryId(); }
916 BailoutId StackCheckId() const override { return BackEdgeId(); } 933 BailoutId StackCheckId() const override { return BackEdgeId(); }
917 934
918 static int num_ids() { return parent_num_ids() + 1; } 935 static int num_ids() { return parent_num_ids() + 1; }
919 BailoutId BackEdgeId() const { return BailoutId(local_id(0)); } 936 BailoutId BackEdgeId() const { return BailoutId(local_id(0)); }
920 937
921 protected: 938 protected:
922 ForOfStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) 939 ForOfStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos)
923 : ForEachStatement(zone, labels, pos), 940 : ForEachStatement(zone, labels, pos),
924 assign_iterator_(NULL), 941 assign_iterator_(NULL),
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
993 BreakableStatement* target_; 1010 BreakableStatement* target_;
994 }; 1011 };
995 1012
996 1013
997 class ReturnStatement final : public JumpStatement { 1014 class ReturnStatement final : public JumpStatement {
998 public: 1015 public:
999 DECLARE_NODE_TYPE(ReturnStatement) 1016 DECLARE_NODE_TYPE(ReturnStatement)
1000 1017
1001 Expression* expression() const { return expression_; } 1018 Expression* expression() const { return expression_; }
1002 1019
1020 void set_expression(Expression* e) { expression_ = e; }
1021
1003 protected: 1022 protected:
1004 explicit ReturnStatement(Zone* zone, Expression* expression, int pos) 1023 explicit ReturnStatement(Zone* zone, Expression* expression, int pos)
1005 : JumpStatement(zone, pos), expression_(expression) { } 1024 : JumpStatement(zone, pos), expression_(expression) { }
1006 1025
1007 private: 1026 private:
1008 Expression* expression_; 1027 Expression* expression_;
1009 }; 1028 };
1010 1029
1011 1030
1012 class WithStatement final : public Statement { 1031 class WithStatement final : public Statement {
1013 public: 1032 public:
1014 DECLARE_NODE_TYPE(WithStatement) 1033 DECLARE_NODE_TYPE(WithStatement)
1015 1034
1016 Scope* scope() { return scope_; } 1035 Scope* scope() { return scope_; }
1017 Expression* expression() const { return expression_; } 1036 Expression* expression() const { return expression_; }
1037 void set_expression(Expression* e) { expression_ = e; }
1018 Statement* statement() const { return statement_; } 1038 Statement* statement() const { return statement_; }
1019 void set_statement(Statement* s) { statement_ = s; } 1039 void set_statement(Statement* s) { statement_ = s; }
1020 1040
1021 void set_base_id(int id) { base_id_ = id; } 1041 void set_base_id(int id) { base_id_ = id; }
1022 static int num_ids() { return parent_num_ids() + 2; } 1042 static int num_ids() { return parent_num_ids() + 2; }
1023 BailoutId ToObjectId() const { return BailoutId(local_id(0)); } 1043 BailoutId ToObjectId() const { return BailoutId(local_id(0)); }
1024 BailoutId EntryId() const { return BailoutId(local_id(1)); } 1044 BailoutId EntryId() const { return BailoutId(local_id(1)); }
1025 1045
1026 void MarkTail() override { statement_->MarkTail(); } 1046 void MarkTail() override { statement_->MarkTail(); }
1027 1047
(...skipping 24 matching lines...) Expand all
1052 1072
1053 class CaseClause final : public Expression { 1073 class CaseClause final : public Expression {
1054 public: 1074 public:
1055 DECLARE_NODE_TYPE(CaseClause) 1075 DECLARE_NODE_TYPE(CaseClause)
1056 1076
1057 bool is_default() const { return label_ == NULL; } 1077 bool is_default() const { return label_ == NULL; }
1058 Expression* label() const { 1078 Expression* label() const {
1059 CHECK(!is_default()); 1079 CHECK(!is_default());
1060 return label_; 1080 return label_;
1061 } 1081 }
1082 void set_label(Expression* e) { label_ = e; }
1062 Label* body_target() { return &body_target_; } 1083 Label* body_target() { return &body_target_; }
1063 ZoneList<Statement*>* statements() const { return statements_; } 1084 ZoneList<Statement*>* statements() const { return statements_; }
1064 1085
1065 static int num_ids() { return parent_num_ids() + 2; } 1086 static int num_ids() { return parent_num_ids() + 2; }
1066 BailoutId EntryId() const { return BailoutId(local_id(0)); } 1087 BailoutId EntryId() const { return BailoutId(local_id(0)); }
1067 TypeFeedbackId CompareId() { return TypeFeedbackId(local_id(1)); } 1088 TypeFeedbackId CompareId() { return TypeFeedbackId(local_id(1)); }
1068 1089
1069 void MarkTail() override { 1090 void MarkTail() override {
1070 if (!statements_->is_empty()) statements_->last()->MarkTail(); 1091 if (!statements_->is_empty()) statements_->last()->MarkTail();
1071 } 1092 }
(...skipping 21 matching lines...) Expand all
1093 DECLARE_NODE_TYPE(SwitchStatement) 1114 DECLARE_NODE_TYPE(SwitchStatement)
1094 1115
1095 void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) { 1116 void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) {
1096 tag_ = tag; 1117 tag_ = tag;
1097 cases_ = cases; 1118 cases_ = cases;
1098 } 1119 }
1099 1120
1100 Expression* tag() const { return tag_; } 1121 Expression* tag() const { return tag_; }
1101 ZoneList<CaseClause*>* cases() const { return cases_; } 1122 ZoneList<CaseClause*>* cases() const { return cases_; }
1102 1123
1124 void set_tag(Expression* t) { tag_ = t; }
1125
1103 void MarkTail() override { 1126 void MarkTail() override {
1104 if (!cases_->is_empty()) cases_->last()->MarkTail(); 1127 if (!cases_->is_empty()) cases_->last()->MarkTail();
1105 } 1128 }
1106 1129
1107 protected: 1130 protected:
1108 SwitchStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) 1131 SwitchStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos)
1109 : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos), 1132 : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos),
1110 tag_(NULL), 1133 tag_(NULL),
1111 cases_(NULL) {} 1134 cases_(NULL) {}
1112 1135
(...skipping 12 matching lines...) Expand all
1125 public: 1148 public:
1126 DECLARE_NODE_TYPE(IfStatement) 1149 DECLARE_NODE_TYPE(IfStatement)
1127 1150
1128 bool HasThenStatement() const { return !then_statement()->IsEmpty(); } 1151 bool HasThenStatement() const { return !then_statement()->IsEmpty(); }
1129 bool HasElseStatement() const { return !else_statement()->IsEmpty(); } 1152 bool HasElseStatement() const { return !else_statement()->IsEmpty(); }
1130 1153
1131 Expression* condition() const { return condition_; } 1154 Expression* condition() const { return condition_; }
1132 Statement* then_statement() const { return then_statement_; } 1155 Statement* then_statement() const { return then_statement_; }
1133 Statement* else_statement() const { return else_statement_; } 1156 Statement* else_statement() const { return else_statement_; }
1134 1157
1158 void set_condition(Expression* e) { condition_ = e; }
1135 void set_then_statement(Statement* s) { then_statement_ = s; } 1159 void set_then_statement(Statement* s) { then_statement_ = s; }
1136 void set_else_statement(Statement* s) { else_statement_ = s; } 1160 void set_else_statement(Statement* s) { else_statement_ = s; }
1137 1161
1138 bool IsJump() const override { 1162 bool IsJump() const override {
1139 return HasThenStatement() && then_statement()->IsJump() 1163 return HasThenStatement() && then_statement()->IsJump()
1140 && HasElseStatement() && else_statement()->IsJump(); 1164 && HasElseStatement() && else_statement()->IsJump();
1141 } 1165 }
1142 1166
1143 void MarkTail() override { 1167 void MarkTail() override {
1144 then_statement_->MarkTail(); 1168 then_statement_->MarkTail();
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
1419 COMPUTED, // Property with computed value (execution time). 1443 COMPUTED, // Property with computed value (execution time).
1420 MATERIALIZED_LITERAL, // Property value is a materialized literal. 1444 MATERIALIZED_LITERAL, // Property value is a materialized literal.
1421 GETTER, SETTER, // Property is an accessor function. 1445 GETTER, SETTER, // Property is an accessor function.
1422 PROTOTYPE // Property is __proto__. 1446 PROTOTYPE // Property is __proto__.
1423 }; 1447 };
1424 1448
1425 Expression* key() { return key_; } 1449 Expression* key() { return key_; }
1426 Expression* value() { return value_; } 1450 Expression* value() { return value_; }
1427 Kind kind() { return kind_; } 1451 Kind kind() { return kind_; }
1428 1452
1453 void set_key(Expression* e) { key_ = e; }
1454 void set_value(Expression* e) { value_ = e; }
1455
1429 // Type feedback information. 1456 // Type feedback information.
1430 bool IsMonomorphic() { return !receiver_type_.is_null(); } 1457 bool IsMonomorphic() { return !receiver_type_.is_null(); }
1431 Handle<Map> GetReceiverType() { return receiver_type_; } 1458 Handle<Map> GetReceiverType() { return receiver_type_; }
1432 1459
1433 bool IsCompileTimeValue(); 1460 bool IsCompileTimeValue();
1434 1461
1435 void set_emit_store(bool emit_store); 1462 void set_emit_store(bool emit_store);
1436 bool emit_store(); 1463 bool emit_store();
1437 1464
1438 bool is_static() const { return is_static_; } 1465 bool is_static() const { return is_static_; }
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
1792 1819
1793 class Property final : public Expression { 1820 class Property final : public Expression {
1794 public: 1821 public:
1795 DECLARE_NODE_TYPE(Property) 1822 DECLARE_NODE_TYPE(Property)
1796 1823
1797 bool IsValidReferenceExpression() const override { return true; } 1824 bool IsValidReferenceExpression() const override { return true; }
1798 1825
1799 Expression* obj() const { return obj_; } 1826 Expression* obj() const { return obj_; }
1800 Expression* key() const { return key_; } 1827 Expression* key() const { return key_; }
1801 1828
1829 void set_obj(Expression* e) { obj_ = e; }
1830 void set_key(Expression* e) { key_ = e; }
1831
1802 static int num_ids() { return parent_num_ids() + 1; } 1832 static int num_ids() { return parent_num_ids() + 1; }
1803 BailoutId LoadId() const { return BailoutId(local_id(0)); } 1833 BailoutId LoadId() const { return BailoutId(local_id(0)); }
1804 1834
1805 bool IsStringAccess() const { 1835 bool IsStringAccess() const {
1806 return IsStringAccessField::decode(bit_field_); 1836 return IsStringAccessField::decode(bit_field_);
1807 } 1837 }
1808 1838
1809 // Type feedback information. 1839 // Type feedback information.
1810 bool IsMonomorphic() override { return receiver_types_.length() == 1; } 1840 bool IsMonomorphic() override { return receiver_types_.length() == 1; }
1811 SmallMapList* GetReceiverTypes() override { return &receiver_types_; } 1841 SmallMapList* GetReceiverTypes() override { return &receiver_types_; }
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1883 }; 1913 };
1884 1914
1885 1915
1886 class Call final : public Expression { 1916 class Call final : public Expression {
1887 public: 1917 public:
1888 DECLARE_NODE_TYPE(Call) 1918 DECLARE_NODE_TYPE(Call)
1889 1919
1890 Expression* expression() const { return expression_; } 1920 Expression* expression() const { return expression_; }
1891 ZoneList<Expression*>* arguments() const { return arguments_; } 1921 ZoneList<Expression*>* arguments() const { return arguments_; }
1892 1922
1923 void set_expression(Expression* e) { expression_ = e; }
1924
1893 // Type feedback information. 1925 // Type feedback information.
1894 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 1926 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
1895 FeedbackVectorSlotCache* cache) override; 1927 FeedbackVectorSlotCache* cache) override;
1896 1928
1897 FeedbackVectorSlot CallFeedbackSlot() const { return stub_slot_; } 1929 FeedbackVectorSlot CallFeedbackSlot() const { return stub_slot_; }
1898 1930
1899 FeedbackVectorSlot CallFeedbackICSlot() const { return ic_slot_; } 1931 FeedbackVectorSlot CallFeedbackICSlot() const { return ic_slot_; }
1900 1932
1901 SmallMapList* GetReceiverTypes() override { 1933 SmallMapList* GetReceiverTypes() override {
1902 if (expression()->IsProperty()) { 1934 if (expression()->IsProperty()) {
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
2002 }; 2034 };
2003 2035
2004 2036
2005 class CallNew final : public Expression { 2037 class CallNew final : public Expression {
2006 public: 2038 public:
2007 DECLARE_NODE_TYPE(CallNew) 2039 DECLARE_NODE_TYPE(CallNew)
2008 2040
2009 Expression* expression() const { return expression_; } 2041 Expression* expression() const { return expression_; }
2010 ZoneList<Expression*>* arguments() const { return arguments_; } 2042 ZoneList<Expression*>* arguments() const { return arguments_; }
2011 2043
2044 void set_expression(Expression* e) { expression_ = e; }
2045
2012 // Type feedback information. 2046 // Type feedback information.
2013 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 2047 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
2014 FeedbackVectorSlotCache* cache) override { 2048 FeedbackVectorSlotCache* cache) override {
2015 callnew_feedback_slot_ = spec->AddGeneralSlot(); 2049 callnew_feedback_slot_ = spec->AddGeneralSlot();
2016 } 2050 }
2017 2051
2018 FeedbackVectorSlot CallNewFeedbackSlot() { 2052 FeedbackVectorSlot CallNewFeedbackSlot() {
2019 DCHECK(!callnew_feedback_slot_.IsInvalid()); 2053 DCHECK(!callnew_feedback_slot_.IsInvalid());
2020 return callnew_feedback_slot_; 2054 return callnew_feedback_slot_;
2021 } 2055 }
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
2111 ZoneList<Expression*>* arguments_; 2145 ZoneList<Expression*>* arguments_;
2112 }; 2146 };
2113 2147
2114 2148
2115 class UnaryOperation final : public Expression { 2149 class UnaryOperation final : public Expression {
2116 public: 2150 public:
2117 DECLARE_NODE_TYPE(UnaryOperation) 2151 DECLARE_NODE_TYPE(UnaryOperation)
2118 2152
2119 Token::Value op() const { return op_; } 2153 Token::Value op() const { return op_; }
2120 Expression* expression() const { return expression_; } 2154 Expression* expression() const { return expression_; }
2155 void set_expression(Expression* e) { expression_ = e; }
2121 2156
2122 // For unary not (Token::NOT), the AST ids where true and false will 2157 // For unary not (Token::NOT), the AST ids where true and false will
2123 // actually be materialized, respectively. 2158 // actually be materialized, respectively.
2124 static int num_ids() { return parent_num_ids() + 2; } 2159 static int num_ids() { return parent_num_ids() + 2; }
2125 BailoutId MaterializeTrueId() const { return BailoutId(local_id(0)); } 2160 BailoutId MaterializeTrueId() const { return BailoutId(local_id(0)); }
2126 BailoutId MaterializeFalseId() const { return BailoutId(local_id(1)); } 2161 BailoutId MaterializeFalseId() const { return BailoutId(local_id(1)); }
2127 2162
2128 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle) override; 2163 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle) override;
2129 2164
2130 protected: 2165 protected:
(...skipping 10 matching lines...) Expand all
2141 Expression* expression_; 2176 Expression* expression_;
2142 }; 2177 };
2143 2178
2144 2179
2145 class BinaryOperation final : public Expression { 2180 class BinaryOperation final : public Expression {
2146 public: 2181 public:
2147 DECLARE_NODE_TYPE(BinaryOperation) 2182 DECLARE_NODE_TYPE(BinaryOperation)
2148 2183
2149 Token::Value op() const { return static_cast<Token::Value>(op_); } 2184 Token::Value op() const { return static_cast<Token::Value>(op_); }
2150 Expression* left() const { return left_; } 2185 Expression* left() const { return left_; }
2186 void set_left(Expression* e) { left_ = e; }
2151 Expression* right() const { return right_; } 2187 Expression* right() const { return right_; }
2188 void set_right(Expression* e) { right_ = e; }
2152 Handle<AllocationSite> allocation_site() const { return allocation_site_; } 2189 Handle<AllocationSite> allocation_site() const { return allocation_site_; }
2153 void set_allocation_site(Handle<AllocationSite> allocation_site) { 2190 void set_allocation_site(Handle<AllocationSite> allocation_site) {
2154 allocation_site_ = allocation_site; 2191 allocation_site_ = allocation_site;
2155 } 2192 }
2156 2193
2157 void MarkTail() override { 2194 void MarkTail() override {
2158 switch (op()) { 2195 switch (op()) {
2159 case Token::COMMA: 2196 case Token::COMMA:
2160 case Token::AND: 2197 case Token::AND:
2161 case Token::OR: 2198 case Token::OR:
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
2216 2253
2217 bool is_prefix() const { return IsPrefixField::decode(bit_field_); } 2254 bool is_prefix() const { return IsPrefixField::decode(bit_field_); }
2218 bool is_postfix() const { return !is_prefix(); } 2255 bool is_postfix() const { return !is_prefix(); }
2219 2256
2220 Token::Value op() const { return TokenField::decode(bit_field_); } 2257 Token::Value op() const { return TokenField::decode(bit_field_); }
2221 Token::Value binary_op() { 2258 Token::Value binary_op() {
2222 return (op() == Token::INC) ? Token::ADD : Token::SUB; 2259 return (op() == Token::INC) ? Token::ADD : Token::SUB;
2223 } 2260 }
2224 2261
2225 Expression* expression() const { return expression_; } 2262 Expression* expression() const { return expression_; }
2263 void set_expression(Expression* e) { expression_ = e; }
2226 2264
2227 bool IsMonomorphic() override { return receiver_types_.length() == 1; } 2265 bool IsMonomorphic() override { return receiver_types_.length() == 1; }
2228 SmallMapList* GetReceiverTypes() override { return &receiver_types_; } 2266 SmallMapList* GetReceiverTypes() override { return &receiver_types_; }
2229 IcCheckType GetKeyType() const override { 2267 IcCheckType GetKeyType() const override {
2230 return KeyTypeField::decode(bit_field_); 2268 return KeyTypeField::decode(bit_field_);
2231 } 2269 }
2232 KeyedAccessStoreMode GetStoreMode() const override { 2270 KeyedAccessStoreMode GetStoreMode() const override {
2233 return StoreModeField::decode(bit_field_); 2271 return StoreModeField::decode(bit_field_);
2234 } 2272 }
2235 Type* type() const { return type_; } 2273 Type* type() const { return type_; }
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2285 2323
2286 2324
2287 class CompareOperation final : public Expression { 2325 class CompareOperation final : public Expression {
2288 public: 2326 public:
2289 DECLARE_NODE_TYPE(CompareOperation) 2327 DECLARE_NODE_TYPE(CompareOperation)
2290 2328
2291 Token::Value op() const { return op_; } 2329 Token::Value op() const { return op_; }
2292 Expression* left() const { return left_; } 2330 Expression* left() const { return left_; }
2293 Expression* right() const { return right_; } 2331 Expression* right() const { return right_; }
2294 2332
2333 void set_left(Expression* e) { left_ = e; }
2334 void set_right(Expression* e) { right_ = e; }
2335
2295 // Type feedback information. 2336 // Type feedback information.
2296 static int num_ids() { return parent_num_ids() + 1; } 2337 static int num_ids() { return parent_num_ids() + 1; }
2297 TypeFeedbackId CompareOperationFeedbackId() const { 2338 TypeFeedbackId CompareOperationFeedbackId() const {
2298 return TypeFeedbackId(local_id(0)); 2339 return TypeFeedbackId(local_id(0));
2299 } 2340 }
2300 Type* combined_type() const { return combined_type_; } 2341 Type* combined_type() const { return combined_type_; }
2301 void set_combined_type(Type* type) { combined_type_ = type; } 2342 void set_combined_type(Type* type) { combined_type_ = type; }
2302 2343
2303 // Match special cases. 2344 // Match special cases.
2304 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check); 2345 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check);
(...skipping 21 matching lines...) Expand all
2326 2367
2327 Type* combined_type_; 2368 Type* combined_type_;
2328 }; 2369 };
2329 2370
2330 2371
2331 class Spread final : public Expression { 2372 class Spread final : public Expression {
2332 public: 2373 public:
2333 DECLARE_NODE_TYPE(Spread) 2374 DECLARE_NODE_TYPE(Spread)
2334 2375
2335 Expression* expression() const { return expression_; } 2376 Expression* expression() const { return expression_; }
2377 void set_expression(Expression* e) { expression_ = e; }
2336 2378
2337 static int num_ids() { return parent_num_ids(); } 2379 static int num_ids() { return parent_num_ids(); }
2338 2380
2339 protected: 2381 protected:
2340 Spread(Zone* zone, Expression* expression, int pos) 2382 Spread(Zone* zone, Expression* expression, int pos)
2341 : Expression(zone, pos), expression_(expression) {} 2383 : Expression(zone, pos), expression_(expression) {}
2342 static int parent_num_ids() { return Expression::num_ids(); } 2384 static int parent_num_ids() { return Expression::num_ids(); }
2343 2385
2344 private: 2386 private:
2345 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2387 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2346 2388
2347 Expression* expression_; 2389 Expression* expression_;
2348 }; 2390 };
2349 2391
2350 2392
2351 class Conditional final : public Expression { 2393 class Conditional final : public Expression {
2352 public: 2394 public:
2353 DECLARE_NODE_TYPE(Conditional) 2395 DECLARE_NODE_TYPE(Conditional)
2354 2396
2355 Expression* condition() const { return condition_; } 2397 Expression* condition() const { return condition_; }
2356 Expression* then_expression() const { return then_expression_; } 2398 Expression* then_expression() const { return then_expression_; }
2357 Expression* else_expression() const { return else_expression_; } 2399 Expression* else_expression() const { return else_expression_; }
2358 2400
2401 void set_condition(Expression* e) { condition_ = e; }
2402 void set_then_expression(Expression* e) { then_expression_ = e; }
2403 void set_else_expression(Expression* e) { else_expression_ = e; }
2404
2359 void MarkTail() override { 2405 void MarkTail() override {
2360 then_expression_->MarkTail(); 2406 then_expression_->MarkTail();
2361 else_expression_->MarkTail(); 2407 else_expression_->MarkTail();
2362 } 2408 }
2363 2409
2364 static int num_ids() { return parent_num_ids() + 2; } 2410 static int num_ids() { return parent_num_ids() + 2; }
2365 BailoutId ThenId() const { return BailoutId(local_id(0)); } 2411 BailoutId ThenId() const { return BailoutId(local_id(0)); }
2366 BailoutId ElseId() const { return BailoutId(local_id(1)); } 2412 BailoutId ElseId() const { return BailoutId(local_id(1)); }
2367 2413
2368 protected: 2414 protected:
(...skipping 19 matching lines...) Expand all
2388 DECLARE_NODE_TYPE(Assignment) 2434 DECLARE_NODE_TYPE(Assignment)
2389 2435
2390 Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; } 2436 Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; }
2391 2437
2392 Token::Value binary_op() const; 2438 Token::Value binary_op() const;
2393 2439
2394 Token::Value op() const { return TokenField::decode(bit_field_); } 2440 Token::Value op() const { return TokenField::decode(bit_field_); }
2395 Expression* target() const { return target_; } 2441 Expression* target() const { return target_; }
2396 Expression* value() const { return value_; } 2442 Expression* value() const { return value_; }
2397 2443
2444 void set_target(Expression* e) { target_ = e; }
2445 void set_value(Expression* e) { value_ = e; }
2446
2398 BinaryOperation* binary_operation() const { return binary_operation_; } 2447 BinaryOperation* binary_operation() const { return binary_operation_; }
2399 2448
2400 // This check relies on the definition order of token in token.h. 2449 // This check relies on the definition order of token in token.h.
2401 bool is_compound() const { return op() > Token::ASSIGN; } 2450 bool is_compound() const { return op() > Token::ASSIGN; }
2402 2451
2403 static int num_ids() { return parent_num_ids() + 2; } 2452 static int num_ids() { return parent_num_ids() + 2; }
2404 BailoutId AssignmentId() const { return BailoutId(local_id(0)); } 2453 BailoutId AssignmentId() const { return BailoutId(local_id(0)); }
2405 2454
2406 // Type feedback information. 2455 // Type feedback information.
2407 TypeFeedbackId AssignmentFeedbackId() { return TypeFeedbackId(local_id(1)); } 2456 TypeFeedbackId AssignmentFeedbackId() { return TypeFeedbackId(local_id(1)); }
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
2460 }; 2509 };
2461 2510
2462 2511
2463 class RewritableAssignmentExpression : public Expression { 2512 class RewritableAssignmentExpression : public Expression {
2464 public: 2513 public:
2465 DECLARE_NODE_TYPE(RewritableAssignmentExpression) 2514 DECLARE_NODE_TYPE(RewritableAssignmentExpression)
2466 2515
2467 Expression* expression() { return expr_; } 2516 Expression* expression() { return expr_; }
2468 bool is_rewritten() const { return is_rewritten_; } 2517 bool is_rewritten() const { return is_rewritten_; }
2469 2518
2519 void set_expression(Expression* e) { expr_ = e; }
2520
2470 void Rewrite(Expression* new_expression) { 2521 void Rewrite(Expression* new_expression) {
2471 DCHECK(!is_rewritten()); 2522 DCHECK(!is_rewritten());
2472 DCHECK_NOT_NULL(new_expression); 2523 DCHECK_NOT_NULL(new_expression);
2473 expr_ = new_expression; 2524 expr_ = new_expression;
2474 is_rewritten_ = true; 2525 is_rewritten_ = true;
2475 } 2526 }
2476 2527
2477 static int num_ids() { return parent_num_ids(); } 2528 static int num_ids() { return parent_num_ids(); }
2478 2529
2479 protected: 2530 protected:
(...skipping 18 matching lines...) Expand all
2498 kInitial, // The initial yield that returns the unboxed generator object. 2549 kInitial, // The initial yield that returns the unboxed generator object.
2499 kSuspend, // A normal yield: { value: EXPRESSION, done: false } 2550 kSuspend, // A normal yield: { value: EXPRESSION, done: false }
2500 kDelegating, // A yield*. 2551 kDelegating, // A yield*.
2501 kFinal // A return: { value: EXPRESSION, done: true } 2552 kFinal // A return: { value: EXPRESSION, done: true }
2502 }; 2553 };
2503 2554
2504 Expression* generator_object() const { return generator_object_; } 2555 Expression* generator_object() const { return generator_object_; }
2505 Expression* expression() const { return expression_; } 2556 Expression* expression() const { return expression_; }
2506 Kind yield_kind() const { return yield_kind_; } 2557 Kind yield_kind() const { return yield_kind_; }
2507 2558
2559 void set_generator_object(Expression* e) { generator_object_ = e; }
2560 void set_expression(Expression* e) { expression_ = e; }
2561
2508 // Type feedback information. 2562 // Type feedback information.
2509 bool HasFeedbackSlots() const { return yield_kind() == kDelegating; } 2563 bool HasFeedbackSlots() const { return yield_kind() == kDelegating; }
2510 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 2564 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
2511 FeedbackVectorSlotCache* cache) override { 2565 FeedbackVectorSlotCache* cache) override {
2512 if (HasFeedbackSlots()) { 2566 if (HasFeedbackSlots()) {
2513 yield_first_feedback_slot_ = spec->AddKeyedLoadICSlot(); 2567 yield_first_feedback_slot_ = spec->AddKeyedLoadICSlot();
2514 keyed_load_feedback_slot_ = spec->AddLoadICSlot(); 2568 keyed_load_feedback_slot_ = spec->AddLoadICSlot();
2515 done_feedback_slot_ = spec->AddLoadICSlot(); 2569 done_feedback_slot_ = spec->AddLoadICSlot();
2516 } 2570 }
2517 } 2571 }
(...skipping 23 matching lines...) Expand all
2541 FeedbackVectorSlot keyed_load_feedback_slot_; 2595 FeedbackVectorSlot keyed_load_feedback_slot_;
2542 FeedbackVectorSlot done_feedback_slot_; 2596 FeedbackVectorSlot done_feedback_slot_;
2543 }; 2597 };
2544 2598
2545 2599
2546 class Throw final : public Expression { 2600 class Throw final : public Expression {
2547 public: 2601 public:
2548 DECLARE_NODE_TYPE(Throw) 2602 DECLARE_NODE_TYPE(Throw)
2549 2603
2550 Expression* exception() const { return exception_; } 2604 Expression* exception() const { return exception_; }
2605 void set_exception(Expression* e) { exception_ = e; }
2551 2606
2552 protected: 2607 protected:
2553 Throw(Zone* zone, Expression* exception, int pos) 2608 Throw(Zone* zone, Expression* exception, int pos)
2554 : Expression(zone, pos), exception_(exception) {} 2609 : Expression(zone, pos), exception_(exception) {}
2555 2610
2556 private: 2611 private:
2557 Expression* exception_; 2612 Expression* exception_;
2558 }; 2613 };
2559 2614
2560 2615
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
2760 Handle<String> name() const { return raw_name_->string(); } 2815 Handle<String> name() const { return raw_name_->string(); }
2761 const AstRawString* raw_name() const { return raw_name_; } 2816 const AstRawString* raw_name() const { return raw_name_; }
2762 void set_raw_name(const AstRawString* name) { 2817 void set_raw_name(const AstRawString* name) {
2763 DCHECK_NULL(raw_name_); 2818 DCHECK_NULL(raw_name_);
2764 raw_name_ = name; 2819 raw_name_ = name;
2765 } 2820 }
2766 2821
2767 Scope* scope() const { return scope_; } 2822 Scope* scope() const { return scope_; }
2768 VariableProxy* class_variable_proxy() const { return class_variable_proxy_; } 2823 VariableProxy* class_variable_proxy() const { return class_variable_proxy_; }
2769 Expression* extends() const { return extends_; } 2824 Expression* extends() const { return extends_; }
2825 void set_extends(Expression* e) { extends_ = e; }
2770 FunctionLiteral* constructor() const { return constructor_; } 2826 FunctionLiteral* constructor() const { return constructor_; }
2827 void set_constructor(FunctionLiteral* f) { constructor_ = f; }
2771 ZoneList<Property*>* properties() const { return properties_; } 2828 ZoneList<Property*>* properties() const { return properties_; }
2772 int start_position() const { return position(); } 2829 int start_position() const { return position(); }
2773 int end_position() const { return end_position_; } 2830 int end_position() const { return end_position_; }
2774 2831
2775 BailoutId EntryId() const { return BailoutId(local_id(0)); } 2832 BailoutId EntryId() const { return BailoutId(local_id(0)); }
2776 BailoutId DeclsId() const { return BailoutId(local_id(1)); } 2833 BailoutId DeclsId() const { return BailoutId(local_id(1)); }
2777 BailoutId ExitId() { return BailoutId(local_id(2)); } 2834 BailoutId ExitId() { return BailoutId(local_id(2)); }
2778 BailoutId CreateLiteralId() const { return BailoutId(local_id(3)); } 2835 BailoutId CreateLiteralId() const { return BailoutId(local_id(3)); }
2779 2836
2780 // Return an AST id for a property that is used in simulate instructions. 2837 // Return an AST id for a property that is used in simulate instructions.
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
2851 protected: 2908 protected:
2852 ThisFunction(Zone* zone, int pos) : Expression(zone, pos) {} 2909 ThisFunction(Zone* zone, int pos) : Expression(zone, pos) {}
2853 }; 2910 };
2854 2911
2855 2912
2856 class SuperPropertyReference final : public Expression { 2913 class SuperPropertyReference final : public Expression {
2857 public: 2914 public:
2858 DECLARE_NODE_TYPE(SuperPropertyReference) 2915 DECLARE_NODE_TYPE(SuperPropertyReference)
2859 2916
2860 VariableProxy* this_var() const { return this_var_; } 2917 VariableProxy* this_var() const { return this_var_; }
2918 void set_this_var(VariableProxy* v) { this_var_ = v; }
2861 Expression* home_object() const { return home_object_; } 2919 Expression* home_object() const { return home_object_; }
2920 void set_home_object(Expression* e) { home_object_ = e; }
2862 2921
2863 protected: 2922 protected:
2864 SuperPropertyReference(Zone* zone, VariableProxy* this_var, 2923 SuperPropertyReference(Zone* zone, VariableProxy* this_var,
2865 Expression* home_object, int pos) 2924 Expression* home_object, int pos)
2866 : Expression(zone, pos), this_var_(this_var), home_object_(home_object) { 2925 : Expression(zone, pos), this_var_(this_var), home_object_(home_object) {
2867 DCHECK(this_var->is_this()); 2926 DCHECK(this_var->is_this());
2868 DCHECK(home_object->IsProperty()); 2927 DCHECK(home_object->IsProperty());
2869 } 2928 }
2870 2929
2871 private: 2930 private:
2872 VariableProxy* this_var_; 2931 VariableProxy* this_var_;
2873 Expression* home_object_; 2932 Expression* home_object_;
2874 }; 2933 };
2875 2934
2876 2935
2877 class SuperCallReference final : public Expression { 2936 class SuperCallReference final : public Expression {
2878 public: 2937 public:
2879 DECLARE_NODE_TYPE(SuperCallReference) 2938 DECLARE_NODE_TYPE(SuperCallReference)
2880 2939
2881 VariableProxy* this_var() const { return this_var_; } 2940 VariableProxy* this_var() const { return this_var_; }
2941 void set_this_var(VariableProxy* v) { this_var_ = v; }
2882 VariableProxy* new_target_var() const { return new_target_var_; } 2942 VariableProxy* new_target_var() const { return new_target_var_; }
2943 void set_new_target_var(VariableProxy* v) { new_target_var_ = v; }
2883 VariableProxy* this_function_var() const { return this_function_var_; } 2944 VariableProxy* this_function_var() const { return this_function_var_; }
2945 void set_this_function_var(VariableProxy* v) { this_function_var_ = v; }
2884 2946
2885 protected: 2947 protected:
2886 SuperCallReference(Zone* zone, VariableProxy* this_var, 2948 SuperCallReference(Zone* zone, VariableProxy* this_var,
2887 VariableProxy* new_target_var, 2949 VariableProxy* new_target_var,
2888 VariableProxy* this_function_var, int pos) 2950 VariableProxy* this_function_var, int pos)
2889 : Expression(zone, pos), 2951 : Expression(zone, pos),
2890 this_var_(this_var), 2952 this_var_(this_var),
2891 new_target_var_(new_target_var), 2953 new_target_var_(new_target_var),
2892 this_function_var_(this_function_var) { 2954 this_function_var_(this_function_var) {
2893 DCHECK(this_var->is_this()); 2955 DCHECK(this_var->is_this());
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
3317 } \ 3379 } \
3318 \ 3380 \
3319 void InitializeAstVisitor(uintptr_t stack_limit) { \ 3381 void InitializeAstVisitor(uintptr_t stack_limit) { \
3320 stack_limit_ = stack_limit; \ 3382 stack_limit_ = stack_limit; \
3321 stack_overflow_ = false; \ 3383 stack_overflow_ = false; \
3322 } \ 3384 } \
3323 \ 3385 \
3324 uintptr_t stack_limit_; \ 3386 uintptr_t stack_limit_; \
3325 bool stack_overflow_ 3387 bool stack_overflow_
3326 3388
3389 #define DEFINE_AST_REWRITER_SUBCLASS_MEMBERS() \
3390 public: \
3391 AstNode* Rewrite(AstNode* node) { \
3392 DCHECK_NULL(replacement_); \
3393 DCHECK_NOT_NULL(node); \
3394 Visit(node); \
3395 if (HasStackOverflow()) return node; \
nickie 2016/01/11 10:24:18 Small fix #2: in case of failure, a non-null node
3396 if (replacement_ == nullptr) return node; \
3397 AstNode* result = replacement_; \
3398 replacement_ = nullptr; \
3399 return result; \
3400 } \
3401 \
3402 private: \
3403 void InitializeAstRewriter(Isolate* isolate) { \
3404 InitializeAstVisitor(isolate); \
3405 replacement_ = nullptr; \
3406 } \
3407 \
3408 void InitializeAstRewriter(uintptr_t stack_limit) { \
3409 InitializeAstVisitor(stack_limit); \
3410 replacement_ = nullptr; \
3411 } \
3412 \
3413 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); \
3414 \
3415 protected: \
3416 AstNode* replacement_
3417
3418 // Generic macro for rewriting things; `GET` is the expression to be
3419 // rewritten; `SET` is a command that should do the rewriting, i.e.
3420 // something sensible with the variable called `replacement`.
3421 #define AST_REWRITE(Type, GET, SET) \
3422 do { \
3423 DCHECK(!HasStackOverflow()); \
3424 DCHECK_NULL(replacement_); \
3425 Visit(GET); \
3426 if (HasStackOverflow()) return; \
3427 if (replacement_ == nullptr) break; \
3428 Type* replacement = reinterpret_cast<Type*>(replacement_); \
3429 do { \
3430 SET; \
3431 } while (false); \
3432 replacement_ = nullptr; \
3433 } while (false)
3434
3435 // Macro for rewriting object properties; it assumes that `object` has
3436 // `property` with a public getter and setter.
3437 #define AST_REWRITE_PROPERTY(Type, object, property) \
3438 do { \
3439 auto _obj = (object); \
3440 AST_REWRITE(Type, _obj->property(), _obj->set_##property(replacement)); \
3441 } while (false)
3442
3443 // Macro for rewriting list elements; it assumes that `list` has methods
3444 // `at` and `Set`.
3445 #define AST_REWRITE_LIST_ELEMENT(Type, list, index) \
3446 do { \
3447 auto _list = (list); \
3448 auto _index = (index); \
3449 AST_REWRITE(Type, _list->at(_index), _list->Set(_index, replacement)); \
3450 } while (false)
3451
3327 3452
3328 // ---------------------------------------------------------------------------- 3453 // ----------------------------------------------------------------------------
3329 // AstNode factory 3454 // AstNode factory
3330 3455
3331 class AstNodeFactory final BASE_EMBEDDED { 3456 class AstNodeFactory final BASE_EMBEDDED {
3332 public: 3457 public:
3333 explicit AstNodeFactory(AstValueFactory* ast_value_factory) 3458 explicit AstNodeFactory(AstValueFactory* ast_value_factory)
3334 : local_zone_(ast_value_factory->zone()), 3459 : local_zone_(ast_value_factory->zone()),
3335 parser_zone_(ast_value_factory->zone()), 3460 parser_zone_(ast_value_factory->zone()),
3336 ast_value_factory_(ast_value_factory) {} 3461 ast_value_factory_(ast_value_factory) {}
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after
3769 // the parser-level zone. 3894 // the parser-level zone.
3770 Zone* parser_zone_; 3895 Zone* parser_zone_;
3771 AstValueFactory* ast_value_factory_; 3896 AstValueFactory* ast_value_factory_;
3772 }; 3897 };
3773 3898
3774 3899
3775 } // namespace internal 3900 } // namespace internal
3776 } // namespace v8 3901 } // namespace v8
3777 3902
3778 #endif // V8_AST_AST_H_ 3903 #endif // V8_AST_AST_H_
OLDNEW
« no previous file with comments | « BUILD.gn ('k') | src/ast/ast-expression-rewriter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698