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

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

Issue 1196443002: Revert "cps-ir: Support foreign code." (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 6 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
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, InterfaceType, TypeVariableType; 9 import '../dart_types.dart' show DartType, InterfaceType, TypeVariableType;
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 '../types/types.dart' show TypeMask; 12 import '../types/types.dart' show TypeMask;
13 import '../universe/universe.dart' show Selector; 13 import '../universe/universe.dart' show Selector;
14 14
15 import '../cps_ir/builtin_operator.dart'; 15 import '../cps_ir/builtin_operator.dart';
16 export '../cps_ir/builtin_operator.dart'; 16 export '../cps_ir/builtin_operator.dart';
17 17
18 // These imports are only used for the JavaScript specific nodes. If we want to
19 // support more than one native backend, we should probably create better
20 // abstractions for native code and its type and effect system.
21 import '../js/js.dart' as js show Template;
22 import '../native/native.dart' as native show NativeBehavior;
23 import '../types/types.dart' as types show TypeMask;
24
25 // The Tree language is the target of translation out of the CPS-based IR. 18 // The Tree language is the target of translation out of the CPS-based IR.
26 // 19 //
27 // The translation from CPS to Dart consists of several stages. Among the 20 // The translation from CPS to Dart consists of several stages. Among the
28 // stages are translation to direct style, translation out of SSA, eliminating 21 // stages are translation to direct style, translation out of SSA, eliminating
29 // unnecessary names, recognizing high-level control constructs. Combining 22 // unnecessary names, recognizing high-level control constructs. Combining
30 // these separate concerns is complicated and the constraints of the CPS-based 23 // these separate concerns is complicated and the constraints of the CPS-based
31 // language do not permit a multi-stage translation. 24 // language do not permit a multi-stage translation.
32 // 25 //
33 // For that reason, CPS is translated to the direct-style language Tree. 26 // For that reason, CPS is translated to the direct-style language Tree.
34 // Translation out of SSA, unnaming, and control-flow, as well as 'instruction 27 // Translation out of SSA, unnaming, and control-flow, as well as 'instruction
(...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after
777 770
778 accept(ExpressionVisitor visitor) { 771 accept(ExpressionVisitor visitor) {
779 return visitor.visitCreateInvocationMirror(this); 772 return visitor.visitCreateInvocationMirror(this);
780 } 773 }
781 774
782 accept1(ExpressionVisitor1 visitor, arg) { 775 accept1(ExpressionVisitor1 visitor, arg) {
783 return visitor.visitCreateInvocationMirror(this, arg); 776 return visitor.visitCreateInvocationMirror(this, arg);
784 } 777 }
785 } 778 }
786 779
787 class ForeignCode extends Node {
788 final js.Template codeTemplate;
789 final types.TypeMask type;
790 final List<Expression> arguments;
791 final native.NativeBehavior nativeBehavior;
792 final Element dependency;
793
794 ForeignCode(this.codeTemplate, this.type, this.arguments, this.nativeBehavior,
795 this.dependency);
796 }
797
798 class ForeignExpression extends ForeignCode implements Expression {
799 ForeignExpression(js.Template codeTemplate, types.TypeMask type,
800 List<Expression> arguments, native.NativeBehavior nativeBehavior,
801 Element dependency)
802 : super(codeTemplate, type, arguments, nativeBehavior,
803 dependency);
804
805 accept(ExpressionVisitor visitor) {
806 return visitor.visitForeignExpression(this);
807 }
808
809 accept1(ExpressionVisitor1 visitor, arg) {
810 return visitor.visitForeignExpression(this, arg);
811 }
812 }
813
814 class ForeignStatement extends ForeignCode implements Statement {
815 ForeignStatement(js.Template codeTemplate, types.TypeMask type,
816 List<Expression> arguments, native.NativeBehavior nativeBehavior,
817 Element dependency)
818 : super(codeTemplate, type, arguments, nativeBehavior,
819 dependency);
820
821 accept(StatementVisitor visitor) {
822 return visitor.visitForeignStatement(this);
823 }
824
825 accept1(StatementVisitor1 visitor, arg) {
826 return visitor.visitForeignStatement(this, arg);
827 }
828
829 @override
830 Statement get next => null;
831
832 @override
833 void set next(Statement s) => throw 'UNREACHABLE';
834 }
835
836 /// Denotes the internal representation of [dartType], where all type variables 780 /// Denotes the internal representation of [dartType], where all type variables
837 /// are replaced by the values in [arguments]. 781 /// are replaced by the values in [arguments].
838 /// (See documentation on the TypeExpression CPS node for more details.) 782 /// (See documentation on the TypeExpression CPS node for more details.)
839 class TypeExpression extends Expression { 783 class TypeExpression extends Expression {
840 final DartType dartType; 784 final DartType dartType;
841 final List<Expression> arguments; 785 final List<Expression> arguments;
842 786
843 TypeExpression(this.dartType, this.arguments); 787 TypeExpression(this.dartType, this.arguments);
844 788
845 accept(ExpressionVisitor visitor) { 789 accept(ExpressionVisitor visitor) {
(...skipping 27 matching lines...) Expand all
873 E visitSetField(SetField node); 817 E visitSetField(SetField node);
874 E visitGetStatic(GetStatic node); 818 E visitGetStatic(GetStatic node);
875 E visitSetStatic(SetStatic node); 819 E visitSetStatic(SetStatic node);
876 E visitCreateBox(CreateBox node); 820 E visitCreateBox(CreateBox node);
877 E visitCreateInstance(CreateInstance node); 821 E visitCreateInstance(CreateInstance node);
878 E visitReifyRuntimeType(ReifyRuntimeType node); 822 E visitReifyRuntimeType(ReifyRuntimeType node);
879 E visitReadTypeVariable(ReadTypeVariable node); 823 E visitReadTypeVariable(ReadTypeVariable node);
880 E visitTypeExpression(TypeExpression node); 824 E visitTypeExpression(TypeExpression node);
881 E visitCreateInvocationMirror(CreateInvocationMirror node); 825 E visitCreateInvocationMirror(CreateInvocationMirror node);
882 E visitApplyBuiltinOperator(ApplyBuiltinOperator node); 826 E visitApplyBuiltinOperator(ApplyBuiltinOperator node);
883 E visitForeignExpression(ForeignExpression node);
884 } 827 }
885 828
886 abstract class ExpressionVisitor1<E, A> { 829 abstract class ExpressionVisitor1<E, A> {
887 E visitExpression(Expression node, A arg) => node.accept1(this, arg); 830 E visitExpression(Expression node, A arg) => node.accept1(this, arg);
888 E visitVariableUse(VariableUse node, A arg); 831 E visitVariableUse(VariableUse node, A arg);
889 E visitAssign(Assign node, A arg); 832 E visitAssign(Assign node, A arg);
890 E visitInvokeStatic(InvokeStatic node, A arg); 833 E visitInvokeStatic(InvokeStatic node, A arg);
891 E visitInvokeMethod(InvokeMethod node, A arg); 834 E visitInvokeMethod(InvokeMethod node, A arg);
892 E visitInvokeMethodDirectly(InvokeMethodDirectly node, A arg); 835 E visitInvokeMethodDirectly(InvokeMethodDirectly node, A arg);
893 E visitInvokeConstructor(InvokeConstructor node, A arg); 836 E visitInvokeConstructor(InvokeConstructor node, A arg);
(...skipping 11 matching lines...) Expand all
905 E visitSetField(SetField node, A arg); 848 E visitSetField(SetField node, A arg);
906 E visitGetStatic(GetStatic node, A arg); 849 E visitGetStatic(GetStatic node, A arg);
907 E visitSetStatic(SetStatic node, A arg); 850 E visitSetStatic(SetStatic node, A arg);
908 E visitCreateBox(CreateBox node, A arg); 851 E visitCreateBox(CreateBox node, A arg);
909 E visitCreateInstance(CreateInstance node, A arg); 852 E visitCreateInstance(CreateInstance node, A arg);
910 E visitReifyRuntimeType(ReifyRuntimeType node, A arg); 853 E visitReifyRuntimeType(ReifyRuntimeType node, A arg);
911 E visitReadTypeVariable(ReadTypeVariable node, A arg); 854 E visitReadTypeVariable(ReadTypeVariable node, A arg);
912 E visitTypeExpression(TypeExpression node, A arg); 855 E visitTypeExpression(TypeExpression node, A arg);
913 E visitCreateInvocationMirror(CreateInvocationMirror node, A arg); 856 E visitCreateInvocationMirror(CreateInvocationMirror node, A arg);
914 E visitApplyBuiltinOperator(ApplyBuiltinOperator node, A arg); 857 E visitApplyBuiltinOperator(ApplyBuiltinOperator node, A arg);
915 E visitForeignExpression(ForeignExpression node, A arg);
916 } 858 }
917 859
918 abstract class StatementVisitor<S> { 860 abstract class StatementVisitor<S> {
919 S visitStatement(Statement node) => node.accept(this); 861 S visitStatement(Statement node) => node.accept(this);
920 S visitLabeledStatement(LabeledStatement node); 862 S visitLabeledStatement(LabeledStatement node);
921 S visitReturn(Return node); 863 S visitReturn(Return node);
922 S visitThrow(Throw node); 864 S visitThrow(Throw node);
923 S visitRethrow(Rethrow node); 865 S visitRethrow(Rethrow node);
924 S visitBreak(Break node); 866 S visitBreak(Break node);
925 S visitContinue(Continue node); 867 S visitContinue(Continue node);
926 S visitIf(If node); 868 S visitIf(If node);
927 S visitWhileTrue(WhileTrue node); 869 S visitWhileTrue(WhileTrue node);
928 S visitWhileCondition(WhileCondition node); 870 S visitWhileCondition(WhileCondition node);
929 S visitExpressionStatement(ExpressionStatement node); 871 S visitExpressionStatement(ExpressionStatement node);
930 S visitTry(Try node); 872 S visitTry(Try node);
931 S visitUnreachable(Unreachable node); 873 S visitUnreachable(Unreachable node);
932 S visitForeignStatement(ForeignStatement node);
933 } 874 }
934 875
935 abstract class StatementVisitor1<S, A> { 876 abstract class StatementVisitor1<S, A> {
936 S visitStatement(Statement node, A arg) => node.accept1(this, arg); 877 S visitStatement(Statement node, A arg) => node.accept1(this, arg);
937 S visitLabeledStatement(LabeledStatement node, A arg); 878 S visitLabeledStatement(LabeledStatement node, A arg);
938 S visitReturn(Return node, A arg); 879 S visitReturn(Return node, A arg);
939 S visitThrow(Throw node, A arg); 880 S visitThrow(Throw node, A arg);
940 S visitRethrow(Rethrow node, A arg); 881 S visitRethrow(Rethrow node, A arg);
941 S visitBreak(Break node, A arg); 882 S visitBreak(Break node, A arg);
942 S visitContinue(Continue node, A arg); 883 S visitContinue(Continue node, A arg);
943 S visitIf(If node, A arg); 884 S visitIf(If node, A arg);
944 S visitWhileTrue(WhileTrue node, A arg); 885 S visitWhileTrue(WhileTrue node, A arg);
945 S visitWhileCondition(WhileCondition node, A arg); 886 S visitWhileCondition(WhileCondition node, A arg);
946 S visitExpressionStatement(ExpressionStatement node, A arg); 887 S visitExpressionStatement(ExpressionStatement node, A arg);
947 S visitTry(Try node, A arg); 888 S visitTry(Try node, A arg);
948 S visitUnreachable(Unreachable node, A arg); 889 S visitUnreachable(Unreachable node, A arg);
949 S visitForeignStatement(ForeignStatement node, A arg);
950 } 890 }
951 891
952 abstract class RecursiveVisitor implements StatementVisitor, ExpressionVisitor { 892 abstract class RecursiveVisitor implements StatementVisitor, ExpressionVisitor {
953 visitExpression(Expression e) => e.accept(this); 893 visitExpression(Expression e) => e.accept(this);
954 visitStatement(Statement s) => s.accept(this); 894 visitStatement(Statement s) => s.accept(this);
955 895
956 visitInnerFunction(FunctionDefinition node); 896 visitInnerFunction(FunctionDefinition node);
957 897
958 visitVariable(Variable variable) {} 898 visitVariable(Variable variable) {}
959 899
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
1105 } 1045 }
1106 1046
1107 visitTypeExpression(TypeExpression node) { 1047 visitTypeExpression(TypeExpression node) {
1108 node.arguments.forEach(visitExpression); 1048 node.arguments.forEach(visitExpression);
1109 } 1049 }
1110 1050
1111 visitCreateInvocationMirror(CreateInvocationMirror node) { 1051 visitCreateInvocationMirror(CreateInvocationMirror node) {
1112 node.arguments.forEach(visitExpression); 1052 node.arguments.forEach(visitExpression);
1113 } 1053 }
1114 1054
1115 visitUnreachable(Unreachable node) { 1055 visitUnreachable(Unreachable node) {}
1116 }
1117 1056
1118 visitApplyBuiltinOperator(ApplyBuiltinOperator node) { 1057 visitApplyBuiltinOperator(ApplyBuiltinOperator node) {
1119 node.arguments.forEach(visitExpression); 1058 node.arguments.forEach(visitExpression);
1120 } 1059 }
1121
1122 visitForeignCode(ForeignCode node) {
1123 node.arguments.forEach(visitExpression);
1124 }
1125
1126 visitForeignExpression(ForeignExpression node) => visitForeignCode(node);
1127 visitForeignStatement(ForeignStatement node) => visitForeignCode(node);
1128 } 1060 }
1129 1061
1130 abstract class Transformer implements ExpressionVisitor<Expression>, 1062 abstract class Transformer implements ExpressionVisitor<Expression>,
1131 StatementVisitor<Statement> { 1063 StatementVisitor<Statement> {
1132 Expression visitExpression(Expression e) => e.accept(this); 1064 Expression visitExpression(Expression e) => e.accept(this);
1133 Statement visitStatement(Statement s) => s.accept(this); 1065 Statement visitStatement(Statement s) => s.accept(this);
1134 } 1066 }
1135 1067
1136 class RecursiveTransformer extends Transformer { 1068 class RecursiveTransformer extends Transformer {
1137 void visitInnerFunction(FunctionDefinition node) { 1069 void visitInnerFunction(FunctionDefinition node) {
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
1315 visitTypeExpression(TypeExpression node) { 1247 visitTypeExpression(TypeExpression node) {
1316 _replaceExpressions(node.arguments); 1248 _replaceExpressions(node.arguments);
1317 return node; 1249 return node;
1318 } 1250 }
1319 1251
1320 visitCreateInvocationMirror(CreateInvocationMirror node) { 1252 visitCreateInvocationMirror(CreateInvocationMirror node) {
1321 _replaceExpressions(node.arguments); 1253 _replaceExpressions(node.arguments);
1322 return node; 1254 return node;
1323 } 1255 }
1324 1256
1325 visitForeignExpression(ForeignExpression node) {
1326 _replaceExpressions(node.arguments);
1327 return node;
1328 }
1329
1330 visitForeignStatement(ForeignStatement node) {
1331 _replaceExpressions(node.arguments);
1332 return node;
1333 }
1334
1335 visitUnreachable(Unreachable node) { 1257 visitUnreachable(Unreachable node) {
1336 return node; 1258 return node;
1337 } 1259 }
1338 1260
1339 visitApplyBuiltinOperator(ApplyBuiltinOperator node) { 1261 visitApplyBuiltinOperator(ApplyBuiltinOperator node) {
1340 _replaceExpressions(node.arguments); 1262 _replaceExpressions(node.arguments);
1341 return node; 1263 return node;
1342 } 1264 }
1343 } 1265 }
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