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

Side by Side Diff: src/ast.h

Issue 8335006: Eliminate some virtual function from AST classes. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 9 years, 1 month 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/ast.cc » ('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 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 111
112 // Typedef only introduced to avoid unreadable code. 112 // Typedef only introduced to avoid unreadable code.
113 // Please do appreciate the required space in "> >". 113 // Please do appreciate the required space in "> >".
114 typedef ZoneList<Handle<String> > ZoneStringList; 114 typedef ZoneList<Handle<String> > ZoneStringList;
115 typedef ZoneList<Handle<Object> > ZoneObjectList; 115 typedef ZoneList<Handle<Object> > ZoneObjectList;
116 116
117 117
118 #define DECLARE_NODE_TYPE(type) \ 118 #define DECLARE_NODE_TYPE(type) \
119 virtual void Accept(AstVisitor* v); \ 119 virtual void Accept(AstVisitor* v); \
120 virtual AstNode::Type node_type() const { return AstNode::k##type; } \ 120 virtual AstNode::Type node_type() const { return AstNode::k##type; } \
121 virtual type* As##type() { return this; }
122 121
123 122
124 class AstNode: public ZoneObject { 123 class AstNode: public ZoneObject {
125 public: 124 public:
126 #define DECLARE_TYPE_ENUM(type) k##type, 125 #define DECLARE_TYPE_ENUM(type) k##type,
127 enum Type { 126 enum Type {
128 AST_NODE_LIST(DECLARE_TYPE_ENUM) 127 AST_NODE_LIST(DECLARE_TYPE_ENUM)
129 kInvalid = -1 128 kInvalid = -1
130 }; 129 };
131 #undef DECLARE_TYPE_ENUM 130 #undef DECLARE_TYPE_ENUM
(...skipping 14 matching lines...) Expand all
146 145
147 AstNode() {} 146 AstNode() {}
148 147
149 virtual ~AstNode() { } 148 virtual ~AstNode() { }
150 149
151 virtual void Accept(AstVisitor* v) = 0; 150 virtual void Accept(AstVisitor* v) = 0;
152 virtual Type node_type() const { return kInvalid; } 151 virtual Type node_type() const { return kInvalid; }
153 152
154 // Type testing & conversion functions overridden by concrete subclasses. 153 // Type testing & conversion functions overridden by concrete subclasses.
155 #define DECLARE_NODE_FUNCTIONS(type) \ 154 #define DECLARE_NODE_FUNCTIONS(type) \
156 virtual type* As##type() { return NULL; } 155 bool Is##type() { return node_type() == AstNode::k##type; } \
156 type* As##type() { return Is##type() ? reinterpret_cast<type*>(this) : NULL; }
157 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) 157 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS)
158 #undef DECLARE_NODE_FUNCTIONS 158 #undef DECLARE_NODE_FUNCTIONS
159 159
160 virtual Statement* AsStatement() { return NULL; } 160 virtual Statement* AsStatement() { return NULL; }
161 virtual Expression* AsExpression() { return NULL; } 161 virtual Expression* AsExpression() { return NULL; }
162 virtual TargetCollector* AsTargetCollector() { return NULL; } 162 virtual TargetCollector* AsTargetCollector() { return NULL; }
163 virtual BreakableStatement* AsBreakableStatement() { return NULL; } 163 virtual BreakableStatement* AsBreakableStatement() { return NULL; }
164 virtual IterationStatement* AsIterationStatement() { return NULL; } 164 virtual IterationStatement* AsIterationStatement() { return NULL; }
165 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } 165 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; }
166 166
(...skipping 22 matching lines...) Expand all
189 friend class CaseClause; // Generates AST IDs. 189 friend class CaseClause; // Generates AST IDs.
190 }; 190 };
191 191
192 192
193 class Statement: public AstNode { 193 class Statement: public AstNode {
194 public: 194 public:
195 Statement() : statement_pos_(RelocInfo::kNoPosition) {} 195 Statement() : statement_pos_(RelocInfo::kNoPosition) {}
196 196
197 virtual Statement* AsStatement() { return this; } 197 virtual Statement* AsStatement() { return this; }
198 198
199 virtual Assignment* StatementAsSimpleAssignment() { return NULL; }
200 virtual CountOperation* StatementAsCountOperation() { return NULL; }
201
202 bool IsEmpty() { return AsEmptyStatement() != NULL; } 199 bool IsEmpty() { return AsEmptyStatement() != NULL; }
203 200
204 void set_statement_pos(int statement_pos) { statement_pos_ = statement_pos; } 201 void set_statement_pos(int statement_pos) { statement_pos_ = statement_pos; }
205 int statement_pos() const { return statement_pos_; } 202 int statement_pos() const { return statement_pos_; }
206 203
207 private: 204 private:
208 int statement_pos_; 205 int statement_pos_;
209 }; 206 };
210 207
211 208
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 : id_(GetNextId(isolate)), 254 : id_(GetNextId(isolate)),
258 test_id_(GetNextId(isolate)) {} 255 test_id_(GetNextId(isolate)) {}
259 256
260 virtual int position() const { 257 virtual int position() const {
261 UNREACHABLE(); 258 UNREACHABLE();
262 return 0; 259 return 0;
263 } 260 }
264 261
265 virtual Expression* AsExpression() { return this; } 262 virtual Expression* AsExpression() { return this; }
266 263
267 virtual bool IsTrivial() { return false; }
268 virtual bool IsValidLeftHandSide() { return false; } 264 virtual bool IsValidLeftHandSide() { return false; }
269 265
270 // Helpers for ToBoolean conversion. 266 // Helpers for ToBoolean conversion.
271 virtual bool ToBooleanIsTrue() { return false; } 267 virtual bool ToBooleanIsTrue() { return false; }
272 virtual bool ToBooleanIsFalse() { return false; } 268 virtual bool ToBooleanIsFalse() { return false; }
273 269
274 // Symbols that cannot be parsed as array indices are considered property 270 // Symbols that cannot be parsed as array indices are considered property
275 // names. We do not treat symbols that can be array indexes as property 271 // names. We do not treat symbols that can be array indexes as property
276 // names because [] for string objects is handled only by keyed ICs. 272 // names because [] for string objects is handled only by keyed ICs.
277 virtual bool IsPropertyName() { return false; } 273 virtual bool IsPropertyName() { return false; }
278 274
279 // Mark the expression as being compiled as an expression
280 // statement. This is used to transform postfix increments to
281 // (faster) prefix increments.
282 virtual void MarkAsStatement() { /* do nothing */ }
283
284 // True iff the result can be safely overwritten (to avoid allocation). 275 // True iff the result can be safely overwritten (to avoid allocation).
285 // False for operations that can return one of their operands. 276 // False for operations that can return one of their operands.
286 virtual bool ResultOverwriteAllowed() { return false; } 277 virtual bool ResultOverwriteAllowed() { return false; }
287 278
288 // True iff the expression is a literal represented as a smi. 279 // True iff the expression is a literal represented as a smi.
289 virtual bool IsSmiLiteral() { return false; } 280 bool IsSmiLiteral();
290 281
291 // True iff the expression is a string literal. 282 // True iff the expression is a string literal.
292 virtual bool IsStringLiteral() { return false; } 283 bool IsStringLiteral();
293 284
294 // True iff the expression is the null literal. 285 // True iff the expression is the null literal.
295 virtual bool IsNullLiteral() { return false; } 286 bool IsNullLiteral();
296 287
297 // Type feedback information for assignments and properties. 288 // Type feedback information for assignments and properties.
298 virtual bool IsMonomorphic() { 289 virtual bool IsMonomorphic() {
299 UNREACHABLE(); 290 UNREACHABLE();
300 return false; 291 return false;
301 } 292 }
302 virtual bool IsArrayLength() {
303 UNREACHABLE();
304 return false;
305 }
306 virtual SmallMapList* GetReceiverTypes() { 293 virtual SmallMapList* GetReceiverTypes() {
307 UNREACHABLE(); 294 UNREACHABLE();
308 return NULL; 295 return NULL;
309 } 296 }
310 Handle<Map> GetMonomorphicReceiverType() { 297 Handle<Map> GetMonomorphicReceiverType() {
311 ASSERT(IsMonomorphic()); 298 ASSERT(IsMonomorphic());
312 SmallMapList* types = GetReceiverTypes(); 299 SmallMapList* types = GetReceiverTypes();
313 ASSERT(types != NULL && types->length() == 1); 300 ASSERT(types != NULL && types->length() == 1);
314 return types->at(0); 301 return types->at(0);
315 } 302 }
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 348
362 class Block: public BreakableStatement { 349 class Block: public BreakableStatement {
363 public: 350 public:
364 inline Block(Isolate* isolate, 351 inline Block(Isolate* isolate,
365 ZoneStringList* labels, 352 ZoneStringList* labels,
366 int capacity, 353 int capacity,
367 bool is_initializer_block); 354 bool is_initializer_block);
368 355
369 DECLARE_NODE_TYPE(Block) 356 DECLARE_NODE_TYPE(Block)
370 357
371 virtual Assignment* StatementAsSimpleAssignment() {
372 if (statements_.length() != 1) return NULL;
373 return statements_[0]->StatementAsSimpleAssignment();
374 }
375
376 virtual CountOperation* StatementAsCountOperation() {
377 if (statements_.length() != 1) return NULL;
378 return statements_[0]->StatementAsCountOperation();
379 }
380
381 virtual bool IsInlineable() const; 358 virtual bool IsInlineable() const;
382 359
383 void AddStatement(Statement* statement) { statements_.Add(statement); } 360 void AddStatement(Statement* statement) { statements_.Add(statement); }
384 361
385 ZoneList<Statement*>* statements() { return &statements_; } 362 ZoneList<Statement*>* statements() { return &statements_; }
386 bool is_initializer_block() const { return is_initializer_block_; } 363 bool is_initializer_block() const { return is_initializer_block_; }
387 364
388 Scope* block_scope() const { return block_scope_; } 365 Scope* block_scope() const { return block_scope_; }
389 void set_block_scope(Scope* block_scope) { block_scope_ = block_scope; } 366 void set_block_scope(Scope* block_scope) { block_scope_ = block_scope; }
390 367
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
605 582
606 class ExpressionStatement: public Statement { 583 class ExpressionStatement: public Statement {
607 public: 584 public:
608 explicit ExpressionStatement(Expression* expression) 585 explicit ExpressionStatement(Expression* expression)
609 : expression_(expression) { } 586 : expression_(expression) { }
610 587
611 DECLARE_NODE_TYPE(ExpressionStatement) 588 DECLARE_NODE_TYPE(ExpressionStatement)
612 589
613 virtual bool IsInlineable() const; 590 virtual bool IsInlineable() const;
614 591
615 virtual Assignment* StatementAsSimpleAssignment();
616 virtual CountOperation* StatementAsCountOperation();
617
618 void set_expression(Expression* e) { expression_ = e; } 592 void set_expression(Expression* e) { expression_ = e; }
619 Expression* expression() const { return expression_; } 593 Expression* expression() const { return expression_; }
620 594
621 private: 595 private:
622 Expression* expression_; 596 Expression* expression_;
623 }; 597 };
624 598
625 599
626 class ContinueStatement: public Statement { 600 class ContinueStatement: public Statement {
627 public: 601 public:
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
888 }; 862 };
889 863
890 864
891 class Literal: public Expression { 865 class Literal: public Expression {
892 public: 866 public:
893 Literal(Isolate* isolate, Handle<Object> handle) 867 Literal(Isolate* isolate, Handle<Object> handle)
894 : Expression(isolate), handle_(handle) { } 868 : Expression(isolate), handle_(handle) { }
895 869
896 DECLARE_NODE_TYPE(Literal) 870 DECLARE_NODE_TYPE(Literal)
897 871
898 virtual bool IsTrivial() { return true; }
899 virtual bool IsSmiLiteral() { return handle_->IsSmi(); }
900 virtual bool IsStringLiteral() { return handle_->IsString(); }
901 virtual bool IsNullLiteral() { return handle_->IsNull(); }
902
903 // Check if this literal is identical to the other literal. 872 // Check if this literal is identical to the other literal.
904 bool IsIdenticalTo(const Literal* other) const { 873 bool IsIdenticalTo(const Literal* other) const {
905 return handle_.is_identical_to(other->handle_); 874 return handle_.is_identical_to(other->handle_);
906 } 875 }
907 876
908 virtual bool IsPropertyName() { 877 virtual bool IsPropertyName() {
909 if (handle_->IsSymbol()) { 878 if (handle_->IsSymbol()) {
910 uint32_t ignored; 879 uint32_t ignored;
911 return !String::cast(*handle_)->AsArrayIndex(&ignored); 880 return !String::cast(*handle_)->AsArrayIndex(&ignored);
912 } 881 }
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
1107 class VariableProxy: public Expression { 1076 class VariableProxy: public Expression {
1108 public: 1077 public:
1109 VariableProxy(Isolate* isolate, Variable* var); 1078 VariableProxy(Isolate* isolate, Variable* var);
1110 1079
1111 DECLARE_NODE_TYPE(VariableProxy) 1080 DECLARE_NODE_TYPE(VariableProxy)
1112 1081
1113 virtual bool IsValidLeftHandSide() { 1082 virtual bool IsValidLeftHandSide() {
1114 return var_ == NULL ? true : var_->IsValidLeftHandSide(); 1083 return var_ == NULL ? true : var_->IsValidLeftHandSide();
1115 } 1084 }
1116 1085
1117 virtual bool IsTrivial() {
1118 // Reading from a mutable variable is a side effect, but the
1119 // variable for 'this' is immutable.
1120 return is_this_ || is_trivial_;
1121 }
1122
1123 virtual bool IsInlineable() const; 1086 virtual bool IsInlineable() const;
1124 1087
1125 bool IsVariable(Handle<String> n) { 1088 bool IsVariable(Handle<String> n) {
1126 return !is_this() && name().is_identical_to(n); 1089 return !is_this() && name().is_identical_to(n);
1127 } 1090 }
1128 1091
1129 bool IsArguments() { return var_ != NULL && var_->is_arguments(); } 1092 bool IsArguments() { return var_ != NULL && var_->is_arguments(); }
1130 1093
1131 Handle<String> name() const { return name_; } 1094 Handle<String> name() const { return name_; }
1132 Variable* var() const { return var_; } 1095 Variable* var() const { return var_; }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1180 virtual int position() const { return pos_; } 1143 virtual int position() const { return pos_; }
1181 1144
1182 bool IsStringLength() const { return is_string_length_; } 1145 bool IsStringLength() const { return is_string_length_; }
1183 bool IsStringAccess() const { return is_string_access_; } 1146 bool IsStringAccess() const { return is_string_access_; }
1184 bool IsFunctionPrototype() const { return is_function_prototype_; } 1147 bool IsFunctionPrototype() const { return is_function_prototype_; }
1185 1148
1186 // Type feedback information. 1149 // Type feedback information.
1187 void RecordTypeFeedback(TypeFeedbackOracle* oracle); 1150 void RecordTypeFeedback(TypeFeedbackOracle* oracle);
1188 virtual bool IsMonomorphic() { return is_monomorphic_; } 1151 virtual bool IsMonomorphic() { return is_monomorphic_; }
1189 virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; } 1152 virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; }
1190 virtual bool IsArrayLength() { return is_array_length_; } 1153 bool IsArrayLength() { return is_array_length_; }
1191 1154
1192 private: 1155 private:
1193 Expression* obj_; 1156 Expression* obj_;
1194 Expression* key_; 1157 Expression* key_;
1195 int pos_; 1158 int pos_;
1196 1159
1197 SmallMapList receiver_types_; 1160 SmallMapList receiver_types_;
1198 bool is_monomorphic_ : 1; 1161 bool is_monomorphic_ : 1;
1199 bool is_array_length_ : 1; 1162 bool is_array_length_ : 1;
1200 bool is_string_length_ : 1; 1163 bool is_string_length_ : 1;
(...skipping 923 matching lines...) Expand 10 before | Expand all | Expand 10 after
2124 2087
2125 private: 2088 private:
2126 Isolate* isolate_; 2089 Isolate* isolate_;
2127 bool stack_overflow_; 2090 bool stack_overflow_;
2128 }; 2091 };
2129 2092
2130 2093
2131 } } // namespace v8::internal 2094 } } // namespace v8::internal
2132 2095
2133 #endif // V8_AST_H_ 2096 #endif // V8_AST_H_
OLDNEW
« no previous file with comments | « no previous file | src/ast.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698