OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 library tree_ir_nodes; | 5 library tree_ir_nodes; |
6 | 6 |
7 import '../constants/expressions.dart'; | 7 import '../constants/expressions.dart'; |
8 import '../constants/values.dart' as values; | 8 import '../constants/values.dart' as values; |
9 import '../cps_ir/cps_ir_nodes.dart' as cps_ir; | 9 import '../cps_ir/cps_ir_nodes.dart' as cps_ir; |
10 import '../dart_types.dart' show DartType, GenericType; | 10 import '../dart_types.dart' show DartType, GenericType; |
11 import '../elements/elements.dart'; | 11 import '../elements/elements.dart'; |
12 import '../universe/universe.dart'; | 12 import '../universe/universe.dart'; |
13 import '../universe/universe.dart' show Selector; | 13 import '../universe/universe.dart' show Selector; |
14 import 'optimization/optimization.dart'; | 14 import 'optimization/optimization.dart'; |
| 15 import '../closure.dart' show ClosureClassElement; |
15 | 16 |
16 // The Tree language is the target of translation out of the CPS-based IR. | 17 // The Tree language is the target of translation out of the CPS-based IR. |
17 // | 18 // |
18 // The translation from CPS to Dart consists of several stages. Among the | 19 // The translation from CPS to Dart consists of several stages. Among the |
19 // stages are translation to direct style, translation out of SSA, eliminating | 20 // stages are translation to direct style, translation out of SSA, eliminating |
20 // unnecessary names, recognizing high-level control constructs. Combining | 21 // unnecessary names, recognizing high-level control constructs. Combining |
21 // these separate concerns is complicated and the constraints of the CPS-based | 22 // these separate concerns is complicated and the constraints of the CPS-based |
22 // language do not permit a multi-stage translation. | 23 // language do not permit a multi-stage translation. |
23 // | 24 // |
24 // For that reason, CPS is translated to the direct-style language Tree. | 25 // For that reason, CPS is translated to the direct-style language Tree. |
(...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 Statement body, | 644 Statement body, |
644 this.initializers, | 645 this.initializers, |
645 List<ConstDeclaration> localConstants, | 646 List<ConstDeclaration> localConstants, |
646 List<ConstantExpression> defaultParameterValues) | 647 List<ConstantExpression> defaultParameterValues) |
647 : super(element, parameters, body, localConstants, | 648 : super(element, parameters, body, localConstants, |
648 defaultParameterValues); | 649 defaultParameterValues); |
649 | 650 |
650 applyPass(Pass pass) => pass.rewriteConstructorDefinition(this); | 651 applyPass(Pass pass) => pass.rewriteConstructorDefinition(this); |
651 } | 652 } |
652 | 653 |
| 654 abstract class JsSpecificNode implements Node {} |
| 655 |
| 656 class CreateBox extends Expression implements JsSpecificNode { |
| 657 accept(ExpressionVisitor visitor) => visitor.visitCreateBox(this); |
| 658 accept1(ExpressionVisitor1 visitor, arg) => visitor.visitCreateBox(this, arg); |
| 659 } |
| 660 |
| 661 class CreateClosureClass extends Expression implements JsSpecificNode { |
| 662 ClosureClassElement classElement; |
| 663 List<Expression> arguments; |
| 664 |
| 665 CreateClosureClass(this.classElement, this.arguments); |
| 666 |
| 667 accept(ExpressionVisitor visitor) => visitor.visitCreateClosureClass(this); |
| 668 accept1(ExpressionVisitor1 visitor, arg) { |
| 669 return visitor.visitCreateClosureClass(this, arg); |
| 670 } |
| 671 } |
| 672 |
| 673 class GetField extends Expression implements JsSpecificNode { |
| 674 Expression object; |
| 675 Element field; |
| 676 |
| 677 GetField(this.object, this.field); |
| 678 |
| 679 accept(ExpressionVisitor visitor) => visitor.visitGetField(this); |
| 680 accept1(ExpressionVisitor1 visitor, arg) => visitor.visitGetField(this, arg); |
| 681 } |
| 682 |
| 683 class SetField extends Statement implements JsSpecificNode { |
| 684 Expression object; |
| 685 Element field; |
| 686 Expression value; |
| 687 Statement next; |
| 688 |
| 689 SetField(this.object, this.field, this.value, this.next); |
| 690 |
| 691 accept(StatementVisitor visitor) => visitor.visitSetField(this); |
| 692 accept1(StatementVisitor1 visitor, arg) => visitor.visitSetField(this, arg); |
| 693 } |
| 694 |
653 abstract class ExpressionVisitor<E> { | 695 abstract class ExpressionVisitor<E> { |
654 E visitExpression(Expression e) => e.accept(this); | 696 E visitExpression(Expression e) => e.accept(this); |
655 E visitVariable(Variable node); | 697 E visitVariable(Variable node); |
656 E visitInvokeStatic(InvokeStatic node); | 698 E visitInvokeStatic(InvokeStatic node); |
657 E visitInvokeMethod(InvokeMethod node); | 699 E visitInvokeMethod(InvokeMethod node); |
658 E visitInvokeSuperMethod(InvokeSuperMethod node); | 700 E visitInvokeSuperMethod(InvokeSuperMethod node); |
659 E visitInvokeConstructor(InvokeConstructor node); | 701 E visitInvokeConstructor(InvokeConstructor node); |
660 E visitConcatenateStrings(ConcatenateStrings node); | 702 E visitConcatenateStrings(ConcatenateStrings node); |
661 E visitConstant(Constant node); | 703 E visitConstant(Constant node); |
662 E visitThis(This node); | 704 E visitThis(This node); |
663 E visitReifyTypeVar(ReifyTypeVar node); | 705 E visitReifyTypeVar(ReifyTypeVar node); |
664 E visitConditional(Conditional node); | 706 E visitConditional(Conditional node); |
665 E visitLogicalOperator(LogicalOperator node); | 707 E visitLogicalOperator(LogicalOperator node); |
666 E visitNot(Not node); | 708 E visitNot(Not node); |
667 E visitLiteralList(LiteralList node); | 709 E visitLiteralList(LiteralList node); |
668 E visitLiteralMap(LiteralMap node); | 710 E visitLiteralMap(LiteralMap node); |
669 E visitTypeOperator(TypeOperator node); | 711 E visitTypeOperator(TypeOperator node); |
670 E visitFunctionExpression(FunctionExpression node); | 712 E visitFunctionExpression(FunctionExpression node); |
671 E visitFieldInitializer(FieldInitializer node); | 713 E visitFieldInitializer(FieldInitializer node); |
672 E visitSuperInitializer(SuperInitializer node); | 714 E visitSuperInitializer(SuperInitializer node); |
| 715 E visitGetField(GetField node); |
| 716 E visitCreateBox(CreateBox node); |
| 717 E visitCreateClosureClass(CreateClosureClass node); |
673 } | 718 } |
674 | 719 |
675 abstract class ExpressionVisitor1<E, A> { | 720 abstract class ExpressionVisitor1<E, A> { |
676 E visitExpression(Expression e, A arg) => e.accept1(this, arg); | 721 E visitExpression(Expression e, A arg) => e.accept1(this, arg); |
677 E visitVariable(Variable node, A arg); | 722 E visitVariable(Variable node, A arg); |
678 E visitInvokeStatic(InvokeStatic node, A arg); | 723 E visitInvokeStatic(InvokeStatic node, A arg); |
679 E visitInvokeMethod(InvokeMethod node, A arg); | 724 E visitInvokeMethod(InvokeMethod node, A arg); |
680 E visitInvokeSuperMethod(InvokeSuperMethod node, A arg); | 725 E visitInvokeSuperMethod(InvokeSuperMethod node, A arg); |
681 E visitInvokeConstructor(InvokeConstructor node, A arg); | 726 E visitInvokeConstructor(InvokeConstructor node, A arg); |
682 E visitConcatenateStrings(ConcatenateStrings node, A arg); | 727 E visitConcatenateStrings(ConcatenateStrings node, A arg); |
683 E visitConstant(Constant node, A arg); | 728 E visitConstant(Constant node, A arg); |
684 E visitThis(This node, A arg); | 729 E visitThis(This node, A arg); |
685 E visitReifyTypeVar(ReifyTypeVar node, A arg); | 730 E visitReifyTypeVar(ReifyTypeVar node, A arg); |
686 E visitConditional(Conditional node, A arg); | 731 E visitConditional(Conditional node, A arg); |
687 E visitLogicalOperator(LogicalOperator node, A arg); | 732 E visitLogicalOperator(LogicalOperator node, A arg); |
688 E visitNot(Not node, A arg); | 733 E visitNot(Not node, A arg); |
689 E visitLiteralList(LiteralList node, A arg); | 734 E visitLiteralList(LiteralList node, A arg); |
690 E visitLiteralMap(LiteralMap node, A arg); | 735 E visitLiteralMap(LiteralMap node, A arg); |
691 E visitTypeOperator(TypeOperator node, A arg); | 736 E visitTypeOperator(TypeOperator node, A arg); |
692 E visitFunctionExpression(FunctionExpression node, A arg); | 737 E visitFunctionExpression(FunctionExpression node, A arg); |
693 E visitFieldInitializer(FieldInitializer node, A arg); | 738 E visitFieldInitializer(FieldInitializer node, A arg); |
694 E visitSuperInitializer(SuperInitializer node, A arg); | 739 E visitSuperInitializer(SuperInitializer node, A arg); |
| 740 E visitGetField(GetField node, A arg); |
| 741 E visitCreateBox(CreateBox node, A arg); |
| 742 E visitCreateClosureClass(CreateClosureClass node, A arg); |
695 } | 743 } |
696 | 744 |
697 abstract class StatementVisitor<S> { | 745 abstract class StatementVisitor<S> { |
698 S visitStatement(Statement s) => s.accept(this); | 746 S visitStatement(Statement s) => s.accept(this); |
699 S visitLabeledStatement(LabeledStatement node); | 747 S visitLabeledStatement(LabeledStatement node); |
700 S visitAssign(Assign node); | 748 S visitAssign(Assign node); |
701 S visitReturn(Return node); | 749 S visitReturn(Return node); |
702 S visitBreak(Break node); | 750 S visitBreak(Break node); |
703 S visitContinue(Continue node); | 751 S visitContinue(Continue node); |
704 S visitIf(If node); | 752 S visitIf(If node); |
705 S visitWhileTrue(WhileTrue node); | 753 S visitWhileTrue(WhileTrue node); |
706 S visitWhileCondition(WhileCondition node); | 754 S visitWhileCondition(WhileCondition node); |
707 S visitFunctionDeclaration(FunctionDeclaration node); | 755 S visitFunctionDeclaration(FunctionDeclaration node); |
708 S visitExpressionStatement(ExpressionStatement node); | 756 S visitExpressionStatement(ExpressionStatement node); |
| 757 S visitSetField(SetField node); |
709 } | 758 } |
710 | 759 |
711 abstract class StatementVisitor1<S, A> { | 760 abstract class StatementVisitor1<S, A> { |
712 S visitStatement(Statement s, A arg) => s.accept1(this, arg); | 761 S visitStatement(Statement s, A arg) => s.accept1(this, arg); |
713 S visitLabeledStatement(LabeledStatement node, A arg); | 762 S visitLabeledStatement(LabeledStatement node, A arg); |
714 S visitAssign(Assign node, A arg); | 763 S visitAssign(Assign node, A arg); |
715 S visitReturn(Return node, A arg); | 764 S visitReturn(Return node, A arg); |
716 S visitBreak(Break node, A arg); | 765 S visitBreak(Break node, A arg); |
717 S visitContinue(Continue node, A arg); | 766 S visitContinue(Continue node, A arg); |
718 S visitIf(If node, A arg); | 767 S visitIf(If node, A arg); |
719 S visitWhileTrue(WhileTrue node, A arg); | 768 S visitWhileTrue(WhileTrue node, A arg); |
720 S visitWhileCondition(WhileCondition node, A arg); | 769 S visitWhileCondition(WhileCondition node, A arg); |
721 S visitFunctionDeclaration(FunctionDeclaration node, A arg); | 770 S visitFunctionDeclaration(FunctionDeclaration node, A arg); |
722 S visitExpressionStatement(ExpressionStatement node, A arg); | 771 S visitExpressionStatement(ExpressionStatement node, A arg); |
| 772 S visitSetField(SetField node, A arg); |
723 } | 773 } |
724 | 774 |
725 abstract class Visitor<S, E> implements ExpressionVisitor<E>, | 775 abstract class Visitor<S, E> implements ExpressionVisitor<E>, |
726 StatementVisitor<S> { | 776 StatementVisitor<S> { |
727 E visitExpression(Expression e) => e.accept(this); | 777 E visitExpression(Expression e) => e.accept(this); |
728 S visitStatement(Statement s) => s.accept(this); | 778 S visitStatement(Statement s) => s.accept(this); |
729 } | 779 } |
730 | 780 |
731 abstract class Visitor1<S, E, A> implements ExpressionVisitor1<E, A>, | 781 abstract class Visitor1<S, E, A> implements ExpressionVisitor1<E, A>, |
732 StatementVisitor1<S, A> { | 782 StatementVisitor1<S, A> { |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
847 visitStatement(node.next); | 897 visitStatement(node.next); |
848 } | 898 } |
849 | 899 |
850 visitFieldInitializer(FieldInitializer node) { | 900 visitFieldInitializer(FieldInitializer node) { |
851 visitStatement(node.body); | 901 visitStatement(node.body); |
852 } | 902 } |
853 | 903 |
854 visitSuperInitializer(SuperInitializer node) { | 904 visitSuperInitializer(SuperInitializer node) { |
855 node.arguments.forEach(visitStatement); | 905 node.arguments.forEach(visitStatement); |
856 } | 906 } |
| 907 |
| 908 visitGetField(GetField node) { |
| 909 visitExpression(node.object); |
| 910 } |
| 911 |
| 912 visitSetField(SetField node) { |
| 913 visitExpression(node.object); |
| 914 visitExpression(node.value); |
| 915 visitStatement(node.next); |
| 916 } |
| 917 |
| 918 visitCreateBox(CreateBox node) { |
| 919 } |
| 920 |
| 921 visitCreateClosureClass(CreateClosureClass node) { |
| 922 node.arguments.forEach(visitExpression); |
| 923 } |
857 } | 924 } |
OLD | NEW |