| 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 |