OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 Loading... |
128 public: | 128 public: |
129 #define DECLARE_TYPE_ENUM(type) k##type, | 129 #define DECLARE_TYPE_ENUM(type) k##type, |
130 enum Type { | 130 enum Type { |
131 AST_NODE_LIST(DECLARE_TYPE_ENUM) | 131 AST_NODE_LIST(DECLARE_TYPE_ENUM) |
132 kInvalid = -1 | 132 kInvalid = -1 |
133 }; | 133 }; |
134 #undef DECLARE_TYPE_ENUM | 134 #undef DECLARE_TYPE_ENUM |
135 | 135 |
136 static const int kNoNumber = -1; | 136 static const int kNoNumber = -1; |
137 | 137 |
138 AstNode() : id_(GetNextId()) { count_++; } | 138 AstNode() : id_(GetNextId()) { |
| 139 Isolate* isolate = Isolate::Current(); |
| 140 isolate->set_ast_node_count(isolate->ast_node_count() + 1); |
| 141 } |
139 | 142 |
140 virtual ~AstNode() { } | 143 virtual ~AstNode() { } |
141 | 144 |
142 virtual void Accept(AstVisitor* v) = 0; | 145 virtual void Accept(AstVisitor* v) = 0; |
143 virtual Type node_type() const { return kInvalid; } | 146 virtual Type node_type() const { return kInvalid; } |
144 | 147 |
145 // Type testing & conversion functions overridden by concrete subclasses. | 148 // Type testing & conversion functions overridden by concrete subclasses. |
146 #define DECLARE_NODE_FUNCTIONS(type) \ | 149 #define DECLARE_NODE_FUNCTIONS(type) \ |
147 virtual type* As##type() { return NULL; } | 150 virtual type* As##type() { return NULL; } |
148 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) | 151 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
149 #undef DECLARE_NODE_FUNCTIONS | 152 #undef DECLARE_NODE_FUNCTIONS |
150 | 153 |
151 virtual Statement* AsStatement() { return NULL; } | 154 virtual Statement* AsStatement() { return NULL; } |
152 virtual Expression* AsExpression() { return NULL; } | 155 virtual Expression* AsExpression() { return NULL; } |
153 virtual TargetCollector* AsTargetCollector() { return NULL; } | 156 virtual TargetCollector* AsTargetCollector() { return NULL; } |
154 virtual BreakableStatement* AsBreakableStatement() { return NULL; } | 157 virtual BreakableStatement* AsBreakableStatement() { return NULL; } |
155 virtual IterationStatement* AsIterationStatement() { return NULL; } | 158 virtual IterationStatement* AsIterationStatement() { return NULL; } |
156 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } | 159 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } |
157 virtual Slot* AsSlot() { return NULL; } | 160 virtual Slot* AsSlot() { return NULL; } |
158 | 161 |
159 // 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. |
160 virtual bool IsInlineable() const { return false; } | 163 virtual bool IsInlineable() const { return false; } |
161 | 164 |
162 static int Count() { return count_; } | 165 static int Count() { return Isolate::Current()->ast_node_count(); } |
163 static void ResetIds() { current_id_ = 0; } | 166 static void ResetIds() { Isolate::Current()->set_ast_node_id(0); } |
164 unsigned id() const { return id_; } | 167 unsigned id() const { return id_; } |
165 | 168 |
166 protected: | 169 protected: |
167 static unsigned GetNextId() { return current_id_++; } | 170 static unsigned GetNextId() { |
| 171 Isolate* isolate = Isolate::Current(); |
| 172 unsigned tmp = isolate->ast_node_id(); |
| 173 isolate->set_ast_node_id(tmp + 1); |
| 174 return tmp; |
| 175 } |
168 static unsigned ReserveIdRange(int n) { | 176 static unsigned ReserveIdRange(int n) { |
169 unsigned tmp = current_id_; | 177 Isolate* isolate = Isolate::Current(); |
170 current_id_ += n; | 178 unsigned tmp = isolate->ast_node_id(); |
| 179 isolate->set_ast_node_id(tmp + n); |
171 return tmp; | 180 return tmp; |
172 } | 181 } |
173 | 182 |
174 private: | 183 private: |
175 static unsigned current_id_; | |
176 static unsigned count_; | |
177 unsigned id_; | 184 unsigned id_; |
178 | 185 |
179 friend class CaseClause; // Generates AST IDs. | 186 friend class CaseClause; // Generates AST IDs. |
180 }; | 187 }; |
181 | 188 |
182 | 189 |
183 class Statement: public AstNode { | 190 class Statement: public AstNode { |
184 public: | 191 public: |
185 Statement() : statement_pos_(RelocInfo::kNoPosition) {} | 192 Statement() : statement_pos_(RelocInfo::kNoPosition) {} |
186 | 193 |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
328 | 335 |
329 /** | 336 /** |
330 * A sentinel used during pre parsing that represents some expression | 337 * A sentinel used during pre parsing that represents some expression |
331 * that is a valid left hand side without having to actually build | 338 * that is a valid left hand side without having to actually build |
332 * the expression. | 339 * the expression. |
333 */ | 340 */ |
334 class ValidLeftHandSideSentinel: public Expression { | 341 class ValidLeftHandSideSentinel: public Expression { |
335 public: | 342 public: |
336 virtual bool IsValidLeftHandSide() { return true; } | 343 virtual bool IsValidLeftHandSide() { return true; } |
337 virtual void Accept(AstVisitor* v) { UNREACHABLE(); } | 344 virtual void Accept(AstVisitor* v) { UNREACHABLE(); } |
338 static ValidLeftHandSideSentinel* instance() { return &instance_; } | |
339 | |
340 private: | |
341 static ValidLeftHandSideSentinel instance_; | |
342 }; | 345 }; |
343 | 346 |
344 | 347 |
345 class BreakableStatement: public Statement { | 348 class BreakableStatement: public Statement { |
346 public: | 349 public: |
347 enum Type { | 350 enum Type { |
348 TARGET_FOR_ANONYMOUS, | 351 TARGET_FOR_ANONYMOUS, |
349 TARGET_FOR_NAMED_ONLY | 352 TARGET_FOR_NAMED_ONLY |
350 }; | 353 }; |
351 | 354 |
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
891 | 894 |
892 Handle<String> AsPropertyName() { | 895 Handle<String> AsPropertyName() { |
893 ASSERT(IsPropertyName()); | 896 ASSERT(IsPropertyName()); |
894 return Handle<String>::cast(handle_); | 897 return Handle<String>::cast(handle_); |
895 } | 898 } |
896 | 899 |
897 virtual bool ToBooleanIsTrue() { return handle_->ToBoolean()->IsTrue(); } | 900 virtual bool ToBooleanIsTrue() { return handle_->ToBoolean()->IsTrue(); } |
898 virtual bool ToBooleanIsFalse() { return handle_->ToBoolean()->IsFalse(); } | 901 virtual bool ToBooleanIsFalse() { return handle_->ToBoolean()->IsFalse(); } |
899 | 902 |
900 // Identity testers. | 903 // Identity testers. |
901 bool IsNull() const { return handle_.is_identical_to(Factory::null_value()); } | 904 bool IsNull() const { |
902 bool IsTrue() const { return handle_.is_identical_to(Factory::true_value()); } | 905 ASSERT(!handle_.is_null()); |
| 906 return handle_->IsNull(); |
| 907 } |
| 908 bool IsTrue() const { |
| 909 ASSERT(!handle_.is_null()); |
| 910 return handle_->IsTrue(); |
| 911 } |
903 bool IsFalse() const { | 912 bool IsFalse() const { |
904 return handle_.is_identical_to(Factory::false_value()); | 913 ASSERT(!handle_.is_null()); |
| 914 return handle_->IsFalse(); |
905 } | 915 } |
906 | 916 |
907 Handle<Object> handle() const { return handle_; } | 917 Handle<Object> handle() const { return handle_; } |
908 | 918 |
909 private: | 919 private: |
910 Handle<Object> handle_; | 920 Handle<Object> handle_; |
911 }; | 921 }; |
912 | 922 |
913 | 923 |
914 // Base class for literals that needs space in the corresponding JSFunction. | 924 // Base class for literals that needs space in the corresponding JSFunction. |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1131 VariableProxy(Handle<String> name, bool is_this, bool inside_with); | 1141 VariableProxy(Handle<String> name, bool is_this, bool inside_with); |
1132 explicit VariableProxy(bool is_this); | 1142 explicit VariableProxy(bool is_this); |
1133 | 1143 |
1134 friend class Scope; | 1144 friend class Scope; |
1135 }; | 1145 }; |
1136 | 1146 |
1137 | 1147 |
1138 class VariableProxySentinel: public VariableProxy { | 1148 class VariableProxySentinel: public VariableProxy { |
1139 public: | 1149 public: |
1140 virtual bool IsValidLeftHandSide() { return !is_this(); } | 1150 virtual bool IsValidLeftHandSide() { return !is_this(); } |
1141 static VariableProxySentinel* this_proxy() { return &this_proxy_; } | |
1142 static VariableProxySentinel* identifier_proxy() { | |
1143 return &identifier_proxy_; | |
1144 } | |
1145 | 1151 |
1146 private: | 1152 private: |
1147 explicit VariableProxySentinel(bool is_this) : VariableProxy(is_this) { } | 1153 explicit VariableProxySentinel(bool is_this) : VariableProxy(is_this) { } |
1148 static VariableProxySentinel this_proxy_; | 1154 |
1149 static VariableProxySentinel identifier_proxy_; | 1155 friend class AstSentinels; |
1150 }; | 1156 }; |
1151 | 1157 |
1152 | 1158 |
1153 class Slot: public Expression { | 1159 class Slot: public Expression { |
1154 public: | 1160 public: |
1155 enum Type { | 1161 enum Type { |
1156 // A slot in the parameter section on the stack. index() is | 1162 // A slot in the parameter section on the stack. index() is |
1157 // the parameter index, counting left-to-right, starting at 0. | 1163 // the parameter index, counting left-to-right, starting at 0. |
1158 PARAMETER, | 1164 PARAMETER, |
1159 | 1165 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1246 | 1252 |
1247 // Type feedback information. | 1253 // Type feedback information. |
1248 void RecordTypeFeedback(TypeFeedbackOracle* oracle); | 1254 void RecordTypeFeedback(TypeFeedbackOracle* oracle); |
1249 virtual bool IsMonomorphic() { return is_monomorphic_; } | 1255 virtual bool IsMonomorphic() { return is_monomorphic_; } |
1250 virtual ZoneMapList* GetReceiverTypes() { return receiver_types_; } | 1256 virtual ZoneMapList* GetReceiverTypes() { return receiver_types_; } |
1251 virtual bool IsArrayLength() { return is_array_length_; } | 1257 virtual bool IsArrayLength() { return is_array_length_; } |
1252 virtual Handle<Map> GetMonomorphicReceiverType() { | 1258 virtual Handle<Map> GetMonomorphicReceiverType() { |
1253 return monomorphic_receiver_type_; | 1259 return monomorphic_receiver_type_; |
1254 } | 1260 } |
1255 | 1261 |
1256 // Returns a property singleton property access on 'this'. Used | |
1257 // during preparsing. | |
1258 static Property* this_property() { return &this_property_; } | |
1259 | |
1260 private: | 1262 private: |
1261 Expression* obj_; | 1263 Expression* obj_; |
1262 Expression* key_; | 1264 Expression* key_; |
1263 int pos_; | 1265 int pos_; |
1264 Type type_; | 1266 Type type_; |
1265 | 1267 |
1266 ZoneMapList* receiver_types_; | 1268 ZoneMapList* receiver_types_; |
1267 bool is_monomorphic_ : 1; | 1269 bool is_monomorphic_ : 1; |
1268 bool is_array_length_ : 1; | 1270 bool is_array_length_ : 1; |
1269 bool is_string_length_ : 1; | 1271 bool is_string_length_ : 1; |
1270 bool is_string_access_ : 1; | 1272 bool is_string_access_ : 1; |
1271 bool is_function_prototype_ : 1; | 1273 bool is_function_prototype_ : 1; |
1272 bool is_arguments_access_ : 1; | 1274 bool is_arguments_access_ : 1; |
1273 Handle<Map> monomorphic_receiver_type_; | 1275 Handle<Map> monomorphic_receiver_type_; |
1274 ExternalArrayType array_type_; | 1276 ExternalArrayType array_type_; |
1275 | |
1276 // Dummy property used during preparsing. | |
1277 static Property this_property_; | |
1278 }; | 1277 }; |
1279 | 1278 |
1280 | 1279 |
1281 class Call: public Expression { | 1280 class Call: public Expression { |
1282 public: | 1281 public: |
1283 Call(Expression* expression, ZoneList<Expression*>* arguments, int pos) | 1282 Call(Expression* expression, ZoneList<Expression*>* arguments, int pos) |
1284 : expression_(expression), | 1283 : expression_(expression), |
1285 arguments_(arguments), | 1284 arguments_(arguments), |
1286 pos_(pos), | 1285 pos_(pos), |
1287 is_monomorphic_(false), | 1286 is_monomorphic_(false), |
(...skipping 17 matching lines...) Expand all Loading... |
1305 Handle<JSFunction> target() { return target_; } | 1304 Handle<JSFunction> target() { return target_; } |
1306 Handle<JSObject> holder() { return holder_; } | 1305 Handle<JSObject> holder() { return holder_; } |
1307 Handle<JSGlobalPropertyCell> cell() { return cell_; } | 1306 Handle<JSGlobalPropertyCell> cell() { return cell_; } |
1308 | 1307 |
1309 bool ComputeTarget(Handle<Map> type, Handle<String> name); | 1308 bool ComputeTarget(Handle<Map> type, Handle<String> name); |
1310 bool ComputeGlobalTarget(Handle<GlobalObject> global, Handle<String> name); | 1309 bool ComputeGlobalTarget(Handle<GlobalObject> global, Handle<String> name); |
1311 | 1310 |
1312 // Bailout support. | 1311 // Bailout support. |
1313 int ReturnId() const { return return_id_; } | 1312 int ReturnId() const { return return_id_; } |
1314 | 1313 |
1315 static Call* sentinel() { return &sentinel_; } | |
1316 | |
1317 #ifdef DEBUG | 1314 #ifdef DEBUG |
1318 // Used to assert that the FullCodeGenerator records the return site. | 1315 // Used to assert that the FullCodeGenerator records the return site. |
1319 bool return_is_recorded_; | 1316 bool return_is_recorded_; |
1320 #endif | 1317 #endif |
1321 | 1318 |
1322 private: | 1319 private: |
1323 Expression* expression_; | 1320 Expression* expression_; |
1324 ZoneList<Expression*>* arguments_; | 1321 ZoneList<Expression*>* arguments_; |
1325 int pos_; | 1322 int pos_; |
1326 | 1323 |
1327 bool is_monomorphic_; | 1324 bool is_monomorphic_; |
1328 CheckType check_type_; | 1325 CheckType check_type_; |
1329 ZoneMapList* receiver_types_; | 1326 ZoneMapList* receiver_types_; |
1330 Handle<JSFunction> target_; | 1327 Handle<JSFunction> target_; |
1331 Handle<JSObject> holder_; | 1328 Handle<JSObject> holder_; |
1332 Handle<JSGlobalPropertyCell> cell_; | 1329 Handle<JSGlobalPropertyCell> cell_; |
1333 | 1330 |
1334 int return_id_; | 1331 int return_id_; |
1335 | |
1336 static Call sentinel_; | |
1337 }; | 1332 }; |
1338 | 1333 |
1339 | 1334 |
| 1335 class AstSentinels { |
| 1336 public: |
| 1337 ~AstSentinels() { } |
| 1338 |
| 1339 // Returns a property singleton property access on 'this'. Used |
| 1340 // during preparsing. |
| 1341 Property* this_property() { return &this_property_; } |
| 1342 VariableProxySentinel* this_proxy() { return &this_proxy_; } |
| 1343 VariableProxySentinel* identifier_proxy() { return &identifier_proxy_; } |
| 1344 ValidLeftHandSideSentinel* valid_left_hand_side_sentinel() { |
| 1345 return &valid_left_hand_side_sentinel_; |
| 1346 } |
| 1347 Call* call_sentinel() { return &call_sentinel_; } |
| 1348 EmptyStatement* empty_statement() { return &empty_statement_; } |
| 1349 |
| 1350 private: |
| 1351 AstSentinels(); |
| 1352 VariableProxySentinel this_proxy_; |
| 1353 VariableProxySentinel identifier_proxy_; |
| 1354 ValidLeftHandSideSentinel valid_left_hand_side_sentinel_; |
| 1355 Property this_property_; |
| 1356 Call call_sentinel_; |
| 1357 EmptyStatement empty_statement_; |
| 1358 |
| 1359 friend class Isolate; |
| 1360 |
| 1361 DISALLOW_COPY_AND_ASSIGN(AstSentinels); |
| 1362 }; |
| 1363 |
| 1364 |
1340 class CallNew: public Expression { | 1365 class CallNew: public Expression { |
1341 public: | 1366 public: |
1342 CallNew(Expression* expression, ZoneList<Expression*>* arguments, int pos) | 1367 CallNew(Expression* expression, ZoneList<Expression*>* arguments, int pos) |
1343 : expression_(expression), arguments_(arguments), pos_(pos) { } | 1368 : expression_(expression), arguments_(arguments), pos_(pos) { } |
1344 | 1369 |
1345 DECLARE_NODE_TYPE(CallNew) | 1370 DECLARE_NODE_TYPE(CallNew) |
1346 | 1371 |
1347 virtual bool IsInlineable() const; | 1372 virtual bool IsInlineable() const; |
1348 | 1373 |
1349 Expression* expression() const { return expression_; } | 1374 Expression* expression() const { return expression_; } |
1350 ZoneList<Expression*>* arguments() const { return arguments_; } | 1375 ZoneList<Expression*>* arguments() const { return arguments_; } |
1351 int position() { return pos_; } | 1376 int position() { return pos_; } |
1352 | 1377 |
1353 private: | 1378 private: |
1354 Expression* expression_; | 1379 Expression* expression_; |
1355 ZoneList<Expression*>* arguments_; | 1380 ZoneList<Expression*>* arguments_; |
1356 int pos_; | 1381 int pos_; |
1357 }; | 1382 }; |
1358 | 1383 |
1359 | 1384 |
1360 // The CallRuntime class does not represent any official JavaScript | 1385 // The CallRuntime class does not represent any official JavaScript |
1361 // language construct. Instead it is used to call a C or JS function | 1386 // language construct. Instead it is used to call a C or JS function |
1362 // with a set of arguments. This is used from the builtins that are | 1387 // with a set of arguments. This is used from the builtins that are |
1363 // implemented in JavaScript (see "v8natives.js"). | 1388 // implemented in JavaScript (see "v8natives.js"). |
1364 class CallRuntime: public Expression { | 1389 class CallRuntime: public Expression { |
1365 public: | 1390 public: |
1366 CallRuntime(Handle<String> name, | 1391 CallRuntime(Handle<String> name, |
1367 Runtime::Function* function, | 1392 const Runtime::Function* function, |
1368 ZoneList<Expression*>* arguments) | 1393 ZoneList<Expression*>* arguments) |
1369 : name_(name), function_(function), arguments_(arguments) { } | 1394 : name_(name), function_(function), arguments_(arguments) { } |
1370 | 1395 |
1371 DECLARE_NODE_TYPE(CallRuntime) | 1396 DECLARE_NODE_TYPE(CallRuntime) |
1372 | 1397 |
1373 virtual bool IsInlineable() const; | 1398 virtual bool IsInlineable() const; |
1374 | 1399 |
1375 Handle<String> name() const { return name_; } | 1400 Handle<String> name() const { return name_; } |
1376 Runtime::Function* function() const { return function_; } | 1401 const Runtime::Function* function() const { return function_; } |
1377 ZoneList<Expression*>* arguments() const { return arguments_; } | 1402 ZoneList<Expression*>* arguments() const { return arguments_; } |
1378 bool is_jsruntime() const { return function_ == NULL; } | 1403 bool is_jsruntime() const { return function_ == NULL; } |
1379 | 1404 |
1380 private: | 1405 private: |
1381 Handle<String> name_; | 1406 Handle<String> name_; |
1382 Runtime::Function* function_; | 1407 const Runtime::Function* function_; |
1383 ZoneList<Expression*>* arguments_; | 1408 ZoneList<Expression*>* arguments_; |
1384 }; | 1409 }; |
1385 | 1410 |
1386 | 1411 |
1387 class UnaryOperation: public Expression { | 1412 class UnaryOperation: public Expression { |
1388 public: | 1413 public: |
1389 UnaryOperation(Token::Value op, Expression* expression) | 1414 UnaryOperation(Token::Value op, Expression* expression) |
1390 : op_(op), expression_(expression) { | 1415 : op_(op), expression_(expression) { |
1391 ASSERT(Token::IsUnaryOp(op)); | 1416 ASSERT(Token::IsUnaryOp(op)); |
1392 } | 1417 } |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1700 expected_property_count_(expected_property_count), | 1725 expected_property_count_(expected_property_count), |
1701 has_only_simple_this_property_assignments_( | 1726 has_only_simple_this_property_assignments_( |
1702 has_only_simple_this_property_assignments), | 1727 has_only_simple_this_property_assignments), |
1703 this_property_assignments_(this_property_assignments), | 1728 this_property_assignments_(this_property_assignments), |
1704 num_parameters_(num_parameters), | 1729 num_parameters_(num_parameters), |
1705 start_position_(start_position), | 1730 start_position_(start_position), |
1706 end_position_(end_position), | 1731 end_position_(end_position), |
1707 is_expression_(is_expression), | 1732 is_expression_(is_expression), |
1708 contains_loops_(contains_loops), | 1733 contains_loops_(contains_loops), |
1709 function_token_position_(RelocInfo::kNoPosition), | 1734 function_token_position_(RelocInfo::kNoPosition), |
1710 inferred_name_(Heap::empty_string()), | 1735 inferred_name_(HEAP->empty_string()), |
1711 try_full_codegen_(false), | 1736 try_full_codegen_(false), |
1712 pretenure_(false) { } | 1737 pretenure_(false) { } |
1713 | 1738 |
1714 DECLARE_NODE_TYPE(FunctionLiteral) | 1739 DECLARE_NODE_TYPE(FunctionLiteral) |
1715 | 1740 |
1716 Handle<String> name() const { return name_; } | 1741 Handle<String> name() const { return name_; } |
1717 Scope* scope() const { return scope_; } | 1742 Scope* scope() const { return scope_; } |
1718 ZoneList<Statement*>* body() const { return body_; } | 1743 ZoneList<Statement*>* body() const { return body_; } |
1719 void set_function_token_position(int pos) { function_token_position_ = pos; } | 1744 void set_function_token_position(int pos) { function_token_position_ = pos; } |
1720 int function_token_position() const { return function_token_position_; } | 1745 int function_token_position() const { return function_token_position_; } |
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2182 // Individual AST nodes. | 2207 // Individual AST nodes. |
2183 #define DEF_VISIT(type) \ | 2208 #define DEF_VISIT(type) \ |
2184 virtual void Visit##type(type* node) = 0; | 2209 virtual void Visit##type(type* node) = 0; |
2185 AST_NODE_LIST(DEF_VISIT) | 2210 AST_NODE_LIST(DEF_VISIT) |
2186 #undef DEF_VISIT | 2211 #undef DEF_VISIT |
2187 | 2212 |
2188 private: | 2213 private: |
2189 bool stack_overflow_; | 2214 bool stack_overflow_; |
2190 }; | 2215 }; |
2191 | 2216 |
| 2217 |
2192 } } // namespace v8::internal | 2218 } } // namespace v8::internal |
2193 | 2219 |
2194 #endif // V8_AST_H_ | 2220 #endif // V8_AST_H_ |
OLD | NEW |