OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #ifndef VM_AST_H_ | 5 #ifndef VM_AST_H_ |
6 #define VM_AST_H_ | 6 #define VM_AST_H_ |
7 | 7 |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "vm/allocation.h" | 9 #include "vm/allocation.h" |
10 #include "vm/growable_array.h" | 10 #include "vm/growable_array.h" |
11 #include "vm/scopes.h" | 11 #include "vm/scopes.h" |
12 #include "vm/object.h" | 12 #include "vm/object.h" |
13 #include "vm/native_entry.h" | 13 #include "vm/native_entry.h" |
14 #include "vm/token.h" | 14 #include "vm/token.h" |
15 | 15 |
16 namespace dart { | 16 namespace dart { |
17 | 17 |
18 #define FOR_EACH_NODE(V) \ | 18 #define FOR_EACH_NODE(V) \ |
19 V(Await) \ | 19 V(Await) \ |
| 20 V(AwaitMarker) \ |
20 V(Return) \ | 21 V(Return) \ |
21 V(Literal) \ | 22 V(Literal) \ |
22 V(Type) \ | 23 V(Type) \ |
23 V(Assignable) \ | 24 V(Assignable) \ |
24 V(BinaryOp) \ | 25 V(BinaryOp) \ |
25 V(BinaryOpWithMask32) \ | 26 V(BinaryOpWithMask32) \ |
26 V(Comparison) \ | 27 V(Comparison) \ |
27 V(UnaryOp) \ | 28 V(UnaryOp) \ |
28 V(ConditionalExpr) \ | 29 V(ConditionalExpr) \ |
29 V(If) \ | 30 V(If) \ |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 | 162 |
162 DECLARE_COMMON_NODE_FUNCTIONS(AwaitNode); | 163 DECLARE_COMMON_NODE_FUNCTIONS(AwaitNode); |
163 | 164 |
164 private: | 165 private: |
165 AstNode* expr_; | 166 AstNode* expr_; |
166 | 167 |
167 DISALLOW_COPY_AND_ASSIGN(AwaitNode); | 168 DISALLOW_COPY_AND_ASSIGN(AwaitNode); |
168 }; | 169 }; |
169 | 170 |
170 | 171 |
| 172 // AwaitMarker nodes are used to generate markers that the FlowGraphBuilder |
| 173 // relies on. They can occur in two kinds: |
| 174 // 1) kNewContinuationState: A marker indicating that a new await state needs to |
| 175 // be added to a function preamble. This type also triggers storing of the |
| 176 // current context. |
| 177 // 2) kTargetForContinuation: A marker indicating an entry point for the most |
| 178 // recent generated state. |
| 179 // |
| 180 // In general it is expected (ASSERT) that the different kinds of markers reach |
| 181 // the FlowGraphBuilder in alternating order. That is: |
| 182 // <new state> -> <other nodes> -> <target> -> <other nodes> -> |
| 183 // <new state> -> ... |
| 184 class AwaitMarkerNode : public AstNode { |
| 185 public: |
| 186 enum MarkerType { |
| 187 kNewContinuationState, |
| 188 kTargetForContinuation, |
| 189 }; |
| 190 |
| 191 explicit AwaitMarkerNode(MarkerType marker_type) |
| 192 : AstNode(Scanner::kNoSourcePos), |
| 193 marker_type_(marker_type) { } |
| 194 |
| 195 void VisitChildren(AstNodeVisitor* visitor) const { } |
| 196 |
| 197 MarkerType marker_type() const { |
| 198 return marker_type_; |
| 199 } |
| 200 |
| 201 LocalScope* scope() const { return scope_; } |
| 202 void set_scope(LocalScope* scope) { scope_ = scope; } |
| 203 |
| 204 DECLARE_COMMON_NODE_FUNCTIONS(AwaitMarkerNode); |
| 205 |
| 206 private: |
| 207 MarkerType marker_type_; |
| 208 LocalScope* scope_; |
| 209 |
| 210 DISALLOW_COPY_AND_ASSIGN(AwaitMarkerNode); |
| 211 }; |
| 212 |
| 213 |
171 class SequenceNode : public AstNode { | 214 class SequenceNode : public AstNode { |
172 public: | 215 public: |
173 SequenceNode(intptr_t token_pos, LocalScope* scope) | 216 SequenceNode(intptr_t token_pos, LocalScope* scope) |
174 : AstNode(token_pos), | 217 : AstNode(token_pos), |
175 scope_(scope), | 218 scope_(scope), |
176 nodes_(4), | 219 nodes_(4), |
177 label_(NULL) { | 220 label_(NULL) { |
178 } | 221 } |
179 | 222 |
180 LocalScope* scope() const { return scope_; } | 223 LocalScope* scope() const { return scope_; } |
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 | 572 |
530 DECLARE_COMMON_NODE_FUNCTIONS(PrimaryNode); | 573 DECLARE_COMMON_NODE_FUNCTIONS(PrimaryNode); |
531 | 574 |
532 private: | 575 private: |
533 const Object& primary_; | 576 const Object& primary_; |
534 bool is_deferred_reference_; | 577 bool is_deferred_reference_; |
535 | 578 |
536 DISALLOW_IMPLICIT_CONSTRUCTORS(PrimaryNode); | 579 DISALLOW_IMPLICIT_CONSTRUCTORS(PrimaryNode); |
537 }; | 580 }; |
538 | 581 |
539 | 582 // Return nodes can be of different types: |
540 // TODO(mlippautz): Implement return nodes that are used to return from a | 583 // * A regular return node that in the case of async functions gets replaced |
541 // continuation. | 584 // with appropriate completer calls. This kind is generated by dart code. |
| 585 // * A continuation return that just returns from a function. This kind is |
| 586 // generated by AST transformers. |
542 class ReturnNode : public AstNode { | 587 class ReturnNode : public AstNode { |
543 public: | 588 public: |
| 589 enum ReturnType { |
| 590 kRegular, |
| 591 kContinuation, |
| 592 }; |
| 593 |
544 // Return from a void function returns the null object. | 594 // Return from a void function returns the null object. |
545 explicit ReturnNode(intptr_t token_pos) | 595 explicit ReturnNode(intptr_t token_pos) |
546 : AstNode(token_pos), | 596 : AstNode(token_pos), |
547 value_(new LiteralNode(token_pos, Instance::ZoneHandle())), | 597 value_(new LiteralNode(token_pos, Instance::ZoneHandle())), |
548 inlined_finally_list_(), | 598 inlined_finally_list_(), |
549 is_regular_return_(true) { } | 599 return_type_(kRegular) { } |
550 // Return from a non-void function. | 600 // Return from a non-void function. |
551 ReturnNode(intptr_t token_pos, | 601 ReturnNode(intptr_t token_pos, |
552 AstNode* value) | 602 AstNode* value) |
553 : AstNode(token_pos), | 603 : AstNode(token_pos), |
554 value_(value), | 604 value_(value), |
555 inlined_finally_list_(), | 605 inlined_finally_list_(), |
556 is_regular_return_(true) { | 606 return_type_(kRegular) { |
557 ASSERT(value_ != NULL); | 607 ASSERT(value_ != NULL); |
558 } | 608 } |
559 | 609 |
560 AstNode* value() const { return value_; } | 610 AstNode* value() const { return value_; } |
561 | 611 |
562 intptr_t inlined_finally_list_length() const { | 612 intptr_t inlined_finally_list_length() const { |
563 return inlined_finally_list_.length(); | 613 return inlined_finally_list_.length(); |
564 } | 614 } |
565 InlinedFinallyNode* InlinedFinallyNodeAt(intptr_t index) const { | 615 InlinedFinallyNode* InlinedFinallyNodeAt(intptr_t index) const { |
566 return inlined_finally_list_[index]; | 616 return inlined_finally_list_[index]; |
567 } | 617 } |
568 void AddInlinedFinallyNode(InlinedFinallyNode* finally_node) { | 618 void AddInlinedFinallyNode(InlinedFinallyNode* finally_node) { |
569 inlined_finally_list_.Add(finally_node); | 619 inlined_finally_list_.Add(finally_node); |
570 } | 620 } |
571 | 621 |
572 virtual void VisitChildren(AstNodeVisitor* visitor) const { | 622 virtual void VisitChildren(AstNodeVisitor* visitor) const { |
573 if (value() != NULL) { | 623 if (value() != NULL) { |
574 value()->Visit(visitor); | 624 value()->Visit(visitor); |
575 } | 625 } |
576 } | 626 } |
577 | 627 |
578 void set_scope(LocalScope* scope) { scope_ = scope; } | 628 void set_scope(LocalScope* scope) { scope_ = scope; } |
579 LocalScope* scope() const { return scope_; } | 629 LocalScope* scope() const { return scope_; } |
580 | 630 |
581 // Returns false if the return node is used to return from a continuation. | 631 ReturnType return_type() const { return return_type_; } |
582 bool is_regular_return() const { return is_regular_return_; } | 632 void set_return_type(ReturnType type) { return_type_ = type; } |
583 | 633 |
584 DECLARE_COMMON_NODE_FUNCTIONS(ReturnNode); | 634 DECLARE_COMMON_NODE_FUNCTIONS(ReturnNode); |
585 | 635 |
586 private: | 636 private: |
587 AstNode* value_; | 637 AstNode* value_; |
588 GrowableArray<InlinedFinallyNode*> inlined_finally_list_; | 638 GrowableArray<InlinedFinallyNode*> inlined_finally_list_; |
589 LocalScope* scope_; | 639 LocalScope* scope_; |
590 bool is_regular_return_; | 640 ReturnType return_type_; |
591 | 641 |
592 DISALLOW_COPY_AND_ASSIGN(ReturnNode); | 642 DISALLOW_COPY_AND_ASSIGN(ReturnNode); |
593 }; | 643 }; |
594 | 644 |
595 | 645 |
596 class ComparisonNode : public AstNode { | 646 class ComparisonNode : public AstNode { |
597 public: | 647 public: |
598 ComparisonNode(intptr_t token_pos, | 648 ComparisonNode(intptr_t token_pos, |
599 Token::Kind kind, | 649 Token::Kind kind, |
600 AstNode* left, | 650 AstNode* left, |
(...skipping 1247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1848 const intptr_t try_index_; | 1898 const intptr_t try_index_; |
1849 | 1899 |
1850 DISALLOW_IMPLICIT_CONSTRUCTORS(InlinedFinallyNode); | 1900 DISALLOW_IMPLICIT_CONSTRUCTORS(InlinedFinallyNode); |
1851 }; | 1901 }; |
1852 | 1902 |
1853 } // namespace dart | 1903 } // namespace dart |
1854 | 1904 |
1855 #undef DECLARE_COMMON_NODE_FUNCTIONS | 1905 #undef DECLARE_COMMON_NODE_FUNCTIONS |
1856 | 1906 |
1857 #endif // VM_AST_H_ | 1907 #endif // VM_AST_H_ |
OLD | NEW |