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

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: Update comment. Created 5 years, 9 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);
741
742 bool get hasTypeInformation => typeInformation != null;
737 743
738 accept(ExpressionVisitor visitor) => visitor.visitCreateInstance(this); 744 accept(ExpressionVisitor visitor) => visitor.visitCreateInstance(this);
739 accept1(ExpressionVisitor1 visitor, arg) { 745 accept1(ExpressionVisitor1 visitor, arg) {
740 return visitor.visitCreateInstance(this, arg); 746 return visitor.visitCreateInstance(this, arg);
741 } 747 }
742 } 748 }
743 749
744 class GetField extends Expression implements JsSpecificNode { 750 class GetField extends Expression implements JsSpecificNode {
745 Expression object; 751 Expression object;
746 Element field; 752 Element field;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
785 791
786 accept(ExpressionVisitor visitor) { 792 accept(ExpressionVisitor visitor) {
787 return visitor.visitReadTypeVariable(this); 793 return visitor.visitReadTypeVariable(this);
788 } 794 }
789 795
790 accept1(ExpressionVisitor1 visitor, arg) { 796 accept1(ExpressionVisitor1 visitor, arg) {
791 return visitor.visitReadTypeVariable(this, arg); 797 return visitor.visitReadTypeVariable(this, arg);
792 } 798 }
793 } 799 }
794 800
801 /// Denotes the internal representation of [dartType], where all type variables
802 /// are replaced by the values in [arguments].
803 /// (See documentation on the TypeExpression CPS node for more details.)
804 class TypeExpression extends Expression {
805 final DartType dartType;
806 final List<Expression> arguments;
807
808 TypeExpression(this.dartType, this.arguments);
809
810 accept(ExpressionVisitor visitor) {
811 return visitor.visitTypeExpression(this);
812 }
813
814 accept1(ExpressionVisitor1 visitor, arg) {
815 return visitor.visitTypeExpression(this, arg);
816 }
817 }
818
795 abstract class ExpressionVisitor<E> { 819 abstract class ExpressionVisitor<E> {
796 E visitExpression(Expression e) => e.accept(this); 820 E visitExpression(Expression e) => e.accept(this);
797 E visitVariableUse(VariableUse node); 821 E visitVariableUse(VariableUse node);
798 E visitInvokeStatic(InvokeStatic node); 822 E visitInvokeStatic(InvokeStatic node);
799 E visitInvokeMethod(InvokeMethod node); 823 E visitInvokeMethod(InvokeMethod node);
800 E visitInvokeMethodDirectly(InvokeMethodDirectly node); 824 E visitInvokeMethodDirectly(InvokeMethodDirectly node);
801 E visitInvokeConstructor(InvokeConstructor node); 825 E visitInvokeConstructor(InvokeConstructor node);
802 E visitConcatenateStrings(ConcatenateStrings node); 826 E visitConcatenateStrings(ConcatenateStrings node);
803 E visitConstant(Constant node); 827 E visitConstant(Constant node);
804 E visitThis(This node); 828 E visitThis(This node);
805 E visitReifyTypeVar(ReifyTypeVar node); 829 E visitReifyTypeVar(ReifyTypeVar node);
806 E visitConditional(Conditional node); 830 E visitConditional(Conditional node);
807 E visitLogicalOperator(LogicalOperator node); 831 E visitLogicalOperator(LogicalOperator node);
808 E visitNot(Not node); 832 E visitNot(Not node);
809 E visitLiteralList(LiteralList node); 833 E visitLiteralList(LiteralList node);
810 E visitLiteralMap(LiteralMap node); 834 E visitLiteralMap(LiteralMap node);
811 E visitTypeOperator(TypeOperator node); 835 E visitTypeOperator(TypeOperator node);
812 E visitFunctionExpression(FunctionExpression node); 836 E visitFunctionExpression(FunctionExpression node);
813 E visitFieldInitializer(FieldInitializer node); 837 E visitFieldInitializer(FieldInitializer node);
814 E visitSuperInitializer(SuperInitializer node); 838 E visitSuperInitializer(SuperInitializer node);
815 E visitGetField(GetField node); 839 E visitGetField(GetField node);
816 E visitCreateBox(CreateBox node); 840 E visitCreateBox(CreateBox node);
817 E visitCreateInstance(CreateInstance node); 841 E visitCreateInstance(CreateInstance node);
818 E visitReifyRuntimeType(ReifyRuntimeType node); 842 E visitReifyRuntimeType(ReifyRuntimeType node);
819 E visitReadTypeVariable(ReadTypeVariable node); 843 E visitReadTypeVariable(ReadTypeVariable node);
844 E visitTypeExpression(TypeExpression node);
820 } 845 }
821 846
822 abstract class ExpressionVisitor1<E, A> { 847 abstract class ExpressionVisitor1<E, A> {
823 E visitExpression(Expression e, A arg) => e.accept1(this, arg); 848 E visitExpression(Expression e, A arg) => e.accept1(this, arg);
824 E visitVariableUse(VariableUse node, A arg); 849 E visitVariableUse(VariableUse node, A arg);
825 E visitInvokeStatic(InvokeStatic node, A arg); 850 E visitInvokeStatic(InvokeStatic node, A arg);
826 E visitInvokeMethod(InvokeMethod node, A arg); 851 E visitInvokeMethod(InvokeMethod node, A arg);
827 E visitInvokeMethodDirectly(InvokeMethodDirectly node, A arg); 852 E visitInvokeMethodDirectly(InvokeMethodDirectly node, A arg);
828 E visitInvokeConstructor(InvokeConstructor node, A arg); 853 E visitInvokeConstructor(InvokeConstructor node, A arg);
829 E visitConcatenateStrings(ConcatenateStrings node, A arg); 854 E visitConcatenateStrings(ConcatenateStrings node, A arg);
830 E visitConstant(Constant node, A arg); 855 E visitConstant(Constant node, A arg);
831 E visitThis(This node, A arg); 856 E visitThis(This node, A arg);
832 E visitReifyTypeVar(ReifyTypeVar node, A arg); 857 E visitReifyTypeVar(ReifyTypeVar node, A arg);
833 E visitConditional(Conditional node, A arg); 858 E visitConditional(Conditional node, A arg);
834 E visitLogicalOperator(LogicalOperator node, A arg); 859 E visitLogicalOperator(LogicalOperator node, A arg);
835 E visitNot(Not node, A arg); 860 E visitNot(Not node, A arg);
836 E visitLiteralList(LiteralList node, A arg); 861 E visitLiteralList(LiteralList node, A arg);
837 E visitLiteralMap(LiteralMap node, A arg); 862 E visitLiteralMap(LiteralMap node, A arg);
838 E visitTypeOperator(TypeOperator node, A arg); 863 E visitTypeOperator(TypeOperator node, A arg);
839 E visitFunctionExpression(FunctionExpression node, A arg); 864 E visitFunctionExpression(FunctionExpression node, A arg);
840 E visitFieldInitializer(FieldInitializer node, A arg); 865 E visitFieldInitializer(FieldInitializer node, A arg);
841 E visitSuperInitializer(SuperInitializer node, A arg); 866 E visitSuperInitializer(SuperInitializer node, A arg);
842 E visitGetField(GetField node, A arg); 867 E visitGetField(GetField node, A arg);
843 E visitCreateBox(CreateBox node, A arg); 868 E visitCreateBox(CreateBox node, A arg);
844 E visitCreateInstance(CreateInstance node, A arg); 869 E visitCreateInstance(CreateInstance node, A arg);
845 E visitReifyRuntimeType(ReifyRuntimeType reifyRuntimeType, A arg); 870 E visitReifyRuntimeType(ReifyRuntimeType node, A arg);
846 E visitReadTypeVariable(ReadTypeVariable readTypeVariable, A arg); 871 E visitReadTypeVariable(ReadTypeVariable node, A arg);
872 E visitTypeExpression(TypeExpression node, A arg);
847 } 873 }
848 874
849 abstract class StatementVisitor<S> { 875 abstract class StatementVisitor<S> {
850 S visitStatement(Statement s) => s.accept(this); 876 S visitStatement(Statement s) => s.accept(this);
851 S visitLabeledStatement(LabeledStatement node); 877 S visitLabeledStatement(LabeledStatement node);
852 S visitAssign(Assign node); 878 S visitAssign(Assign node);
853 S visitReturn(Return node); 879 S visitReturn(Return node);
854 S visitBreak(Break node); 880 S visitBreak(Break node);
855 S visitContinue(Continue node); 881 S visitContinue(Continue node);
856 S visitIf(If node); 882 S visitIf(If node);
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
1058 visitExpression(node.object); 1084 visitExpression(node.object);
1059 visitExpression(node.value); 1085 visitExpression(node.value);
1060 visitStatement(node.next); 1086 visitStatement(node.next);
1061 } 1087 }
1062 1088
1063 visitCreateBox(CreateBox node) { 1089 visitCreateBox(CreateBox node) {
1064 } 1090 }
1065 1091
1066 visitCreateInstance(CreateInstance node) { 1092 visitCreateInstance(CreateInstance node) {
1067 node.arguments.forEach(visitExpression); 1093 node.arguments.forEach(visitExpression);
1094 if (node.hasTypeInformation) {
1095 node.typeInformation.forEach(visitExpression);
1096 }
1068 } 1097 }
1069 1098
1070 visitReifyRuntimeType(ReifyRuntimeType node) { 1099 visitReifyRuntimeType(ReifyRuntimeType node) {
1071 visitExpression(node.value); 1100 visitExpression(node.value);
1072 } 1101 }
1073 1102
1074 visitReadTypeVariable(ReadTypeVariable node) { 1103 visitReadTypeVariable(ReadTypeVariable node) {
1075 visitExpression(node.target); 1104 visitExpression(node.target);
1076 } 1105 }
1106
1107 @override
1108 visitTypeExpression(TypeExpression node) {
1109 node.arguments.forEach(visitExpression);
1110 }
1077 } 1111 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698