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

Side by Side Diff: runtime/vm/ast.h

Issue 22184003: Fix a bug in compilation of try-finally. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 4 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 | runtime/vm/flow_graph_builder.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 (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"
(...skipping 1538 matching lines...) Expand 10 before | Expand all | Expand 10 after
1549 1549
1550 class CatchClauseNode : public AstNode { 1550 class CatchClauseNode : public AstNode {
1551 public: 1551 public:
1552 static const int kInvalidTryIndex = -1; 1552 static const int kInvalidTryIndex = -1;
1553 1553
1554 CatchClauseNode(intptr_t token_pos, 1554 CatchClauseNode(intptr_t token_pos,
1555 SequenceNode* catch_block, 1555 SequenceNode* catch_block,
1556 const Array& handler_types, 1556 const Array& handler_types,
1557 const LocalVariable* context_var, 1557 const LocalVariable* context_var,
1558 const LocalVariable* exception_var, 1558 const LocalVariable* exception_var,
1559 const LocalVariable* stacktrace_var) 1559 const LocalVariable* stacktrace_var,
1560 intptr_t catch_handler_index)
1560 : AstNode(token_pos), 1561 : AstNode(token_pos),
1561 catch_block_(catch_block), 1562 catch_block_(catch_block),
1562 handler_types_(handler_types), 1563 handler_types_(handler_types),
1563 context_var_(*context_var), 1564 context_var_(*context_var),
1564 exception_var_(*exception_var), 1565 exception_var_(*exception_var),
1565 stacktrace_var_(*stacktrace_var) { 1566 stacktrace_var_(*stacktrace_var),
1567 catch_handler_index_(catch_handler_index) {
1566 ASSERT(catch_block_ != NULL); 1568 ASSERT(catch_block_ != NULL);
1567 ASSERT(handler_types.IsZoneHandle()); 1569 ASSERT(handler_types.IsZoneHandle());
1568 ASSERT(context_var != NULL); 1570 ASSERT(context_var != NULL);
1569 ASSERT(exception_var != NULL); 1571 ASSERT(exception_var != NULL);
1570 ASSERT(stacktrace_var != NULL); 1572 ASSERT(stacktrace_var != NULL);
1571 } 1573 }
1572 1574
1573 const Array& handler_types() const { return handler_types_; } 1575 const Array& handler_types() const { return handler_types_; }
1574 const LocalVariable& context_var() const { return context_var_; } 1576 const LocalVariable& context_var() const { return context_var_; }
1575 const LocalVariable& exception_var() const { return exception_var_; } 1577 const LocalVariable& exception_var() const { return exception_var_; }
1576 const LocalVariable& stacktrace_var() const { return stacktrace_var_; } 1578 const LocalVariable& stacktrace_var() const { return stacktrace_var_; }
1579 intptr_t catch_handler_index() const { return catch_handler_index_; }
1577 1580
1578 virtual void VisitChildren(AstNodeVisitor* visitor) const { 1581 virtual void VisitChildren(AstNodeVisitor* visitor) const {
1579 catch_block_->Visit(visitor); 1582 catch_block_->Visit(visitor);
1580 } 1583 }
1581 1584
1582 DECLARE_COMMON_NODE_FUNCTIONS(CatchClauseNode); 1585 DECLARE_COMMON_NODE_FUNCTIONS(CatchClauseNode);
1583 1586
1584 private: 1587 private:
1585 SequenceNode* catch_block_; 1588 SequenceNode* catch_block_;
1586 const Array& handler_types_; 1589 const Array& handler_types_;
1587 const LocalVariable& context_var_; 1590 const LocalVariable& context_var_;
1588 const LocalVariable& exception_var_; 1591 const LocalVariable& exception_var_;
1589 const LocalVariable& stacktrace_var_; 1592 const LocalVariable& stacktrace_var_;
1593 const intptr_t catch_handler_index_;
1590 1594
1591 DISALLOW_COPY_AND_ASSIGN(CatchClauseNode); 1595 DISALLOW_COPY_AND_ASSIGN(CatchClauseNode);
1592 }; 1596 };
1593 1597
1594 1598
1595 class TryCatchNode : public AstNode { 1599 class TryCatchNode : public AstNode {
1596 public: 1600 public:
1597 TryCatchNode(intptr_t token_pos, 1601 TryCatchNode(intptr_t token_pos,
1598 SequenceNode* try_block, 1602 SequenceNode* try_block,
1599 SourceLabel* end_catch_label, 1603 SourceLabel* end_catch_label,
1600 const LocalVariable* context_var, 1604 const LocalVariable* context_var,
1601 CatchClauseNode* catch_block, 1605 CatchClauseNode* catch_block,
1602 SequenceNode* finally_block) 1606 SequenceNode* finally_block,
1607 intptr_t try_index)
1603 : AstNode(token_pos), 1608 : AstNode(token_pos),
1604 try_block_(try_block), 1609 try_block_(try_block),
1605 end_catch_label_(end_catch_label), 1610 end_catch_label_(end_catch_label),
1606 context_var_(*context_var), 1611 context_var_(*context_var),
1607 catch_block_(catch_block), 1612 catch_block_(catch_block),
1608 finally_block_(finally_block) { 1613 finally_block_(finally_block),
1614 try_index_(try_index) {
1609 ASSERT(try_block_ != NULL); 1615 ASSERT(try_block_ != NULL);
1610 ASSERT(context_var != NULL); 1616 ASSERT(context_var != NULL);
1611 ASSERT(catch_block_ != NULL || finally_block_ != NULL); 1617 ASSERT(catch_block_ != NULL || finally_block_ != NULL);
1612 ASSERT(end_catch_label_ != NULL); 1618 ASSERT(end_catch_label_ != NULL);
1613 } 1619 }
1614 1620
1615 SequenceNode* try_block() const { return try_block_; } 1621 SequenceNode* try_block() const { return try_block_; }
1616 SourceLabel* end_catch_label() const { return end_catch_label_; } 1622 SourceLabel* end_catch_label() const { return end_catch_label_; }
1617 CatchClauseNode* catch_block() const { return catch_block_; } 1623 CatchClauseNode* catch_block() const { return catch_block_; }
1618 SequenceNode* finally_block() const { return finally_block_; } 1624 SequenceNode* finally_block() const { return finally_block_; }
1619 const LocalVariable& context_var() const { return context_var_; } 1625 const LocalVariable& context_var() const { return context_var_; }
1626 intptr_t try_index() const { return try_index_; }
1620 1627
1621 virtual void VisitChildren(AstNodeVisitor* visitor) const { 1628 virtual void VisitChildren(AstNodeVisitor* visitor) const {
1622 try_block_->Visit(visitor); 1629 try_block_->Visit(visitor);
1623 if (catch_block_ != NULL) { 1630 if (catch_block_ != NULL) {
1624 catch_block_->Visit(visitor); 1631 catch_block_->Visit(visitor);
1625 } 1632 }
1626 if (finally_block_ != NULL) { 1633 if (finally_block_ != NULL) {
1627 finally_block_->Visit(visitor); 1634 finally_block_->Visit(visitor);
1628 } 1635 }
1629 } 1636 }
1630 1637
1631 DECLARE_COMMON_NODE_FUNCTIONS(TryCatchNode); 1638 DECLARE_COMMON_NODE_FUNCTIONS(TryCatchNode);
1632 1639
1633 private: 1640 private:
1634 SequenceNode* try_block_; 1641 SequenceNode* try_block_;
1635 SourceLabel* end_catch_label_; 1642 SourceLabel* end_catch_label_;
1636 const LocalVariable& context_var_; 1643 const LocalVariable& context_var_;
1637 CatchClauseNode* catch_block_; 1644 CatchClauseNode* catch_block_;
1638 SequenceNode* finally_block_; 1645 SequenceNode* finally_block_;
1646 const intptr_t try_index_;
1639 1647
1640 DISALLOW_COPY_AND_ASSIGN(TryCatchNode); 1648 DISALLOW_COPY_AND_ASSIGN(TryCatchNode);
1641 }; 1649 };
1642 1650
1643 1651
1644 class ThrowNode : public AstNode { 1652 class ThrowNode : public AstNode {
1645 public: 1653 public:
1646 ThrowNode(intptr_t token_pos, AstNode* exception, AstNode* stacktrace) 1654 ThrowNode(intptr_t token_pos, AstNode* exception, AstNode* stacktrace)
1647 : AstNode(token_pos), exception_(exception), stacktrace_(stacktrace) { 1655 : AstNode(token_pos), exception_(exception), stacktrace_(stacktrace) {
1648 ASSERT(exception_ != NULL); 1656 ASSERT(exception_ != NULL);
(...skipping 16 matching lines...) Expand all
1665 AstNode* stacktrace_; 1673 AstNode* stacktrace_;
1666 1674
1667 DISALLOW_IMPLICIT_CONSTRUCTORS(ThrowNode); 1675 DISALLOW_IMPLICIT_CONSTRUCTORS(ThrowNode);
1668 }; 1676 };
1669 1677
1670 1678
1671 class InlinedFinallyNode : public AstNode { 1679 class InlinedFinallyNode : public AstNode {
1672 public: 1680 public:
1673 InlinedFinallyNode(intptr_t token_pos, 1681 InlinedFinallyNode(intptr_t token_pos,
1674 AstNode* finally_block, 1682 AstNode* finally_block,
1675 const LocalVariable* context_var) 1683 const LocalVariable* context_var,
1684 intptr_t try_index)
1676 : AstNode(token_pos), 1685 : AstNode(token_pos),
1677 finally_block_(finally_block), 1686 finally_block_(finally_block),
1678 context_var_(*context_var) { 1687 context_var_(*context_var),
1688 try_index_(try_index) {
1679 ASSERT(finally_block_ != NULL); 1689 ASSERT(finally_block_ != NULL);
1680 ASSERT(context_var != NULL); 1690 ASSERT(context_var != NULL);
1681 } 1691 }
1682 1692
1683 AstNode* finally_block() const { return finally_block_; } 1693 AstNode* finally_block() const { return finally_block_; }
1684 const LocalVariable& context_var() const { return context_var_; } 1694 const LocalVariable& context_var() const { return context_var_; }
1695 intptr_t try_index() const { return try_index_; }
1685 1696
1686 virtual void VisitChildren(AstNodeVisitor* visitor) const { 1697 virtual void VisitChildren(AstNodeVisitor* visitor) const {
1687 finally_block()->Visit(visitor); 1698 finally_block()->Visit(visitor);
1688 } 1699 }
1689 1700
1690 DECLARE_COMMON_NODE_FUNCTIONS(InlinedFinallyNode); 1701 DECLARE_COMMON_NODE_FUNCTIONS(InlinedFinallyNode);
1691 1702
1692 private: 1703 private:
1693 AstNode* finally_block_; 1704 AstNode* finally_block_;
1694 const LocalVariable& context_var_; 1705 const LocalVariable& context_var_;
1706 const intptr_t try_index_;
1695 1707
1696 DISALLOW_IMPLICIT_CONSTRUCTORS(InlinedFinallyNode); 1708 DISALLOW_IMPLICIT_CONSTRUCTORS(InlinedFinallyNode);
1697 }; 1709 };
1698 1710
1699 } // namespace dart 1711 } // namespace dart
1700 1712
1701 #undef DECLARE_COMMON_NODE_FUNCTIONS 1713 #undef DECLARE_COMMON_NODE_FUNCTIONS
1702 1714
1703 #endif // VM_AST_H_ 1715 #endif // VM_AST_H_
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/flow_graph_builder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698