| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_AST_H_ | 5 #ifndef V8_AST_H_ |
| 6 #define V8_AST_H_ | 6 #define V8_AST_H_ |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/assembler.h" | 10 #include "src/assembler.h" |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 // Forward declarations | 107 // Forward declarations |
| 108 class AstNodeFactory; | 108 class AstNodeFactory; |
| 109 class AstVisitor; | 109 class AstVisitor; |
| 110 class Declaration; | 110 class Declaration; |
| 111 class Module; | 111 class Module; |
| 112 class BreakableStatement; | 112 class BreakableStatement; |
| 113 class Expression; | 113 class Expression; |
| 114 class IterationStatement; | 114 class IterationStatement; |
| 115 class MaterializedLiteral; | 115 class MaterializedLiteral; |
| 116 class Statement; | 116 class Statement; |
| 117 class TargetCollector; | |
| 118 class TypeFeedbackOracle; | 117 class TypeFeedbackOracle; |
| 119 | 118 |
| 120 class RegExpAlternative; | 119 class RegExpAlternative; |
| 121 class RegExpAssertion; | 120 class RegExpAssertion; |
| 122 class RegExpAtom; | 121 class RegExpAtom; |
| 123 class RegExpBackReference; | 122 class RegExpBackReference; |
| 124 class RegExpCapture; | 123 class RegExpCapture; |
| 125 class RegExpCharacterClass; | 124 class RegExpCharacterClass; |
| 126 class RegExpCompiler; | 125 class RegExpCompiler; |
| 127 class RegExpDisjunction; | 126 class RegExpDisjunction; |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 bool Is##type() const { return node_type() == AstNode::k##type; } \ | 217 bool Is##type() const { return node_type() == AstNode::k##type; } \ |
| 219 type* As##type() { \ | 218 type* As##type() { \ |
| 220 return Is##type() ? reinterpret_cast<type*>(this) : NULL; \ | 219 return Is##type() ? reinterpret_cast<type*>(this) : NULL; \ |
| 221 } \ | 220 } \ |
| 222 const type* As##type() const { \ | 221 const type* As##type() const { \ |
| 223 return Is##type() ? reinterpret_cast<const type*>(this) : NULL; \ | 222 return Is##type() ? reinterpret_cast<const type*>(this) : NULL; \ |
| 224 } | 223 } |
| 225 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) | 224 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
| 226 #undef DECLARE_NODE_FUNCTIONS | 225 #undef DECLARE_NODE_FUNCTIONS |
| 227 | 226 |
| 228 virtual TargetCollector* AsTargetCollector() { return NULL; } | |
| 229 virtual BreakableStatement* AsBreakableStatement() { return NULL; } | 227 virtual BreakableStatement* AsBreakableStatement() { return NULL; } |
| 230 virtual IterationStatement* AsIterationStatement() { return NULL; } | 228 virtual IterationStatement* AsIterationStatement() { return NULL; } |
| 231 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } | 229 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } |
| 232 | 230 |
| 233 // The interface for feedback slots, with default no-op implementations for | 231 // The interface for feedback slots, with default no-op implementations for |
| 234 // node types which don't actually have this. Note that this is conceptually | 232 // node types which don't actually have this. Note that this is conceptually |
| 235 // not really nice, but multiple inheritance would introduce yet another | 233 // not really nice, but multiple inheritance would introduce yet another |
| 236 // vtable entry per node, something we don't want for space reasons. | 234 // vtable entry per node, something we don't want for space reasons. |
| 237 virtual FeedbackVectorRequirements ComputeFeedbackRequirements( | 235 virtual FeedbackVectorRequirements ComputeFeedbackRequirements( |
| 238 Isolate* isolate) { | 236 Isolate* isolate) { |
| (...skipping 984 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1223 private: | 1221 private: |
| 1224 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1222 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1225 | 1223 |
| 1226 Expression* condition_; | 1224 Expression* condition_; |
| 1227 Statement* then_statement_; | 1225 Statement* then_statement_; |
| 1228 Statement* else_statement_; | 1226 Statement* else_statement_; |
| 1229 int base_id_; | 1227 int base_id_; |
| 1230 }; | 1228 }; |
| 1231 | 1229 |
| 1232 | 1230 |
| 1233 // NOTE: TargetCollectors are represented as nodes to fit in the target | |
| 1234 // stack in the compiler; this should probably be reworked. | |
| 1235 class TargetCollector FINAL : public AstNode { | |
| 1236 public: | |
| 1237 explicit TargetCollector(Zone* zone) | |
| 1238 : AstNode(RelocInfo::kNoPosition), targets_(0, zone) { } | |
| 1239 | |
| 1240 // Adds a jump target to the collector. The collector stores a pointer not | |
| 1241 // a copy of the target to make binding work, so make sure not to pass in | |
| 1242 // references to something on the stack. | |
| 1243 void AddTarget(Label* target, Zone* zone); | |
| 1244 | |
| 1245 // Virtual behaviour. TargetCollectors are never part of the AST. | |
| 1246 void Accept(AstVisitor* v) OVERRIDE { UNREACHABLE(); } | |
| 1247 NodeType node_type() const OVERRIDE { return kInvalid; } | |
| 1248 TargetCollector* AsTargetCollector() OVERRIDE { return this; } | |
| 1249 | |
| 1250 ZoneList<Label*>* targets() { return &targets_; } | |
| 1251 | |
| 1252 private: | |
| 1253 ZoneList<Label*> targets_; | |
| 1254 }; | |
| 1255 | |
| 1256 | |
| 1257 class TryStatement : public Statement { | 1231 class TryStatement : public Statement { |
| 1258 public: | 1232 public: |
| 1259 void set_escaping_targets(ZoneList<Label*>* targets) { | |
| 1260 escaping_targets_ = targets; | |
| 1261 } | |
| 1262 | |
| 1263 int index() const { return index_; } | 1233 int index() const { return index_; } |
| 1264 Block* try_block() const { return try_block_; } | 1234 Block* try_block() const { return try_block_; } |
| 1265 ZoneList<Label*>* escaping_targets() const { return escaping_targets_; } | |
| 1266 | 1235 |
| 1267 protected: | 1236 protected: |
| 1268 TryStatement(Zone* zone, int index, Block* try_block, int pos) | 1237 TryStatement(Zone* zone, int index, Block* try_block, int pos) |
| 1269 : Statement(zone, pos), | 1238 : Statement(zone, pos), index_(index), try_block_(try_block) {} |
| 1270 index_(index), | |
| 1271 try_block_(try_block), | |
| 1272 escaping_targets_(NULL) { } | |
| 1273 | 1239 |
| 1274 private: | 1240 private: |
| 1275 // Unique (per-function) index of this handler. This is not an AST ID. | 1241 // Unique (per-function) index of this handler. This is not an AST ID. |
| 1276 int index_; | 1242 int index_; |
| 1277 | 1243 |
| 1278 Block* try_block_; | 1244 Block* try_block_; |
| 1279 ZoneList<Label*>* escaping_targets_; | |
| 1280 }; | 1245 }; |
| 1281 | 1246 |
| 1282 | 1247 |
| 1283 class TryCatchStatement FINAL : public TryStatement { | 1248 class TryCatchStatement FINAL : public TryStatement { |
| 1284 public: | 1249 public: |
| 1285 DECLARE_NODE_TYPE(TryCatchStatement) | 1250 DECLARE_NODE_TYPE(TryCatchStatement) |
| 1286 | 1251 |
| 1287 Scope* scope() { return scope_; } | 1252 Scope* scope() { return scope_; } |
| 1288 Variable* variable() { return variable_; } | 1253 Variable* variable() { return variable_; } |
| 1289 Block* catch_block() const { return catch_block_; } | 1254 Block* catch_block() const { return catch_block_; } |
| (...skipping 2257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3547 | 3512 |
| 3548 private: | 3513 private: |
| 3549 Zone* zone_; | 3514 Zone* zone_; |
| 3550 AstValueFactory* ast_value_factory_; | 3515 AstValueFactory* ast_value_factory_; |
| 3551 }; | 3516 }; |
| 3552 | 3517 |
| 3553 | 3518 |
| 3554 } } // namespace v8::internal | 3519 } } // namespace v8::internal |
| 3555 | 3520 |
| 3556 #endif // V8_AST_H_ | 3521 #endif // V8_AST_H_ |
| OLD | NEW |