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

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: 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 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 } 209 }
210 } 210 }
211 211
212 /** 212 /**
213 * Call to a factory or generative constructor. 213 * Call to a factory or generative constructor.
214 */ 214 */
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 List<Expression> typeArguments;
219 final Selector selector; 220 final Selector selector;
220 /// TODO(karlklose): get rid of this field. Instead use the constant's 221 /// TODO(karlklose): get rid of this field. Instead use the constant's
221 /// expression to find the constructor to be called in dart2dart. 222 /// expression to find the constructor to be called in dart2dart.
222 final values.ConstantValue constant; 223 final values.ConstantValue constant;
223 224
224 InvokeConstructor(this.type, this.target, this.selector, this.arguments, 225 InvokeConstructor(this.type, this.target, this.selector, this.arguments,
225 [this.constant]); 226 this.typeArguments, [this.constant]);
226 227
227 ClassElement get targetClass => target.enclosingElement; 228 ClassElement get targetClass => target.enclosingElement;
228 229
229 accept(ExpressionVisitor visitor) => visitor.visitInvokeConstructor(this); 230 accept(ExpressionVisitor visitor) {
231 return visitor.visitInvokeConstructor(this);
232 }
233
230 accept1(ExpressionVisitor1 visitor, arg) { 234 accept1(ExpressionVisitor1 visitor, arg) {
231 return visitor.visitInvokeConstructor(this, arg); 235 return visitor.visitInvokeConstructor(this, arg);
232 } 236 }
233 } 237 }
234 238
235 /// Calls [toString] on each argument and concatenates the results. 239 /// Calls [toString] on each argument and concatenates the results.
236 class ConcatenateStrings extends Expression { 240 class ConcatenateStrings extends Expression {
237 final List<Expression> arguments; 241 final List<Expression> arguments;
238 242
239 ConcatenateStrings(this.arguments); 243 ConcatenateStrings(this.arguments);
(...skipping 545 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 class TypeExpression extends Expression {
802 final DartType dartType;
803 final List<Expression> arguments;
804
805 TypeExpression(this.dartType, this.arguments);
806
807 accept(ExpressionVisitor visitor) {
808 return visitor.visitTypeExpression(this);
809 }
810
811 accept1(ExpressionVisitor1 visitor, arg) {
812 return visitor.visitTypeExpression(this, arg);
813 }
814 }
815
795 abstract class ExpressionVisitor<E> { 816 abstract class ExpressionVisitor<E> {
796 E visitExpression(Expression e) => e.accept(this); 817 E visitExpression(Expression e) => e.accept(this);
797 E visitVariableUse(VariableUse node); 818 E visitVariableUse(VariableUse node);
798 E visitInvokeStatic(InvokeStatic node); 819 E visitInvokeStatic(InvokeStatic node);
799 E visitInvokeMethod(InvokeMethod node); 820 E visitInvokeMethod(InvokeMethod node);
800 E visitInvokeMethodDirectly(InvokeMethodDirectly node); 821 E visitInvokeMethodDirectly(InvokeMethodDirectly node);
801 E visitInvokeConstructor(InvokeConstructor node); 822 E visitInvokeConstructor(InvokeConstructor node);
802 E visitConcatenateStrings(ConcatenateStrings node); 823 E visitConcatenateStrings(ConcatenateStrings node);
803 E visitConstant(Constant node); 824 E visitConstant(Constant node);
804 E visitThis(This node); 825 E visitThis(This node);
805 E visitReifyTypeVar(ReifyTypeVar node); 826 E visitReifyTypeVar(ReifyTypeVar node);
806 E visitConditional(Conditional node); 827 E visitConditional(Conditional node);
807 E visitLogicalOperator(LogicalOperator node); 828 E visitLogicalOperator(LogicalOperator node);
808 E visitNot(Not node); 829 E visitNot(Not node);
809 E visitLiteralList(LiteralList node); 830 E visitLiteralList(LiteralList node);
810 E visitLiteralMap(LiteralMap node); 831 E visitLiteralMap(LiteralMap node);
811 E visitTypeOperator(TypeOperator node); 832 E visitTypeOperator(TypeOperator node);
812 E visitFunctionExpression(FunctionExpression node); 833 E visitFunctionExpression(FunctionExpression node);
813 E visitFieldInitializer(FieldInitializer node); 834 E visitFieldInitializer(FieldInitializer node);
814 E visitSuperInitializer(SuperInitializer node); 835 E visitSuperInitializer(SuperInitializer node);
815 E visitGetField(GetField node); 836 E visitGetField(GetField node);
816 E visitCreateBox(CreateBox node); 837 E visitCreateBox(CreateBox node);
817 E visitCreateInstance(CreateInstance node); 838 E visitCreateInstance(CreateInstance node);
818 E visitReifyRuntimeType(ReifyRuntimeType node); 839 E visitReifyRuntimeType(ReifyRuntimeType node);
819 E visitReadTypeVariable(ReadTypeVariable node); 840 E visitReadTypeVariable(ReadTypeVariable node);
841 E visitTypeExpression(TypeExpression node);
820 } 842 }
821 843
822 abstract class ExpressionVisitor1<E, A> { 844 abstract class ExpressionVisitor1<E, A> {
823 E visitExpression(Expression e, A arg) => e.accept1(this, arg); 845 E visitExpression(Expression e, A arg) => e.accept1(this, arg);
824 E visitVariableUse(VariableUse node, A arg); 846 E visitVariableUse(VariableUse node, A arg);
825 E visitInvokeStatic(InvokeStatic node, A arg); 847 E visitInvokeStatic(InvokeStatic node, A arg);
826 E visitInvokeMethod(InvokeMethod node, A arg); 848 E visitInvokeMethod(InvokeMethod node, A arg);
827 E visitInvokeMethodDirectly(InvokeMethodDirectly node, A arg); 849 E visitInvokeMethodDirectly(InvokeMethodDirectly node, A arg);
828 E visitInvokeConstructor(InvokeConstructor node, A arg); 850 E visitInvokeConstructor(InvokeConstructor node, A arg);
829 E visitConcatenateStrings(ConcatenateStrings node, A arg); 851 E visitConcatenateStrings(ConcatenateStrings node, A arg);
830 E visitConstant(Constant node, A arg); 852 E visitConstant(Constant node, A arg);
831 E visitThis(This node, A arg); 853 E visitThis(This node, A arg);
832 E visitReifyTypeVar(ReifyTypeVar node, A arg); 854 E visitReifyTypeVar(ReifyTypeVar node, A arg);
833 E visitConditional(Conditional node, A arg); 855 E visitConditional(Conditional node, A arg);
834 E visitLogicalOperator(LogicalOperator node, A arg); 856 E visitLogicalOperator(LogicalOperator node, A arg);
835 E visitNot(Not node, A arg); 857 E visitNot(Not node, A arg);
836 E visitLiteralList(LiteralList node, A arg); 858 E visitLiteralList(LiteralList node, A arg);
837 E visitLiteralMap(LiteralMap node, A arg); 859 E visitLiteralMap(LiteralMap node, A arg);
838 E visitTypeOperator(TypeOperator node, A arg); 860 E visitTypeOperator(TypeOperator node, A arg);
839 E visitFunctionExpression(FunctionExpression node, A arg); 861 E visitFunctionExpression(FunctionExpression node, A arg);
840 E visitFieldInitializer(FieldInitializer node, A arg); 862 E visitFieldInitializer(FieldInitializer node, A arg);
841 E visitSuperInitializer(SuperInitializer node, A arg); 863 E visitSuperInitializer(SuperInitializer node, A arg);
842 E visitGetField(GetField node, A arg); 864 E visitGetField(GetField node, A arg);
843 E visitCreateBox(CreateBox node, A arg); 865 E visitCreateBox(CreateBox node, A arg);
844 E visitCreateInstance(CreateInstance node, A arg); 866 E visitCreateInstance(CreateInstance node, A arg);
845 E visitReifyRuntimeType(ReifyRuntimeType reifyRuntimeType, A arg); 867 E visitReifyRuntimeType(ReifyRuntimeType node, A arg);
846 E visitReadTypeVariable(ReadTypeVariable readTypeVariable, A arg); 868 E visitReadTypeVariable(ReadTypeVariable node, A arg);
869 E visitTypeExpression(TypeExpression node, A arg);
847 } 870 }
848 871
849 abstract class StatementVisitor<S> { 872 abstract class StatementVisitor<S> {
850 S visitStatement(Statement s) => s.accept(this); 873 S visitStatement(Statement s) => s.accept(this);
851 S visitLabeledStatement(LabeledStatement node); 874 S visitLabeledStatement(LabeledStatement node);
852 S visitAssign(Assign node); 875 S visitAssign(Assign node);
853 S visitReturn(Return node); 876 S visitReturn(Return node);
854 S visitBreak(Break node); 877 S visitBreak(Break node);
855 S visitContinue(Continue node); 878 S visitContinue(Continue node);
856 S visitIf(If node); 879 S visitIf(If node);
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
1067 node.arguments.forEach(visitExpression); 1090 node.arguments.forEach(visitExpression);
1068 } 1091 }
1069 1092
1070 visitReifyRuntimeType(ReifyRuntimeType node) { 1093 visitReifyRuntimeType(ReifyRuntimeType node) {
1071 visitExpression(node.value); 1094 visitExpression(node.value);
1072 } 1095 }
1073 1096
1074 visitReadTypeVariable(ReadTypeVariable node) { 1097 visitReadTypeVariable(ReadTypeVariable node) {
1075 visitExpression(node.target); 1098 visitExpression(node.target);
1076 } 1099 }
1100
1101 @override
1102 visitTypeExpression(TypeExpression node) {
1103 node.arguments.forEach(visitExpression);
1104 }
1077 } 1105 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698