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

Side by Side Diff: pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart

Issue 1185633003: cps-ir: Support foreign code. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Status file updates. 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) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 library dart2js.ir_nodes; 4 library dart2js.ir_nodes;
5 5
6 import '../constants/expressions.dart'; 6 import '../constants/expressions.dart';
7 import '../constants/values.dart' as values show ConstantValue; 7 import '../constants/values.dart' as values show ConstantValue;
8 import '../dart_types.dart' show DartType, InterfaceType, TypeVariableType; 8 import '../dart_types.dart' show DartType, InterfaceType, TypeVariableType;
9 import '../elements/elements.dart'; 9 import '../elements/elements.dart';
10 import '../io/source_information.dart' show SourceInformation; 10 import '../io/source_information.dart' show SourceInformation;
11 import '../universe/universe.dart' show Selector, SelectorKind; 11 import '../universe/universe.dart' show Selector, SelectorKind;
12 12
13 // These imports are only used for the JavaScript specific nodes. If we want to
14 // support more than one native backend, we should probably create better
15 // abstractions for native code and its type and effect system.
16 import '../js/js.dart' as js show Template;
17 import '../native/native.dart' as native show NativeBehavior;
18 import '../types/types.dart' as types show TypeMask;
19
13 abstract class Node { 20 abstract class Node {
14 /// A pointer to the parent node. Is null until set by optimization passes. 21 /// A pointer to the parent node. Is null until set by optimization passes.
15 Node parent; 22 Node parent;
16 23
17 accept(Visitor visitor); 24 accept(Visitor visitor);
18 } 25 }
19 26
20 /// Expressions can be evaluated, and may diverge, throw, and/or have 27 /// Expressions can be evaluated, and may diverge, throw, and/or have
21 /// side-effects. 28 /// side-effects.
22 /// 29 ///
(...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after
715 class CreateInvocationMirror extends Primitive { 722 class CreateInvocationMirror extends Primitive {
716 final Selector selector; 723 final Selector selector;
717 final List<Reference<Primitive>> arguments; 724 final List<Reference<Primitive>> arguments;
718 725
719 CreateInvocationMirror(this.selector, List<Primitive> arguments) 726 CreateInvocationMirror(this.selector, List<Primitive> arguments)
720 : this.arguments = _referenceList(arguments); 727 : this.arguments = _referenceList(arguments);
721 728
722 accept(Visitor visitor) => visitor.visitCreateInvocationMirror(this); 729 accept(Visitor visitor) => visitor.visitCreateInvocationMirror(this);
723 } 730 }
724 731
732 class ForeignCode extends Expression {
733 final js.Template codeTemplate;
734
735 final types.TypeMask type;
736 final List<Reference<Primitive>> arguments;
737 final Reference<Continuation> continuation;
738 final native.NativeBehavior nativeBehavior;
739 final FunctionElement dependency;
740
741 ForeignCode(this.codeTemplate, this.type, List<Primitive> arguments,
742 Continuation continuation, this.nativeBehavior, {this.dependency})
743 : arguments = _referenceList(arguments),
744 continuation = new Reference<Continuation>(continuation);
745
746 accept(Visitor visitor) => visitor.visitForeignCode(this);
747 }
748
725 class Constant extends Primitive { 749 class Constant extends Primitive {
726 final ConstantExpression expression; 750 final ConstantExpression expression;
727 final values.ConstantValue value; 751 final values.ConstantValue value;
728 752
729 Constant(this.expression, this.value); 753 Constant(this.expression, this.value);
730 754
731 accept(Visitor visitor) => visitor.visitConstant(this); 755 accept(Visitor visitor) => visitor.visitConstant(this);
732 } 756 }
733 757
734 class LiteralList extends Primitive { 758 class LiteralList extends Primitive {
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
948 T visitGetField(GetField node); 972 T visitGetField(GetField node);
949 T visitCreateBox(CreateBox node); 973 T visitCreateBox(CreateBox node);
950 T visitReifyRuntimeType(ReifyRuntimeType node); 974 T visitReifyRuntimeType(ReifyRuntimeType node);
951 T visitReadTypeVariable(ReadTypeVariable node); 975 T visitReadTypeVariable(ReadTypeVariable node);
952 T visitTypeExpression(TypeExpression node); 976 T visitTypeExpression(TypeExpression node);
953 T visitCreateInvocationMirror(CreateInvocationMirror node); 977 T visitCreateInvocationMirror(CreateInvocationMirror node);
954 T visitTypeTest(TypeTest node); 978 T visitTypeTest(TypeTest node);
955 979
956 // Conditions. 980 // Conditions.
957 T visitIsTrue(IsTrue node); 981 T visitIsTrue(IsTrue node);
982
983 // Support for literal foreign code.
984 T visitForeignCode(ForeignCode node);
958 } 985 }
959 986
960 /// Recursively visits the entire CPS term, and calls abstract `process*` 987 /// Recursively visits the entire CPS term, and calls abstract `process*`
961 /// (i.e. `processLetPrim`) functions in pre-order. 988 /// (i.e. `processLetPrim`) functions in pre-order.
962 class RecursiveVisitor implements Visitor { 989 class RecursiveVisitor implements Visitor {
963 const RecursiveVisitor(); 990 const RecursiveVisitor();
964 991
965 visit(Node node) => node.accept(this); 992 visit(Node node) => node.accept(this);
966 993
967 processReference(Reference ref) {} 994 processReference(Reference ref) {}
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
1227 processNonTailThrow(node); 1254 processNonTailThrow(node);
1228 processReference(node.value); 1255 processReference(node.value);
1229 } 1256 }
1230 1257
1231 processCreateInvocationMirror(CreateInvocationMirror node) {} 1258 processCreateInvocationMirror(CreateInvocationMirror node) {}
1232 visitCreateInvocationMirror(CreateInvocationMirror node) { 1259 visitCreateInvocationMirror(CreateInvocationMirror node) {
1233 processCreateInvocationMirror(node); 1260 processCreateInvocationMirror(node);
1234 node.arguments.forEach(processReference); 1261 node.arguments.forEach(processReference);
1235 } 1262 }
1236 1263
1264 processForeignCode(ForeignCode node) {}
1265 visitForeignCode(ForeignCode node) {
1266 processForeignCode(node);
1267 processReference(node.continuation);
1268 node.arguments.forEach(processReference);
1269 }
1270
1237 processUnreachable(Unreachable node) {} 1271 processUnreachable(Unreachable node) {}
1238 visitUnreachable(Unreachable node) { 1272 visitUnreachable(Unreachable node) {
1239 processUnreachable(node); 1273 processUnreachable(node);
1240 } 1274 }
1241 } 1275 }
1242 1276
1243 /// Visit a just-deleted subterm and unlink all [Reference]s in it. 1277 /// Visit a just-deleted subterm and unlink all [Reference]s in it.
1244 class RemovalVisitor extends RecursiveVisitor { 1278 class RemovalVisitor extends RecursiveVisitor {
1245 const RemovalVisitor(); 1279 const RemovalVisitor();
1246 1280
1247 processReference(Reference reference) { 1281 processReference(Reference reference) {
1248 reference.unlink(); 1282 reference.unlink();
1249 } 1283 }
1250 1284
1251 static void remove(Node node) { 1285 static void remove(Node node) {
1252 (const RemovalVisitor()).visit(node); 1286 (const RemovalVisitor()).visit(node);
1253 } 1287 }
1254 } 1288 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698