| 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 '../dart_types.dart' show DartType, GenericType; | 9 import '../dart_types.dart' show DartType, GenericType, TypeVariableType; |
| 10 import '../elements/elements.dart'; | 10 import '../elements/elements.dart'; |
| 11 import '../universe/universe.dart'; | 11 import '../universe/universe.dart'; |
| 12 import '../universe/universe.dart' show Selector; | 12 import '../universe/universe.dart' show Selector; |
| 13 import 'optimization/optimization.dart'; | 13 import 'optimization/optimization.dart'; |
| 14 | 14 |
| 15 // The Tree language is the target of translation out of the CPS-based IR. | 15 // The Tree language is the target of translation out of the CPS-based IR. |
| 16 // | 16 // |
| 17 // The translation from CPS to Dart consists of several stages. Among the | 17 // The translation from CPS to Dart consists of several stages. Among the |
| 18 // stages are translation to direct style, translation out of SSA, eliminating | 18 // stages are translation to direct style, translation out of SSA, eliminating |
| 19 // unnecessary names, recognizing high-level control constructs. Combining | 19 // unnecessary names, recognizing high-level control constructs. Combining |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 accept1(ExpressionVisitor1 visitor, arg) => visitor.visitConstant(this, arg); | 223 accept1(ExpressionVisitor1 visitor, arg) => visitor.visitConstant(this, arg); |
| 224 | 224 |
| 225 values.ConstantValue get value => expression.value; | 225 values.ConstantValue get value => expression.value; |
| 226 } | 226 } |
| 227 | 227 |
| 228 class This extends Expression { | 228 class This extends Expression { |
| 229 accept(ExpressionVisitor visitor) => visitor.visitThis(this); | 229 accept(ExpressionVisitor visitor) => visitor.visitThis(this); |
| 230 accept1(ExpressionVisitor1 visitor, arg) => visitor.visitThis(this, arg); | 230 accept1(ExpressionVisitor1 visitor, arg) => visitor.visitThis(this, arg); |
| 231 } | 231 } |
| 232 | 232 |
| 233 class ReifyTypeVar extends Expression { | 233 class ReifyTypeVar extends Expression implements DartSpecificNode { |
| 234 TypeVariableElement typeVariable; | 234 TypeVariableElement typeVariable; |
| 235 | 235 |
| 236 ReifyTypeVar(this.typeVariable); | 236 ReifyTypeVar(this.typeVariable); |
| 237 | 237 |
| 238 accept(ExpressionVisitor visitor) => visitor.visitReifyTypeVar(this); | 238 accept(ExpressionVisitor visitor) => visitor.visitReifyTypeVar(this); |
| 239 accept1(ExpressionVisitor1 visitor, arg) { | 239 accept1(ExpressionVisitor1 visitor, arg) { |
| 240 return visitor.visitReifyTypeVar(this, arg); | 240 return visitor.visitReifyTypeVar(this, arg); |
| 241 } | 241 } |
| 242 } | 242 } |
| 243 | 243 |
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 710 Element field; | 710 Element field; |
| 711 Expression value; | 711 Expression value; |
| 712 Statement next; | 712 Statement next; |
| 713 | 713 |
| 714 SetField(this.object, this.field, this.value, this.next); | 714 SetField(this.object, this.field, this.value, this.next); |
| 715 | 715 |
| 716 accept(StatementVisitor visitor) => visitor.visitSetField(this); | 716 accept(StatementVisitor visitor) => visitor.visitSetField(this); |
| 717 accept1(StatementVisitor1 visitor, arg) => visitor.visitSetField(this, arg); | 717 accept1(StatementVisitor1 visitor, arg) => visitor.visitSetField(this, arg); |
| 718 } | 718 } |
| 719 | 719 |
| 720 class ReifyRuntimeType extends Expression implements JsSpecificNode { |
| 721 Expression value; |
| 722 |
| 723 ReifyRuntimeType(this.value); |
| 724 |
| 725 accept(ExpressionVisitor visitor) { |
| 726 return visitor.visitReifyRuntimeType(this); |
| 727 } |
| 728 |
| 729 accept1(ExpressionVisitor1 visitor, arg) { |
| 730 return visitor.visitReifyRuntimeType(this, arg); |
| 731 } |
| 732 } |
| 733 |
| 734 class ReadTypeVariable extends Expression implements JsSpecificNode { |
| 735 final TypeVariableType variable; |
| 736 final ClassElement context; |
| 737 Expression target; |
| 738 |
| 739 ReadTypeVariable(this.variable, this.context, this.target); |
| 740 |
| 741 accept(ExpressionVisitor visitor) { |
| 742 return visitor.visitReadTypeVariable(this); |
| 743 } |
| 744 |
| 745 accept1(ExpressionVisitor1 visitor, arg) { |
| 746 return visitor.visitReadTypeVariable(this, arg); |
| 747 } |
| 748 } |
| 749 |
| 720 abstract class ExpressionVisitor<E> { | 750 abstract class ExpressionVisitor<E> { |
| 721 E visitExpression(Expression e) => e.accept(this); | 751 E visitExpression(Expression e) => e.accept(this); |
| 722 E visitVariable(Variable node); | 752 E visitVariable(Variable node); |
| 723 E visitInvokeStatic(InvokeStatic node); | 753 E visitInvokeStatic(InvokeStatic node); |
| 724 E visitInvokeMethod(InvokeMethod node); | 754 E visitInvokeMethod(InvokeMethod node); |
| 725 E visitInvokeMethodDirectly(InvokeMethodDirectly node); | 755 E visitInvokeMethodDirectly(InvokeMethodDirectly node); |
| 726 E visitInvokeConstructor(InvokeConstructor node); | 756 E visitInvokeConstructor(InvokeConstructor node); |
| 727 E visitConcatenateStrings(ConcatenateStrings node); | 757 E visitConcatenateStrings(ConcatenateStrings node); |
| 728 E visitConstant(Constant node); | 758 E visitConstant(Constant node); |
| 729 E visitThis(This node); | 759 E visitThis(This node); |
| 730 E visitReifyTypeVar(ReifyTypeVar node); | 760 E visitReifyTypeVar(ReifyTypeVar node); |
| 731 E visitConditional(Conditional node); | 761 E visitConditional(Conditional node); |
| 732 E visitLogicalOperator(LogicalOperator node); | 762 E visitLogicalOperator(LogicalOperator node); |
| 733 E visitNot(Not node); | 763 E visitNot(Not node); |
| 734 E visitLiteralList(LiteralList node); | 764 E visitLiteralList(LiteralList node); |
| 735 E visitLiteralMap(LiteralMap node); | 765 E visitLiteralMap(LiteralMap node); |
| 736 E visitTypeOperator(TypeOperator node); | 766 E visitTypeOperator(TypeOperator node); |
| 737 E visitFunctionExpression(FunctionExpression node); | 767 E visitFunctionExpression(FunctionExpression node); |
| 738 E visitFieldInitializer(FieldInitializer node); | 768 E visitFieldInitializer(FieldInitializer node); |
| 739 E visitSuperInitializer(SuperInitializer node); | 769 E visitSuperInitializer(SuperInitializer node); |
| 740 E visitGetField(GetField node); | 770 E visitGetField(GetField node); |
| 741 E visitCreateBox(CreateBox node); | 771 E visitCreateBox(CreateBox node); |
| 742 E visitCreateInstance(CreateInstance node); | 772 E visitCreateInstance(CreateInstance node); |
| 773 E visitReifyRuntimeType(ReifyRuntimeType node); |
| 774 E visitReadTypeVariable(ReadTypeVariable node); |
| 743 } | 775 } |
| 744 | 776 |
| 745 abstract class ExpressionVisitor1<E, A> { | 777 abstract class ExpressionVisitor1<E, A> { |
| 746 E visitExpression(Expression e, A arg) => e.accept1(this, arg); | 778 E visitExpression(Expression e, A arg) => e.accept1(this, arg); |
| 747 E visitVariable(Variable node, A arg); | 779 E visitVariable(Variable node, A arg); |
| 748 E visitInvokeStatic(InvokeStatic node, A arg); | 780 E visitInvokeStatic(InvokeStatic node, A arg); |
| 749 E visitInvokeMethod(InvokeMethod node, A arg); | 781 E visitInvokeMethod(InvokeMethod node, A arg); |
| 750 E visitInvokeMethodDirectly(InvokeMethodDirectly node, A arg); | 782 E visitInvokeMethodDirectly(InvokeMethodDirectly node, A arg); |
| 751 E visitInvokeConstructor(InvokeConstructor node, A arg); | 783 E visitInvokeConstructor(InvokeConstructor node, A arg); |
| 752 E visitConcatenateStrings(ConcatenateStrings node, A arg); | 784 E visitConcatenateStrings(ConcatenateStrings node, A arg); |
| 753 E visitConstant(Constant node, A arg); | 785 E visitConstant(Constant node, A arg); |
| 754 E visitThis(This node, A arg); | 786 E visitThis(This node, A arg); |
| 755 E visitReifyTypeVar(ReifyTypeVar node, A arg); | 787 E visitReifyTypeVar(ReifyTypeVar node, A arg); |
| 756 E visitConditional(Conditional node, A arg); | 788 E visitConditional(Conditional node, A arg); |
| 757 E visitLogicalOperator(LogicalOperator node, A arg); | 789 E visitLogicalOperator(LogicalOperator node, A arg); |
| 758 E visitNot(Not node, A arg); | 790 E visitNot(Not node, A arg); |
| 759 E visitLiteralList(LiteralList node, A arg); | 791 E visitLiteralList(LiteralList node, A arg); |
| 760 E visitLiteralMap(LiteralMap node, A arg); | 792 E visitLiteralMap(LiteralMap node, A arg); |
| 761 E visitTypeOperator(TypeOperator node, A arg); | 793 E visitTypeOperator(TypeOperator node, A arg); |
| 762 E visitFunctionExpression(FunctionExpression node, A arg); | 794 E visitFunctionExpression(FunctionExpression node, A arg); |
| 763 E visitFieldInitializer(FieldInitializer node, A arg); | 795 E visitFieldInitializer(FieldInitializer node, A arg); |
| 764 E visitSuperInitializer(SuperInitializer node, A arg); | 796 E visitSuperInitializer(SuperInitializer node, A arg); |
| 765 E visitGetField(GetField node, A arg); | 797 E visitGetField(GetField node, A arg); |
| 766 E visitCreateBox(CreateBox node, A arg); | 798 E visitCreateBox(CreateBox node, A arg); |
| 767 E visitCreateInstance(CreateInstance node, A arg); | 799 E visitCreateInstance(CreateInstance node, A arg); |
| 800 E visitReifyRuntimeType(ReifyRuntimeType reifyRuntimeType, A arg); |
| 801 E visitReadTypeVariable(ReadTypeVariable readTypeVariable, A arg); |
| 768 } | 802 } |
| 769 | 803 |
| 770 abstract class StatementVisitor<S> { | 804 abstract class StatementVisitor<S> { |
| 771 S visitStatement(Statement s) => s.accept(this); | 805 S visitStatement(Statement s) => s.accept(this); |
| 772 S visitLabeledStatement(LabeledStatement node); | 806 S visitLabeledStatement(LabeledStatement node); |
| 773 S visitAssign(Assign node); | 807 S visitAssign(Assign node); |
| 774 S visitReturn(Return node); | 808 S visitReturn(Return node); |
| 775 S visitBreak(Break node); | 809 S visitBreak(Break node); |
| 776 S visitContinue(Continue node); | 810 S visitContinue(Continue node); |
| 777 S visitIf(If node); | 811 S visitIf(If node); |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 947 visitExpression(node.value); | 981 visitExpression(node.value); |
| 948 visitStatement(node.next); | 982 visitStatement(node.next); |
| 949 } | 983 } |
| 950 | 984 |
| 951 visitCreateBox(CreateBox node) { | 985 visitCreateBox(CreateBox node) { |
| 952 } | 986 } |
| 953 | 987 |
| 954 visitCreateInstance(CreateInstance node) { | 988 visitCreateInstance(CreateInstance node) { |
| 955 node.arguments.forEach(visitExpression); | 989 node.arguments.forEach(visitExpression); |
| 956 } | 990 } |
| 991 |
| 992 visitReifyRuntimeType(ReifyRuntimeType node) { |
| 993 visitExpression(node.value); |
| 994 } |
| 995 |
| 996 visitReadTypeVariable(ReadTypeVariable node) { |
| 997 visitExpression(node.target); |
| 998 } |
| 957 } | 999 } |
| OLD | NEW |