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

Side by Side Diff: src/ast.h

Issue 7054034: Push the general AST id field down from ASTNode to Expression. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 9 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | src/full-codegen.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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 #define DECLARE_TYPE_ENUM(type) k##type, 128 #define DECLARE_TYPE_ENUM(type) k##type,
129 enum Type { 129 enum Type {
130 AST_NODE_LIST(DECLARE_TYPE_ENUM) 130 AST_NODE_LIST(DECLARE_TYPE_ENUM)
131 kInvalid = -1 131 kInvalid = -1
132 }; 132 };
133 #undef DECLARE_TYPE_ENUM 133 #undef DECLARE_TYPE_ENUM
134 134
135 static const int kNoNumber = -1; 135 static const int kNoNumber = -1;
136 static const int kFunctionEntryId = 2; // Using 0 could disguise errors. 136 static const int kFunctionEntryId = 2; // Using 0 could disguise errors.
137 137
138 AstNode() : id_(GetNextId()) { 138 AstNode() {
139 Isolate* isolate = Isolate::Current(); 139 Isolate* isolate = Isolate::Current();
140 isolate->set_ast_node_count(isolate->ast_node_count() + 1); 140 isolate->set_ast_node_count(isolate->ast_node_count() + 1);
141 } 141 }
142 142
143 virtual ~AstNode() { } 143 virtual ~AstNode() { }
144 144
145 virtual void Accept(AstVisitor* v) = 0; 145 virtual void Accept(AstVisitor* v) = 0;
146 virtual Type node_type() const { return kInvalid; } 146 virtual Type node_type() const { return kInvalid; }
147 147
148 // Type testing & conversion functions overridden by concrete subclasses. 148 // Type testing & conversion functions overridden by concrete subclasses.
149 #define DECLARE_NODE_FUNCTIONS(type) \ 149 #define DECLARE_NODE_FUNCTIONS(type) \
150 virtual type* As##type() { return NULL; } 150 virtual type* As##type() { return NULL; }
151 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) 151 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS)
152 #undef DECLARE_NODE_FUNCTIONS 152 #undef DECLARE_NODE_FUNCTIONS
153 153
154 virtual Statement* AsStatement() { return NULL; } 154 virtual Statement* AsStatement() { return NULL; }
155 virtual Expression* AsExpression() { return NULL; } 155 virtual Expression* AsExpression() { return NULL; }
156 virtual TargetCollector* AsTargetCollector() { return NULL; } 156 virtual TargetCollector* AsTargetCollector() { return NULL; }
157 virtual BreakableStatement* AsBreakableStatement() { return NULL; } 157 virtual BreakableStatement* AsBreakableStatement() { return NULL; }
158 virtual IterationStatement* AsIterationStatement() { return NULL; } 158 virtual IterationStatement* AsIterationStatement() { return NULL; }
159 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } 159 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; }
160 virtual Slot* AsSlot() { return NULL; } 160 virtual Slot* AsSlot() { return NULL; }
161 161
162 // True if the node is simple enough for us to inline calls containing it. 162 // True if the node is simple enough for us to inline calls containing it.
163 virtual bool IsInlineable() const = 0; 163 virtual bool IsInlineable() const = 0;
164 164
165 static int Count() { return Isolate::Current()->ast_node_count(); } 165 static int Count() { return Isolate::Current()->ast_node_count(); }
166 static void ResetIds() { Isolate::Current()->set_ast_node_id(0); } 166 static void ResetIds() { Isolate::Current()->set_ast_node_id(0); }
167 unsigned id() const { return id_; }
168 167
169 protected: 168 protected:
170 static unsigned GetNextId() { 169 static unsigned GetNextId() { return ReserveIdRange(1); }
171 Isolate* isolate = Isolate::Current();
172 unsigned tmp = isolate->ast_node_id();
173 isolate->set_ast_node_id(tmp + 1);
174 return tmp;
175 }
176 static unsigned ReserveIdRange(int n) { 170 static unsigned ReserveIdRange(int n) {
177 Isolate* isolate = Isolate::Current(); 171 Isolate* isolate = Isolate::Current();
178 unsigned tmp = isolate->ast_node_id(); 172 unsigned tmp = isolate->ast_node_id();
179 isolate->set_ast_node_id(tmp + n); 173 isolate->set_ast_node_id(tmp + n);
180 return tmp; 174 return tmp;
181 } 175 }
182 176
183 private:
184 unsigned id_;
185
186 friend class CaseClause; // Generates AST IDs. 177 friend class CaseClause; // Generates AST IDs.
187 }; 178 };
188 179
189 180
190 class Statement: public AstNode { 181 class Statement: public AstNode {
191 public: 182 public:
192 Statement() : statement_pos_(RelocInfo::kNoPosition) {} 183 Statement() : statement_pos_(RelocInfo::kNoPosition) {}
193 184
194 virtual Statement* AsStatement() { return this; } 185 virtual Statement* AsStatement() { return this; }
195 186
(...skipping 17 matching lines...) Expand all
213 // code generation. 204 // code generation.
214 kUninitialized, 205 kUninitialized,
215 // Evaluated for its side effects. 206 // Evaluated for its side effects.
216 kEffect, 207 kEffect,
217 // Evaluated for its value (and side effects). 208 // Evaluated for its value (and side effects).
218 kValue, 209 kValue,
219 // Evaluated for control flow (and side effects). 210 // Evaluated for control flow (and side effects).
220 kTest 211 kTest
221 }; 212 };
222 213
223 Expression() {} 214 Expression() : id_(GetNextId()) {}
224 215
225 virtual int position() const { 216 virtual int position() const {
226 UNREACHABLE(); 217 UNREACHABLE();
227 return 0; 218 return 0;
228 } 219 }
229 220
230 virtual Expression* AsExpression() { return this; } 221 virtual Expression* AsExpression() { return this; }
231 222
232 virtual bool IsTrivial() { return false; } 223 virtual bool IsTrivial() { return false; }
233 virtual bool IsValidLeftHandSide() { return false; } 224 virtual bool IsValidLeftHandSide() { return false; }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 return Handle<Map>(); 262 return Handle<Map>();
272 } 263 }
273 264
274 ExternalArrayType external_array_type() const { 265 ExternalArrayType external_array_type() const {
275 return external_array_type_; 266 return external_array_type_;
276 } 267 }
277 void set_external_array_type(ExternalArrayType array_type) { 268 void set_external_array_type(ExternalArrayType array_type) {
278 external_array_type_ = array_type; 269 external_array_type_ = array_type;
279 } 270 }
280 271
272 unsigned id() const { return id_; }
273
281 private: 274 private:
282 ExternalArrayType external_array_type_; 275 ExternalArrayType external_array_type_;
276 unsigned id_;
283 }; 277 };
284 278
285 279
286 /** 280 /**
287 * A sentinel used during pre parsing that represents some expression 281 * A sentinel used during pre parsing that represents some expression
288 * that is a valid left hand side without having to actually build 282 * that is a valid left hand side without having to actually build
289 * the expression. 283 * the expression.
290 */ 284 */
291 class ValidLeftHandSideSentinel: public Expression { 285 class ValidLeftHandSideSentinel: public Expression {
292 public: 286 public:
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 // HasThenStatement() and HasElseStatement() functions to check if a 702 // HasThenStatement() and HasElseStatement() functions to check if a
709 // given if-statement has a then- or an else-part containing code. 703 // given if-statement has a then- or an else-part containing code.
710 class IfStatement: public Statement { 704 class IfStatement: public Statement {
711 public: 705 public:
712 IfStatement(Expression* condition, 706 IfStatement(Expression* condition,
713 Statement* then_statement, 707 Statement* then_statement,
714 Statement* else_statement) 708 Statement* else_statement)
715 : condition_(condition), 709 : condition_(condition),
716 then_statement_(then_statement), 710 then_statement_(then_statement),
717 else_statement_(else_statement), 711 else_statement_(else_statement),
712 if_id_(GetNextId()),
718 then_id_(GetNextId()), 713 then_id_(GetNextId()),
719 else_id_(GetNextId()) { 714 else_id_(GetNextId()) {
720 } 715 }
721 716
722 DECLARE_NODE_TYPE(IfStatement) 717 DECLARE_NODE_TYPE(IfStatement)
723 718
724 virtual bool IsInlineable() const; 719 virtual bool IsInlineable() const;
725 720
726 bool HasThenStatement() const { return !then_statement()->IsEmpty(); } 721 bool HasThenStatement() const { return !then_statement()->IsEmpty(); }
727 bool HasElseStatement() const { return !else_statement()->IsEmpty(); } 722 bool HasElseStatement() const { return !else_statement()->IsEmpty(); }
728 723
729 Expression* condition() const { return condition_; } 724 Expression* condition() const { return condition_; }
730 Statement* then_statement() const { return then_statement_; } 725 Statement* then_statement() const { return then_statement_; }
731 Statement* else_statement() const { return else_statement_; } 726 Statement* else_statement() const { return else_statement_; }
732 727
728 int IfId() const { return if_id_; }
733 int ThenId() const { return then_id_; } 729 int ThenId() const { return then_id_; }
734 int ElseId() const { return else_id_; } 730 int ElseId() const { return else_id_; }
735 731
736 private: 732 private:
737 Expression* condition_; 733 Expression* condition_;
738 Statement* then_statement_; 734 Statement* then_statement_;
739 Statement* else_statement_; 735 Statement* else_statement_;
736 int if_id_;
740 int then_id_; 737 int then_id_;
741 int else_id_; 738 int else_id_;
742 }; 739 };
743 740
744 741
745 // NOTE: TargetCollectors are represented as nodes to fit in the target 742 // NOTE: TargetCollectors are represented as nodes to fit in the target
746 // stack in the compiler; this should probably be reworked. 743 // stack in the compiler; this should probably be reworked.
747 class TargetCollector: public AstNode { 744 class TargetCollector: public AstNode {
748 public: 745 public:
749 explicit TargetCollector(ZoneList<Label*>* targets) 746 explicit TargetCollector(ZoneList<Label*>* targets)
(...skipping 1429 matching lines...) Expand 10 before | Expand all | Expand 10 after
2179 2176
2180 private: 2177 private:
2181 Isolate* isolate_; 2178 Isolate* isolate_;
2182 bool stack_overflow_; 2179 bool stack_overflow_;
2183 }; 2180 };
2184 2181
2185 2182
2186 } } // namespace v8::internal 2183 } } // namespace v8::internal
2187 2184
2188 #endif // V8_AST_H_ 2185 #endif // V8_AST_H_
OLDNEW
« no previous file with comments | « no previous file | src/full-codegen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698