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

Side by Side Diff: pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart

Issue 1011403003: cps-ir: Set runtime type information for new objects that require it. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address comments. Created 5 years, 8 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
OLDNEW
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, TypeVariableType; 9 import '../dart_types.dart' show DartType, GenericType, InterfaceType, TypeVaria bleType;
10 import '../elements/elements.dart'; 10 import '../elements/elements.dart';
11 import '../io/source_information.dart' show SourceInformation; 11 import '../io/source_information.dart' show SourceInformation;
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 15
16 // The Tree language is the target of translation out of the CPS-based IR. 16 // The Tree language is the target of translation out of the CPS-based IR.
17 // 17 //
18 // The translation from CPS to Dart consists of several stages. Among the 18 // The translation from CPS to Dart consists of several stages. Among the
19 // stages are translation to direct style, translation out of SSA, eliminating 19 // stages are translation to direct style, translation out of SSA, eliminating
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 class InvokeConstructor extends Expression implements Invoke { 215 class InvokeConstructor extends Expression implements Invoke {
216 final DartType type; 216 final DartType type;
217 final FunctionElement target; 217 final FunctionElement target;
218 final List<Expression> arguments; 218 final List<Expression> arguments;
219 final Selector selector; 219 final Selector selector;
220 /// TODO(karlklose): get rid of this field. Instead use the constant's 220 /// TODO(karlklose): get rid of this field. Instead use the constant's
221 /// expression to find the constructor to be called in dart2dart. 221 /// expression to find the constructor to be called in dart2dart.
222 final values.ConstantValue constant; 222 final values.ConstantValue constant;
223 223
224 InvokeConstructor(this.type, this.target, this.selector, this.arguments, 224 InvokeConstructor(this.type, this.target, this.selector, this.arguments,
225 [this.constant]); 225 [this.constant]);
226 226
227 ClassElement get targetClass => target.enclosingElement; 227 ClassElement get targetClass => target.enclosingElement;
228 228
229 accept(ExpressionVisitor visitor) => visitor.visitInvokeConstructor(this); 229 accept(ExpressionVisitor visitor) {
230 return visitor.visitInvokeConstructor(this);
231 }
232
230 accept1(ExpressionVisitor1 visitor, arg) { 233 accept1(ExpressionVisitor1 visitor, arg) {
231 return visitor.visitInvokeConstructor(this, arg); 234 return visitor.visitInvokeConstructor(this, arg);
232 } 235 }
233 } 236 }
234 237
235 /// Calls [toString] on each argument and concatenates the results. 238 /// Calls [toString] on each argument and concatenates the results.
236 class ConcatenateStrings extends Expression { 239 class ConcatenateStrings extends Expression {
237 final List<Expression> arguments; 240 final List<Expression> arguments;
238 241
239 ConcatenateStrings(this.arguments); 242 ConcatenateStrings(this.arguments);
(...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after
725 abstract class DartSpecificNode implements Node {} 728 abstract class DartSpecificNode implements Node {}
726 729
727 class CreateBox extends Expression implements JsSpecificNode { 730 class CreateBox extends Expression implements JsSpecificNode {
728 accept(ExpressionVisitor visitor) => visitor.visitCreateBox(this); 731 accept(ExpressionVisitor visitor) => visitor.visitCreateBox(this);
729 accept1(ExpressionVisitor1 visitor, arg) => visitor.visitCreateBox(this, arg); 732 accept1(ExpressionVisitor1 visitor, arg) => visitor.visitCreateBox(this, arg);
730 } 733 }
731 734
732 class CreateInstance extends Expression implements JsSpecificNode { 735 class CreateInstance extends Expression implements JsSpecificNode {
733 ClassElement classElement; 736 ClassElement classElement;
734 List<Expression> arguments; 737 List<Expression> arguments;
738 List<Expression> typeInformation;
735 739
736 CreateInstance(this.classElement, this.arguments); 740 CreateInstance(this.classElement, this.arguments, this.typeInformation);
737 741
738 accept(ExpressionVisitor visitor) => visitor.visitCreateInstance(this); 742 accept(ExpressionVisitor visitor) => visitor.visitCreateInstance(this);
739 accept1(ExpressionVisitor1 visitor, arg) { 743 accept1(ExpressionVisitor1 visitor, arg) {
740 return visitor.visitCreateInstance(this, arg); 744 return visitor.visitCreateInstance(this, arg);
741 } 745 }
742 } 746 }
743 747
744 class GetField extends Expression implements JsSpecificNode { 748 class GetField extends Expression implements JsSpecificNode {
745 Expression object; 749 Expression object;
746 Element field; 750 Element field;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
785 789
786 accept(ExpressionVisitor visitor) { 790 accept(ExpressionVisitor visitor) {
787 return visitor.visitReadTypeVariable(this); 791 return visitor.visitReadTypeVariable(this);
788 } 792 }
789 793
790 accept1(ExpressionVisitor1 visitor, arg) { 794 accept1(ExpressionVisitor1 visitor, arg) {
791 return visitor.visitReadTypeVariable(this, arg); 795 return visitor.visitReadTypeVariable(this, arg);
792 } 796 }
793 } 797 }
794 798
799 /// Denotes the internal representation of [dartType], where all type variables
800 /// are replaced by the values in [arguments].
801 /// (See documentation on the TypeExpression CPS node for more details.)
802 class TypeExpression extends Expression {
803 final DartType dartType;
804 final List<Expression> arguments;
805
806 TypeExpression(this.dartType, this.arguments);
807
808 accept(ExpressionVisitor visitor) {
809 return visitor.visitTypeExpression(this);
810 }
811
812 accept1(ExpressionVisitor1 visitor, arg) {
813 return visitor.visitTypeExpression(this, arg);
814 }
815 }
816
795 abstract class ExpressionVisitor<E> { 817 abstract class ExpressionVisitor<E> {
796 E visitExpression(Expression e) => e.accept(this); 818 E visitExpression(Expression e) => e.accept(this);
797 E visitVariableUse(VariableUse node); 819 E visitVariableUse(VariableUse node);
798 E visitInvokeStatic(InvokeStatic node); 820 E visitInvokeStatic(InvokeStatic node);
799 E visitInvokeMethod(InvokeMethod node); 821 E visitInvokeMethod(InvokeMethod node);
800 E visitInvokeMethodDirectly(InvokeMethodDirectly node); 822 E visitInvokeMethodDirectly(InvokeMethodDirectly node);
801 E visitInvokeConstructor(InvokeConstructor node); 823 E visitInvokeConstructor(InvokeConstructor node);
802 E visitConcatenateStrings(ConcatenateStrings node); 824 E visitConcatenateStrings(ConcatenateStrings node);
803 E visitConstant(Constant node); 825 E visitConstant(Constant node);
804 E visitThis(This node); 826 E visitThis(This node);
805 E visitReifyTypeVar(ReifyTypeVar node); 827 E visitReifyTypeVar(ReifyTypeVar node);
806 E visitConditional(Conditional node); 828 E visitConditional(Conditional node);
807 E visitLogicalOperator(LogicalOperator node); 829 E visitLogicalOperator(LogicalOperator node);
808 E visitNot(Not node); 830 E visitNot(Not node);
809 E visitLiteralList(LiteralList node); 831 E visitLiteralList(LiteralList node);
810 E visitLiteralMap(LiteralMap node); 832 E visitLiteralMap(LiteralMap node);
811 E visitTypeOperator(TypeOperator node); 833 E visitTypeOperator(TypeOperator node);
812 E visitFunctionExpression(FunctionExpression node); 834 E visitFunctionExpression(FunctionExpression node);
813 E visitFieldInitializer(FieldInitializer node); 835 E visitFieldInitializer(FieldInitializer node);
814 E visitSuperInitializer(SuperInitializer node); 836 E visitSuperInitializer(SuperInitializer node);
815 E visitGetField(GetField node); 837 E visitGetField(GetField node);
816 E visitCreateBox(CreateBox node); 838 E visitCreateBox(CreateBox node);
817 E visitCreateInstance(CreateInstance node); 839 E visitCreateInstance(CreateInstance node);
818 E visitReifyRuntimeType(ReifyRuntimeType node); 840 E visitReifyRuntimeType(ReifyRuntimeType node);
819 E visitReadTypeVariable(ReadTypeVariable node); 841 E visitReadTypeVariable(ReadTypeVariable node);
842 E visitTypeExpression(TypeExpression node);
820 } 843 }
821 844
822 abstract class ExpressionVisitor1<E, A> { 845 abstract class ExpressionVisitor1<E, A> {
823 E visitExpression(Expression e, A arg) => e.accept1(this, arg); 846 E visitExpression(Expression e, A arg) => e.accept1(this, arg);
824 E visitVariableUse(VariableUse node, A arg); 847 E visitVariableUse(VariableUse node, A arg);
825 E visitInvokeStatic(InvokeStatic node, A arg); 848 E visitInvokeStatic(InvokeStatic node, A arg);
826 E visitInvokeMethod(InvokeMethod node, A arg); 849 E visitInvokeMethod(InvokeMethod node, A arg);
827 E visitInvokeMethodDirectly(InvokeMethodDirectly node, A arg); 850 E visitInvokeMethodDirectly(InvokeMethodDirectly node, A arg);
828 E visitInvokeConstructor(InvokeConstructor node, A arg); 851 E visitInvokeConstructor(InvokeConstructor node, A arg);
829 E visitConcatenateStrings(ConcatenateStrings node, A arg); 852 E visitConcatenateStrings(ConcatenateStrings node, A arg);
830 E visitConstant(Constant node, A arg); 853 E visitConstant(Constant node, A arg);
831 E visitThis(This node, A arg); 854 E visitThis(This node, A arg);
832 E visitReifyTypeVar(ReifyTypeVar node, A arg); 855 E visitReifyTypeVar(ReifyTypeVar node, A arg);
833 E visitConditional(Conditional node, A arg); 856 E visitConditional(Conditional node, A arg);
834 E visitLogicalOperator(LogicalOperator node, A arg); 857 E visitLogicalOperator(LogicalOperator node, A arg);
835 E visitNot(Not node, A arg); 858 E visitNot(Not node, A arg);
836 E visitLiteralList(LiteralList node, A arg); 859 E visitLiteralList(LiteralList node, A arg);
837 E visitLiteralMap(LiteralMap node, A arg); 860 E visitLiteralMap(LiteralMap node, A arg);
838 E visitTypeOperator(TypeOperator node, A arg); 861 E visitTypeOperator(TypeOperator node, A arg);
839 E visitFunctionExpression(FunctionExpression node, A arg); 862 E visitFunctionExpression(FunctionExpression node, A arg);
840 E visitFieldInitializer(FieldInitializer node, A arg); 863 E visitFieldInitializer(FieldInitializer node, A arg);
841 E visitSuperInitializer(SuperInitializer node, A arg); 864 E visitSuperInitializer(SuperInitializer node, A arg);
842 E visitGetField(GetField node, A arg); 865 E visitGetField(GetField node, A arg);
843 E visitCreateBox(CreateBox node, A arg); 866 E visitCreateBox(CreateBox node, A arg);
844 E visitCreateInstance(CreateInstance node, A arg); 867 E visitCreateInstance(CreateInstance node, A arg);
845 E visitReifyRuntimeType(ReifyRuntimeType reifyRuntimeType, A arg); 868 E visitReifyRuntimeType(ReifyRuntimeType node, A arg);
846 E visitReadTypeVariable(ReadTypeVariable readTypeVariable, A arg); 869 E visitReadTypeVariable(ReadTypeVariable node, A arg);
870 E visitTypeExpression(TypeExpression node, A arg);
847 } 871 }
848 872
849 abstract class StatementVisitor<S> { 873 abstract class StatementVisitor<S> {
850 S visitStatement(Statement s) => s.accept(this); 874 S visitStatement(Statement s) => s.accept(this);
851 S visitLabeledStatement(LabeledStatement node); 875 S visitLabeledStatement(LabeledStatement node);
852 S visitAssign(Assign node); 876 S visitAssign(Assign node);
853 S visitReturn(Return node); 877 S visitReturn(Return node);
854 S visitBreak(Break node); 878 S visitBreak(Break node);
855 S visitContinue(Continue node); 879 S visitContinue(Continue node);
856 S visitIf(If node); 880 S visitIf(If node);
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
1058 visitExpression(node.object); 1082 visitExpression(node.object);
1059 visitExpression(node.value); 1083 visitExpression(node.value);
1060 visitStatement(node.next); 1084 visitStatement(node.next);
1061 } 1085 }
1062 1086
1063 visitCreateBox(CreateBox node) { 1087 visitCreateBox(CreateBox node) {
1064 } 1088 }
1065 1089
1066 visitCreateInstance(CreateInstance node) { 1090 visitCreateInstance(CreateInstance node) {
1067 node.arguments.forEach(visitExpression); 1091 node.arguments.forEach(visitExpression);
1092 node.typeInformation.forEach(visitExpression);
1068 } 1093 }
1069 1094
1070 visitReifyRuntimeType(ReifyRuntimeType node) { 1095 visitReifyRuntimeType(ReifyRuntimeType node) {
1071 visitExpression(node.value); 1096 visitExpression(node.value);
1072 } 1097 }
1073 1098
1074 visitReadTypeVariable(ReadTypeVariable node) { 1099 visitReadTypeVariable(ReadTypeVariable node) {
1075 visitExpression(node.target); 1100 visitExpression(node.target);
1076 } 1101 }
1102
1103 @override
1104 visitTypeExpression(TypeExpression node) {
1105 node.arguments.forEach(visitExpression);
1106 }
1077 } 1107 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart ('k') | pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698