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

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

Issue 1491973002: dart2js: Use correct call structures throughout the backend. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Rebase. Created 5 years 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
« no previous file with comments | « no previous file | pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 4
5 library dart2js.ir_builder_task; 5 library dart2js.ir_builder_task;
6 6
7 import '../closure.dart' as closurelib; 7 import '../closure.dart' as closurelib;
8 import '../closure.dart' hide ClosureScope; 8 import '../closure.dart' hide ClosureScope;
9 import '../common.dart'; 9 import '../common.dart';
10 import '../common/names.dart' show 10 import '../common/names.dart' show
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 * Builds the [ir.FunctionDefinition] for an executable element. In case the 178 * Builds the [ir.FunctionDefinition] for an executable element. In case the
179 * function uses features that cannot be expressed in the IR, this element 179 * function uses features that cannot be expressed in the IR, this element
180 * returns `null`. 180 * returns `null`.
181 */ 181 */
182 ir.FunctionDefinition buildExecutable(ExecutableElement element); 182 ir.FunctionDefinition buildExecutable(ExecutableElement element);
183 183
184 ClosureClassMap get closureClassMap; 184 ClosureClassMap get closureClassMap;
185 ClosureScope getClosureScopeForNode(ast.Node node); 185 ClosureScope getClosureScopeForNode(ast.Node node);
186 ClosureEnvironment getClosureEnvironment(); 186 ClosureEnvironment getClosureEnvironment();
187 187
188 /// Normalizes the argument list to a static invocation (i.e. where the target 188 /// Normalizes the argument list of a static invocation.
189 /// element is known).
190 /// 189 ///
191 /// For the JS backend, inserts default arguments and normalizes order of 190 /// A static invocation is one where the target is known. The argument list
192 /// named arguments. 191 /// [arguments] is normalized by adding default values for optional arguments
193 /// 192 /// that are not passed, and by sorting it in place so that named arguments
194 /// For the Dart backend, returns [arguments]. 193 /// appear in a canonical order. A [CallStructure] reflecting this order
195 List<ir.Primitive> normalizeStaticArguments( 194 /// is returned.
195 CallStructure normalizeStaticArguments(
196 CallStructure callStructure, 196 CallStructure callStructure,
197 FunctionElement target, 197 FunctionElement target,
198 List<ir.Primitive> arguments); 198 List<ir.Primitive> arguments);
199 199
200 /// Normalizes the argument list of a dynamic invocation (i.e. where the 200 /// Normalizes the argument list of a dynamic invocation.
201 /// target element is unknown).
202 /// 201 ///
203 /// For the JS backend, normalizes order of named arguments. 202 /// A dynamic invocation is one where the target is not known. The argument
204 /// 203 /// list [arguments] is normalized by sorting it in place so that the named
205 /// For the Dart backend, returns [arguments]. 204 /// arguments appear in a canonical order. A [CallStructure] reflecting this
206 List<ir.Primitive> normalizeDynamicArguments( 205 /// order is returned.
206 CallStructure normalizeDynamicArguments(
207 CallStructure callStructure, 207 CallStructure callStructure,
208 List<ir.Primitive> arguments); 208 List<ir.Primitive> arguments);
209 209
210 /// Read the value of [field]. 210 /// Read the value of [field].
211 ir.Primitive buildStaticFieldGet(FieldElement field, SourceInformation src); 211 ir.Primitive buildStaticFieldGet(FieldElement field, SourceInformation src);
212 212
213 ir.FunctionDefinition _makeFunctionBody(FunctionElement element, 213 ir.FunctionDefinition _makeFunctionBody(FunctionElement element,
214 ast.FunctionExpression node) { 214 ast.FunctionExpression node) {
215 FunctionSignature signature = element.functionSignature; 215 FunctionSignature signature = element.functionSignature;
216 List<Local> parameters = <Local>[]; 216 List<Local> parameters = <Local>[];
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 if (parameter.isNamed) { 309 if (parameter.isNamed) {
310 namedParameters.add(parameter.name); 310 namedParameters.add(parameter.name);
311 } 311 }
312 }); 312 });
313 ClassElement cls = redirectingConstructor.enclosingClass; 313 ClassElement cls = redirectingConstructor.enclosingClass;
314 InterfaceType targetType = 314 InterfaceType targetType =
315 redirectingConstructor.computeEffectiveTargetType(cls.thisType); 315 redirectingConstructor.computeEffectiveTargetType(cls.thisType);
316 CallStructure callStructure = new CallStructure( 316 CallStructure callStructure = new CallStructure(
317 redirectingSignature.parameterCount, 317 redirectingSignature.parameterCount,
318 namedParameters); 318 namedParameters);
319 arguments = normalizeStaticArguments(callStructure, targetConstructor, 319 callStructure =
320 arguments); 320 normalizeStaticArguments(callStructure, targetConstructor, arguments);
321 ir.Primitive instance = irBuilder.buildConstructorInvocation( 321 ir.Primitive instance = irBuilder.buildConstructorInvocation(
322 targetConstructor, 322 targetConstructor,
323 callStructure, 323 callStructure,
324 targetType, 324 targetType,
325 arguments, 325 arguments,
326 sourceInformationBuilder.buildNew(node)); 326 sourceInformationBuilder.buildNew(node));
327 irBuilder.buildReturn( 327 irBuilder.buildReturn(
328 value: instance, 328 value: instance,
329 sourceInformation: sourceInformationBuilder.buildReturn(node)); 329 sourceInformation: sourceInformationBuilder.buildReturn(node));
330 } 330 }
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after
712 assert(irBuilder.isOpen); 712 assert(irBuilder.isOpen);
713 return visit(node.expression); 713 return visit(node.expression);
714 } 714 }
715 715
716 @override 716 @override
717 ir.Primitive visitExpressionInvoke(ast.Send node, 717 ir.Primitive visitExpressionInvoke(ast.Send node,
718 ast.Node expression, 718 ast.Node expression,
719 ast.NodeList argumentsNode, 719 ast.NodeList argumentsNode,
720 CallStructure callStructure, _) { 720 CallStructure callStructure, _) {
721 ir.Primitive receiver = visit(expression); 721 ir.Primitive receiver = visit(expression);
722 List<ir.Primitive> arguments = node.arguments.mapToList(visit); 722 List<ir.Primitive> arguments = argumentsNode.nodes.mapToList(visit);
723 arguments = normalizeDynamicArguments(callStructure, arguments); 723 callStructure = normalizeDynamicArguments(callStructure, arguments);
724 return irBuilder.buildCallInvocation( 724 return irBuilder.buildCallInvocation(receiver, callStructure, arguments,
725 receiver, callStructure, arguments,
726 sourceInformation: 725 sourceInformation:
727 sourceInformationBuilder.buildCall(node, argumentsNode)); 726 sourceInformationBuilder.buildCall(node, argumentsNode));
728 } 727 }
729 728
730 /// Returns `true` if [node] is a super call. 729 /// Returns `true` if [node] is a super call.
731 // TODO(johnniwinther): Remove the need for this. 730 // TODO(johnniwinther): Remove the need for this.
732 bool isSuperCall(ast.Send node) { 731 bool isSuperCall(ast.Send node) {
733 return node != null && node.receiver != null && node.receiver.isSuper(); 732 return node != null && node.receiver != null && node.receiver.isSuper();
734 } 733 }
735 734
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
943 ir.Primitive value = visit(expression); 942 ir.Primitive value = visit(expression);
944 ir.Primitive check = irBuilder.buildTypeOperator( 943 ir.Primitive check = irBuilder.buildTypeOperator(
945 value, type, isTypeTest: true); 944 value, type, isTypeTest: true);
946 return irBuilder.buildNegation(check); 945 return irBuilder.buildNegation(check);
947 } 946 }
948 947
949 ir.Primitive translateBinary(ast.Send node, 948 ir.Primitive translateBinary(ast.Send node,
950 ast.Node left, 949 ast.Node left,
951 op.BinaryOperator operator, 950 op.BinaryOperator operator,
952 ast.Node right) { 951 ast.Node right) {
952 ir.Primitive receiver = visit(left);
953 Selector selector = new Selector.binaryOperator(operator.selectorName); 953 Selector selector = new Selector.binaryOperator(operator.selectorName);
954 ir.Primitive receiver = visit(left);
955 List<ir.Primitive> arguments = <ir.Primitive>[visit(right)]; 954 List<ir.Primitive> arguments = <ir.Primitive>[visit(right)];
956 arguments = normalizeDynamicArguments(selector.callStructure, arguments); 955 CallStructure callStructure =
956 normalizeDynamicArguments(selector.callStructure, arguments);
957 return irBuilder.buildDynamicInvocation( 957 return irBuilder.buildDynamicInvocation(
958 receiver, selector, elements.getTypeMask(node), arguments, 958 receiver,
959 new Selector(selector.kind, selector.memberName, callStructure),
960 elements.getTypeMask(node),
961 arguments,
959 sourceInformation: 962 sourceInformation:
960 sourceInformationBuilder.buildCall(node, node.selector)); 963 sourceInformationBuilder.buildCall(node, node.selector));
961 } 964 }
962 965
963 @override 966 @override
964 ir.Primitive visitBinary(ast.Send node, 967 ir.Primitive visitBinary(ast.Send node,
965 ast.Node left, 968 ast.Node left,
966 op.BinaryOperator operator, 969 op.BinaryOperator operator,
967 ast.Node right, _) { 970 ast.Node right, _) {
968 return translateBinary(node, left, operator, right); 971 return translateBinary(node, left, operator, right);
969 } 972 }
970 973
971 @override 974 @override
972 ir.Primitive visitIndex(ast.Send node, 975 ir.Primitive visitIndex(ast.Send node,
973 ast.Node receiver, 976 ast.Node receiver,
974 ast.Node index, _) { 977 ast.Node index, _) {
978 ir.Primitive target = visit(receiver);
975 Selector selector = new Selector.index(); 979 Selector selector = new Selector.index();
976 ir.Primitive target = visit(receiver);
977 List<ir.Primitive> arguments = <ir.Primitive>[visit(index)]; 980 List<ir.Primitive> arguments = <ir.Primitive>[visit(index)];
978 arguments = normalizeDynamicArguments(selector.callStructure, arguments); 981 CallStructure callStructure =
982 normalizeDynamicArguments(selector.callStructure, arguments);
979 return irBuilder.buildDynamicInvocation( 983 return irBuilder.buildDynamicInvocation(
980 target, selector, elements.getTypeMask(node), arguments, 984 target,
985 new Selector(selector.kind, selector.memberName, callStructure),
986 elements.getTypeMask(node),
987 arguments,
981 sourceInformation: 988 sourceInformation:
982 sourceInformationBuilder.buildCall(receiver, node.selector)); 989 sourceInformationBuilder.buildCall(receiver, node.selector));
983 } 990 }
984 991
985 ir.Primitive translateSuperBinary(FunctionElement function, 992 ir.Primitive translateSuperBinary(FunctionElement function,
986 op.BinaryOperator operator, 993 op.BinaryOperator operator,
987 ast.Node argument) { 994 ast.Node argument) {
988 CallStructure callStructure = CallStructure.ONE_ARG;
989 List<ir.Primitive> arguments = <ir.Primitive>[visit(argument)]; 995 List<ir.Primitive> arguments = <ir.Primitive>[visit(argument)];
990 arguments = normalizeDynamicArguments(callStructure, arguments); 996 CallStructure callStructure =
997 normalizeDynamicArguments(CallStructure.ONE_ARG, arguments);
991 return irBuilder.buildSuperMethodInvocation( 998 return irBuilder.buildSuperMethodInvocation(
992 function, callStructure, arguments); 999 function, callStructure, arguments);
993 } 1000 }
994 1001
995 @override 1002 @override
996 ir.Primitive visitSuperBinary( 1003 ir.Primitive visitSuperBinary(
997 ast.Send node, 1004 ast.Send node,
998 FunctionElement function, 1005 FunctionElement function,
999 op.BinaryOperator operator, 1006 op.BinaryOperator operator,
1000 ast.Node argument, 1007 ast.Node argument,
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
1074 ast.Send node, 1081 ast.Send node,
1075 op.UnaryOperator operator, 1082 op.UnaryOperator operator,
1076 FunctionElement function, 1083 FunctionElement function,
1077 _) { 1084 _) {
1078 return irBuilder.buildSuperMethodInvocation( 1085 return irBuilder.buildSuperMethodInvocation(
1079 function, CallStructure.NO_ARGS, const []); 1086 function, CallStructure.NO_ARGS, const []);
1080 } 1087 }
1081 1088
1082 // TODO(johnniwinther): Handle this in the [IrBuilder] to ensure the correct 1089 // TODO(johnniwinther): Handle this in the [IrBuilder] to ensure the correct
1083 // semantic correlation between arguments and invocation. 1090 // semantic correlation between arguments and invocation.
1084 List<ir.Primitive> translateDynamicArguments(ast.NodeList nodeList, 1091 CallStructure translateDynamicArguments(ast.NodeList nodeList,
1085 CallStructure callStructure) { 1092 CallStructure callStructure,
1086 List<ir.Primitive> arguments = nodeList.nodes.mapToList(visit); 1093 List<ir.Primitive> arguments) {
1094 assert(arguments.isEmpty);
1095 for (ast.Node node in nodeList) arguments.add(visit(node));
1087 return normalizeDynamicArguments(callStructure, arguments); 1096 return normalizeDynamicArguments(callStructure, arguments);
1088 } 1097 }
1089 1098
1090 // TODO(johnniwinther): Handle this in the [IrBuilder] to ensure the correct 1099 // TODO(johnniwinther): Handle this in the [IrBuilder] to ensure the correct
1091 // semantic correlation between arguments and invocation. 1100 // semantic correlation between arguments and invocation.
1092 List<ir.Primitive> translateStaticArguments(ast.NodeList nodeList, 1101 CallStructure translateStaticArguments(ast.NodeList nodeList,
1093 Element element, 1102 Element element,
1094 CallStructure callStructure) { 1103 CallStructure callStructure,
1095 List<ir.Primitive> arguments = nodeList.nodes.mapToList(visit); 1104 List<ir.Primitive> arguments) {
1105 assert(arguments.isEmpty);
1106 for (ast.Node node in nodeList) arguments.add(visit(node));
1096 return normalizeStaticArguments(callStructure, element, arguments); 1107 return normalizeStaticArguments(callStructure, element, arguments);
1097 } 1108 }
1098 1109
1099 ir.Primitive translateCallInvoke(ir.Primitive target, 1110 ir.Primitive translateCallInvoke(ir.Primitive target,
1100 ast.NodeList arguments, 1111 ast.NodeList argumentsNode,
1101 CallStructure callStructure, 1112 CallStructure callStructure,
1102 SourceInformation sourceInformation) { 1113 SourceInformation sourceInformation) {
1103 1114 List<ir.Primitive> arguments = <ir.Primitive>[];
1104 return irBuilder.buildCallInvocation(target, callStructure, 1115 callStructure =
1105 translateDynamicArguments(arguments, callStructure), 1116 translateDynamicArguments(argumentsNode, callStructure, arguments);
1117 return irBuilder.buildCallInvocation(target, callStructure, arguments,
1106 sourceInformation: sourceInformation); 1118 sourceInformation: sourceInformation);
1107 } 1119 }
1108 1120
1109 @override 1121 @override
1110 ir.Primitive handleConstantInvoke( 1122 ir.Primitive handleConstantInvoke(
1111 ast.Send node, 1123 ast.Send node,
1112 ConstantExpression constant, 1124 ConstantExpression constant,
1113 ast.NodeList arguments, 1125 ast.NodeList arguments,
1114 CallStructure callStructure, 1126 CallStructure callStructure,
1115 _) { 1127 _) {
1116 ir.Primitive target = buildConstantExpression(constant, 1128 ir.Primitive target = buildConstantExpression(constant,
1117 sourceInformationBuilder.buildGet(node)); 1129 sourceInformationBuilder.buildGet(node));
1118 return translateCallInvoke(target, arguments, callStructure, 1130 return translateCallInvoke(target, arguments, callStructure,
1119 sourceInformationBuilder.buildCall(node, arguments)); 1131 sourceInformationBuilder.buildCall(node, arguments));
1120 } 1132 }
1121 1133
1122 @override 1134 @override
1123 ir.Primitive handleDynamicInvoke( 1135 ir.Primitive handleDynamicInvoke(
1124 ast.Send node, 1136 ast.Send node,
1125 ast.Node receiver, 1137 ast.Node receiver,
1126 ast.NodeList arguments, 1138 ast.NodeList argumentsNode,
1127 Selector selector, 1139 Selector selector,
1128 _) { 1140 _) {
1141 ir.Primitive target = translateReceiver(receiver);
1142 List<ir.Primitive> arguments = <ir.Primitive>[];
1143 CallStructure callStructure = translateDynamicArguments(
1144 argumentsNode, selector.callStructure, arguments);
1129 return irBuilder.buildDynamicInvocation( 1145 return irBuilder.buildDynamicInvocation(
1130 translateReceiver(receiver), selector, elements.getTypeMask(node), 1146 target,
1131 translateDynamicArguments(arguments, selector.callStructure), 1147 new Selector(selector.kind, selector.memberName, callStructure),
1148 elements.getTypeMask(node),
1149 arguments,
1132 sourceInformation: 1150 sourceInformation:
1133 sourceInformationBuilder.buildCall(node, node.selector)); 1151 sourceInformationBuilder.buildCall(node, node.selector));
1134 } 1152 }
1135 1153
1136 @override 1154 @override
1137 ir.Primitive visitIfNotNullDynamicPropertyInvoke( 1155 ir.Primitive visitIfNotNullDynamicPropertyInvoke(
1138 ast.Send node, 1156 ast.Send node,
1139 ast.Node receiver, 1157 ast.Node receiver,
1140 ast.NodeList arguments, 1158 ast.NodeList argumentsNode,
1141 Selector selector, 1159 Selector selector,
1142 _) { 1160 _) {
1143 ir.Primitive target = visit(receiver); 1161 ir.Primitive target = visit(receiver);
1144 return irBuilder.buildIfNotNullSend( 1162 return irBuilder.buildIfNotNullSend(
1145 target, 1163 target,
1146 nested(() => irBuilder.buildDynamicInvocation( 1164 nested(() {
1147 target, selector, elements.getTypeMask(node), 1165 List<ir.Primitive> arguments = <ir.Primitive>[];
1148 translateDynamicArguments(arguments, selector.callStructure)))); 1166 CallStructure callStructure = translateDynamicArguments(
1167 argumentsNode, selector.callStructure, arguments);
1168 return irBuilder.buildDynamicInvocation(
1169 target,
1170 new Selector(selector.kind, selector.memberName, callStructure),
1171 elements.getTypeMask(node),
1172 arguments);
1173 }));
1149 } 1174 }
1150 1175
1151 ir.Primitive handleLocalInvoke( 1176 ir.Primitive handleLocalInvoke(
1152 ast.Send node, 1177 ast.Send node,
1153 LocalElement element, 1178 LocalElement element,
1154 ast.NodeList arguments, 1179 ast.NodeList argumentsNode,
1155 CallStructure callStructure, 1180 CallStructure callStructure,
1156 _) { 1181 _) {
1157 return irBuilder.buildLocalVariableInvocation(element, callStructure, 1182 List<ir.Primitive> arguments = <ir.Primitive>[];
1158 translateDynamicArguments(arguments, callStructure), 1183 callStructure =
1184 translateDynamicArguments(argumentsNode, callStructure, arguments);
1185 return irBuilder.buildLocalVariableInvocation(
1186 element,
1187 callStructure,
1188 arguments,
1159 callSourceInformation: 1189 callSourceInformation:
1160 sourceInformationBuilder.buildCall(node, arguments)); 1190 sourceInformationBuilder.buildCall(node, argumentsNode));
1161 } 1191 }
1162 1192
1163 @override 1193 @override
1164 ir.Primitive visitLocalFunctionInvoke( 1194 ir.Primitive visitLocalFunctionInvoke(
1165 ast.Send node, 1195 ast.Send node,
1166 LocalFunctionElement function, 1196 LocalFunctionElement function,
1167 ast.NodeList arguments, 1197 ast.NodeList argumentsNode,
1168 CallStructure callStructure, 1198 CallStructure callStructure,
1169 _) { 1199 _) {
1170 return irBuilder.buildLocalFunctionInvocation(function, callStructure, 1200 List<ir.Primitive> arguments = <ir.Primitive>[];
1171 translateDynamicArguments(arguments, callStructure), 1201 callStructure =
1172 sourceInformationBuilder.buildCall(node, arguments)); 1202 translateDynamicArguments(argumentsNode, callStructure, arguments);
1203 return irBuilder.buildLocalFunctionInvocation(
1204 function,
1205 callStructure,
1206 arguments,
1207 sourceInformationBuilder.buildCall(node, argumentsNode));
1173 } 1208 }
1174 1209
1175 @override 1210 @override
1176 ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) { 1211 ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) {
1177 return buildStaticFieldGet(field, sourceInformationBuilder.buildGet(node)); 1212 return buildStaticFieldGet(field, sourceInformationBuilder.buildGet(node));
1178 } 1213 }
1179 1214
1180 @override 1215 @override
1181 ir.Primitive handleStaticFieldInvoke( 1216 ir.Primitive handleStaticFieldInvoke(
1182 ast.Send node, 1217 ast.Send node,
1183 FieldElement field, 1218 FieldElement field,
1184 ast.NodeList arguments, 1219 ast.NodeList argumentsNode,
1185 CallStructure callStructure, 1220 CallStructure callStructure,
1186 _) { 1221 _) {
1187 SourceInformation src = sourceInformationBuilder.buildGet(node); 1222 SourceInformation src = sourceInformationBuilder.buildGet(node);
1188 ir.Primitive target = buildStaticFieldGet(field, src); 1223 ir.Primitive target = buildStaticFieldGet(field, src);
1189 return irBuilder.buildCallInvocation(target, 1224 List<ir.Primitive> arguments = <ir.Primitive>[];
1225 callStructure =
1226 translateDynamicArguments(argumentsNode, callStructure, arguments);
1227 return irBuilder.buildCallInvocation(
1228 target,
1190 callStructure, 1229 callStructure,
1191 translateDynamicArguments(arguments, callStructure), 1230 arguments,
1192 sourceInformation: 1231 sourceInformation:
1193 sourceInformationBuilder.buildCall(node, arguments)); 1232 sourceInformationBuilder.buildCall(node, argumentsNode));
1194 } 1233 }
1195 1234
1196 @override 1235 @override
1197 ir.Primitive handleStaticFunctionInvoke( 1236 ir.Primitive handleStaticFunctionInvoke(
1198 ast.Send node, 1237 ast.Send node,
1199 MethodElement function, 1238 MethodElement function,
1200 ast.NodeList arguments, 1239 ast.NodeList arguments,
1201 CallStructure callStructure, 1240 CallStructure callStructure,
1202 _); 1241 _);
1203 1242
1204 @override 1243 @override
1205 ir.Primitive handleStaticFunctionIncompatibleInvoke( 1244 ir.Primitive handleStaticFunctionIncompatibleInvoke(
1206 ast.Send node, 1245 ast.Send node,
1207 MethodElement function, 1246 MethodElement function,
1208 ast.NodeList arguments, 1247 ast.NodeList arguments,
1209 CallStructure callStructure, _) { 1248 CallStructure callStructure, _) {
1210 return buildStaticNoSuchMethod( 1249 return buildStaticNoSuchMethod(
1211 elements.getSelector(node), 1250 elements.getSelector(node),
1212 arguments.nodes.mapToList(visit)); 1251 arguments.nodes.mapToList(visit));
1213 } 1252 }
1214 1253
1215 @override 1254 @override
1216 ir.Primitive handleStaticGetterInvoke( 1255 ir.Primitive handleStaticGetterInvoke(
1217 ast.Send node, 1256 ast.Send node,
1218 FunctionElement getter, 1257 FunctionElement getter,
1219 ast.NodeList arguments, 1258 ast.NodeList argumentsNode,
1220 CallStructure callStructure, 1259 CallStructure callStructure,
1221 _) { 1260 _) {
1222 ir.Primitive target = irBuilder.buildStaticGetterGet( 1261 ir.Primitive target = irBuilder.buildStaticGetterGet(getter,
1223 getter, sourceInformationBuilder.buildGet(node)); 1262 sourceInformationBuilder.buildGet(node));
1224 return irBuilder.buildCallInvocation(target, 1263 List<ir.Primitive> arguments = <ir.Primitive>[];
1264 callStructure =
1265 translateDynamicArguments(argumentsNode, callStructure, arguments);
1266 return irBuilder.buildCallInvocation(
1267 target,
1225 callStructure, 1268 callStructure,
1226 translateDynamicArguments(arguments, callStructure), 1269 arguments,
1227 sourceInformation: 1270 sourceInformation:
1228 sourceInformationBuilder.buildCall(node, arguments)); 1271 sourceInformationBuilder.buildCall(node, argumentsNode));
1229 } 1272 }
1230 1273
1231 @override 1274 @override
1232 ir.Primitive visitSuperFieldInvoke( 1275 ir.Primitive visitSuperFieldInvoke(
1233 ast.Send node, 1276 ast.Send node,
1234 FieldElement field, 1277 FieldElement field,
1235 ast.NodeList arguments, 1278 ast.NodeList argumentsNode,
1236 CallStructure callStructure, 1279 CallStructure callStructure,
1237 _) { 1280 _) {
1238 ir.Primitive target = irBuilder.buildSuperFieldGet(field); 1281 ir.Primitive target = irBuilder.buildSuperFieldGet(field);
1239 return irBuilder.buildCallInvocation(target, 1282 List<ir.Primitive> arguments = <ir.Primitive>[];
1283 callStructure =
1284 translateDynamicArguments(argumentsNode, callStructure, arguments);
1285 return irBuilder.buildCallInvocation(
1286 target,
1240 callStructure, 1287 callStructure,
1241 translateDynamicArguments(arguments, callStructure), 1288 arguments,
1242 sourceInformation: 1289 sourceInformation:
1243 sourceInformationBuilder.buildCall(node, arguments)); 1290 sourceInformationBuilder.buildCall(node, argumentsNode));
1244 } 1291 }
1245 1292
1246 @override 1293 @override
1247 ir.Primitive visitSuperGetterInvoke( 1294 ir.Primitive visitSuperGetterInvoke(
1248 ast.Send node, 1295 ast.Send node,
1249 FunctionElement getter, 1296 FunctionElement getter,
1250 ast.NodeList arguments, 1297 ast.NodeList argumentsNode,
1251 CallStructure callStructure, 1298 CallStructure callStructure,
1252 _) { 1299 _) {
1253 ir.Primitive target = irBuilder.buildSuperGetterGet( 1300 ir.Primitive target = irBuilder.buildSuperGetterGet(getter,
1254 getter, sourceInformationBuilder.buildGet(node)); 1301 sourceInformationBuilder.buildGet(node));
1255 return irBuilder.buildCallInvocation(target, 1302 List<ir.Primitive> arguments = <ir.Primitive>[];
1303 callStructure =
1304 translateDynamicArguments(argumentsNode, callStructure, arguments);
1305 return irBuilder.buildCallInvocation(
1306 target,
1256 callStructure, 1307 callStructure,
1257 translateDynamicArguments(arguments, callStructure), 1308 arguments,
1258 sourceInformation: 1309 sourceInformation:
1259 sourceInformationBuilder.buildCall(node, arguments)); 1310 sourceInformationBuilder.buildCall(node, argumentsNode));
1260 } 1311 }
1261 1312
1262 @override 1313 @override
1263 ir.Primitive visitSuperMethodInvoke( 1314 ir.Primitive visitSuperMethodInvoke(
1264 ast.Send node, 1315 ast.Send node,
1265 MethodElement method, 1316 MethodElement method,
1266 ast.NodeList arguments, 1317 ast.NodeList argumentsNode,
1267 CallStructure callStructure, 1318 CallStructure callStructure,
1268 _) { 1319 _) {
1269 return irBuilder.buildSuperMethodInvocation(method, callStructure, 1320 List<ir.Primitive> arguments = <ir.Primitive>[];
1270 translateDynamicArguments(arguments, callStructure), 1321 callStructure =
1322 translateDynamicArguments(argumentsNode, callStructure, arguments);
1323 return irBuilder.buildSuperMethodInvocation(
1324 method,
1325 callStructure,
1326 arguments,
1271 sourceInformation: 1327 sourceInformation:
1272 sourceInformationBuilder.buildCall(node, node.selector)); 1328 sourceInformationBuilder.buildCall(node, node.selector));
1273 } 1329 }
1274 1330
1275 @override 1331 @override
1276 ir.Primitive visitSuperMethodIncompatibleInvoke( 1332 ir.Primitive visitSuperMethodIncompatibleInvoke(
1277 ast.Send node, 1333 ast.Send node,
1278 MethodElement method, 1334 MethodElement method,
1279 ast.NodeList arguments, 1335 ast.NodeList arguments,
1280 CallStructure callStructure, _) { 1336 CallStructure callStructure, _) {
1337 List<ir.Primitive> normalizedArguments = <ir.Primitive>[];
1338 CallStructure normalizedCallStructure =
1339 translateDynamicArguments(arguments, callStructure, normalizedArguments);
1281 return buildInstanceNoSuchMethod( 1340 return buildInstanceNoSuchMethod(
1282 elements.getSelector(node), 1341 new Selector.call(method.memberName, normalizedCallStructure),
1283 elements.getTypeMask(node), 1342 elements.getTypeMask(node),
1284 translateDynamicArguments(arguments, callStructure)); 1343 normalizedArguments);
1285 } 1344 }
1286 1345
1287 @override 1346 @override
1288 ir.Primitive visitUnresolvedSuperInvoke( 1347 ir.Primitive visitUnresolvedSuperInvoke(
1289 ast.Send node, 1348 ast.Send node,
1290 Element element, 1349 Element element,
1291 ast.NodeList arguments, 1350 ast.NodeList argumentsNode,
1292 Selector selector, _) { 1351 Selector selector, _) {
1352 List<ir.Primitive> arguments = <ir.Primitive>[];
1353 CallStructure callStructure = translateDynamicArguments(
1354 argumentsNode, selector.callStructure, arguments);
1355 // TODO(johnniwinther): Supply a member name to the visit function instead
1356 // of looking it up in elements.
1293 return buildInstanceNoSuchMethod( 1357 return buildInstanceNoSuchMethod(
1294 elements.getSelector(node), 1358 new Selector.call(elements.getSelector(node).memberName, callStructure),
1295 elements.getTypeMask(node), 1359 elements.getTypeMask(node),
1296 translateDynamicArguments(arguments, selector.callStructure)); 1360 arguments);
1297 } 1361 }
1298 1362
1299 @override 1363 @override
1300 ir.Primitive visitThisInvoke( 1364 ir.Primitive visitThisInvoke(
1301 ast.Send node, 1365 ast.Send node,
1302 ast.NodeList arguments, 1366 ast.NodeList arguments,
1303 CallStructure callStructure, 1367 CallStructure callStructure,
1304 _) { 1368 _) {
1305 return translateCallInvoke( 1369 return translateCallInvoke(
1306 irBuilder.buildThis(), 1370 irBuilder.buildThis(),
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1364 1428
1365 Selector operatorSelector = 1429 Selector operatorSelector =
1366 new Selector.binaryOperator(operator.selectorName); 1430 new Selector.binaryOperator(operator.selectorName);
1367 ir.Primitive rhsValue; 1431 ir.Primitive rhsValue;
1368 if (rhs.kind == CompoundKind.ASSIGNMENT) { 1432 if (rhs.kind == CompoundKind.ASSIGNMENT) {
1369 rhsValue = visit(rhs.rhs); 1433 rhsValue = visit(rhs.rhs);
1370 } else { 1434 } else {
1371 rhsValue = irBuilder.buildIntegerConstant(1); 1435 rhsValue = irBuilder.buildIntegerConstant(1);
1372 } 1436 }
1373 List<ir.Primitive> arguments = <ir.Primitive>[rhsValue]; 1437 List<ir.Primitive> arguments = <ir.Primitive>[rhsValue];
1374 arguments = normalizeDynamicArguments( 1438 CallStructure callStructure =
1375 operatorSelector.callStructure, arguments); 1439 normalizeDynamicArguments(operatorSelector.callStructure, arguments);
1376 TypeMask operatorTypeMask = 1440 TypeMask operatorTypeMask =
1377 elements.getOperatorTypeMaskInComplexSendSet(node); 1441 elements.getOperatorTypeMaskInComplexSendSet(node);
1378 SourceInformation operatorSourceInformation = 1442 SourceInformation operatorSourceInformation =
1379 sourceInformationBuilder.buildCall(node, node.assignmentOperator); 1443 sourceInformationBuilder.buildCall(node, node.assignmentOperator);
1380 ir.Primitive result = irBuilder.buildDynamicInvocation( 1444 ir.Primitive result = irBuilder.buildDynamicInvocation(
1381 value, operatorSelector, operatorTypeMask, arguments, 1445 value,
1382 sourceInformation: operatorSourceInformation); 1446 new Selector(operatorSelector.kind, operatorSelector.memberName,
1447 callStructure),
1448 operatorTypeMask,
1449 arguments,
1450 sourceInformation: operatorSourceInformation);
1383 setValue(result); 1451 setValue(result);
1384 return rhs.kind == CompoundKind.POSTFIX ? value : result; 1452 return rhs.kind == CompoundKind.POSTFIX ? value : result;
1385 } 1453 }
1386 1454
1387 ir.Primitive translateSetIfNull( 1455 ir.Primitive translateSetIfNull(
1388 ast.SendSet node, 1456 ast.SendSet node,
1389 {ir.Primitive getValue(), 1457 {ir.Primitive getValue(),
1390 ast.Node rhs, 1458 ast.Node rhs,
1391 void setValue(ir.Primitive value)}) { 1459 void setValue(ir.Primitive value)}) {
1392 ir.Primitive value = getValue(); 1460 ir.Primitive value = getValue();
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after
1851 ast.Node index, 1919 ast.Node index,
1852 CompoundRhs rhs, 1920 CompoundRhs rhs,
1853 arg) { 1921 arg) {
1854 ir.Primitive target = visit(receiver); 1922 ir.Primitive target = visit(receiver);
1855 ir.Primitive indexValue = visit(index); 1923 ir.Primitive indexValue = visit(index);
1856 return translateCompounds( 1924 return translateCompounds(
1857 node, 1925 node,
1858 getValue: () { 1926 getValue: () {
1859 Selector selector = new Selector.index(); 1927 Selector selector = new Selector.index();
1860 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; 1928 List<ir.Primitive> arguments = <ir.Primitive>[indexValue];
1861 arguments = 1929 CallStructure callStructure =
1862 normalizeDynamicArguments(selector.callStructure, arguments); 1930 normalizeDynamicArguments(selector.callStructure, arguments);
1863 return irBuilder.buildDynamicInvocation( 1931 return irBuilder.buildDynamicInvocation(
1864 target, 1932 target,
1865 selector, 1933 new Selector(selector.kind, selector.memberName, callStructure),
1866 elements.getGetterTypeMaskInComplexSendSet(node), 1934 elements.getGetterTypeMaskInComplexSendSet(node),
1867 arguments, 1935 arguments,
1868 sourceInformation: 1936 sourceInformation:
1869 sourceInformationBuilder.buildCall(receiver, node)); 1937 sourceInformationBuilder.buildCall(receiver, node));
1870 }, 1938 },
1871 rhs: rhs, 1939 rhs: rhs,
1872 setValue: (ir.Primitive result) { 1940 setValue: (ir.Primitive result) {
1873 irBuilder.buildDynamicIndexSet( 1941 irBuilder.buildDynamicIndexSet(
1874 target, 1942 target,
1875 elements.getTypeMask(node), 1943 elements.getTypeMask(node),
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
2001 Selector selector, _) { 2069 Selector selector, _) {
2002 // If the class is missing it's a runtime error. 2070 // If the class is missing it's a runtime error.
2003 return buildRuntimeError("Unresolved class: '${element.name}'"); 2071 return buildRuntimeError("Unresolved class: '${element.name}'");
2004 } 2072 }
2005 2073
2006 @override 2074 @override
2007 ir.Primitive visitUnresolvedConstructorInvoke( 2075 ir.Primitive visitUnresolvedConstructorInvoke(
2008 ast.NewExpression node, 2076 ast.NewExpression node,
2009 Element constructor, 2077 Element constructor,
2010 DartType type, 2078 DartType type,
2011 ast.NodeList arguments, 2079 ast.NodeList argumentsNode,
2012 Selector selector, _) { 2080 Selector selector, _) {
2013 // If the class is there but the constructor is missing, it's an NSM error. 2081 // If the class is there but the constructor is missing, it's an NSM error.
2014 return buildStaticNoSuchMethod(selector, 2082 List<ir.Primitive> arguments = <ir.Primitive>[];
2015 translateDynamicArguments(arguments, selector.callStructure)); 2083 CallStructure callStructure = translateDynamicArguments(
2084 argumentsNode, selector.callStructure, arguments);
2085 return buildStaticNoSuchMethod(
2086 new Selector(selector.kind, selector.memberName, callStructure),
2087 arguments);
2016 } 2088 }
2017 2089
2018 @override 2090 @override
2019 ir.Primitive visitConstructorIncompatibleInvoke( 2091 ir.Primitive visitConstructorIncompatibleInvoke(
2020 ast.NewExpression node, 2092 ast.NewExpression node,
2021 Element constructor, 2093 ConstructorElement constructor,
2022 DartType type, 2094 DartType type,
2023 ast.NodeList arguments, 2095 ast.NodeList argumentsNode,
2024 CallStructure callStructure, _) { 2096 CallStructure callStructure, _) {
2025 return buildStaticNoSuchMethod(elements.getSelector(node.send), 2097 List<ir.Primitive> arguments = <ir.Primitive>[];
2026 translateDynamicArguments(arguments, callStructure)); 2098 callStructure =
2099 translateDynamicArguments(argumentsNode, callStructure, arguments);
2100 return buildStaticNoSuchMethod(
2101 new Selector.call(constructor.memberName, callStructure), arguments);
2027 } 2102 }
2028 2103
2029 @override 2104 @override
2030 ir.Primitive visitUnresolvedGet( 2105 ir.Primitive visitUnresolvedGet(
2031 ast.Send node, 2106 ast.Send node,
2032 Element element, _) { 2107 Element element, _) {
2033 return buildStaticNoSuchMethod(elements.getSelector(node), []); 2108 return buildStaticNoSuchMethod(elements.getSelector(node), []);
2034 } 2109 }
2035 2110
2036 @override 2111 @override
2037 ir.Primitive visitUnresolvedInvoke( 2112 ir.Primitive visitUnresolvedInvoke(
2038 ast.Send node, 2113 ast.Send node,
2039 Element element, 2114 Element element,
2040 ast.NodeList arguments, 2115 ast.NodeList arguments,
2041 Selector selector, _) { 2116 Selector selector, _) {
2042 return buildStaticNoSuchMethod(elements.getSelector(node), 2117 return buildStaticNoSuchMethod(elements.getSelector(node),
2043 arguments.nodes.mapToList(visit)); 2118 arguments.nodes.mapToList(visit));
2044 } 2119 }
2045 2120
2046 @override 2121 @override
2047 ir.Primitive visitUnresolvedRedirectingFactoryConstructorInvoke( 2122 ir.Primitive visitUnresolvedRedirectingFactoryConstructorInvoke(
2048 ast.NewExpression node, 2123 ast.NewExpression node,
2049 ConstructorElement constructor, 2124 ConstructorElement constructor,
2050 InterfaceType type, 2125 InterfaceType type,
2051 ast.NodeList arguments, 2126 ast.NodeList argumentsNode,
2052 CallStructure callStructure, _) { 2127 CallStructure callStructure, _) {
2053 String nameString = Elements.reconstructConstructorName(constructor); 2128 String nameString = Elements.reconstructConstructorName(constructor);
2054 Name name = new Name(nameString, constructor.library); 2129 Name name = new Name(nameString, constructor.library);
2130 List<ir.Primitive> arguments = <ir.Primitive>[];
2131 callStructure =
2132 translateDynamicArguments(argumentsNode, callStructure, arguments);
2055 return buildStaticNoSuchMethod( 2133 return buildStaticNoSuchMethod(
2056 new Selector.call(name, callStructure), 2134 new Selector.call(name, callStructure),
2057 translateDynamicArguments(arguments, callStructure)); 2135 arguments);
2058 } 2136 }
2059 2137
2060 @override 2138 @override
2061 ir.Primitive visitUnresolvedSet( 2139 ir.Primitive visitUnresolvedSet(
2062 ast.Send node, 2140 ast.Send node,
2063 Element element, 2141 Element element,
2064 ast.Node rhs, _) { 2142 ast.Node rhs, _) {
2065 return buildStaticNoSuchMethod(elements.getSelector(node), [visit(rhs)]); 2143 return buildStaticNoSuchMethod(elements.getSelector(node), [visit(rhs)]);
2066 } 2144 }
2067 2145
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
2220 _) { 2298 _) {
2221 return buildStaticNoSuchMethod( 2299 return buildStaticNoSuchMethod(
2222 new Selector.getter(setter.memberName), 2300 new Selector.getter(setter.memberName),
2223 []); 2301 []);
2224 } 2302 }
2225 2303
2226 @override 2304 @override
2227 ir.Primitive handleStaticSetterInvoke( 2305 ir.Primitive handleStaticSetterInvoke(
2228 ast.Send node, 2306 ast.Send node,
2229 SetterElement setter, 2307 SetterElement setter,
2230 ast.NodeList arguments, 2308 ast.NodeList argumentsNode,
2231 CallStructure callStructure, _) { 2309 CallStructure callStructure, _) {
2232 // Translate as a method call. 2310 // Translate as a method call.
2233 List<ir.Primitive> args = arguments.nodes.mapToList(visit); 2311 List<ir.Primitive> arguments = argumentsNode.nodes.mapToList(visit);
2234 return buildStaticNoSuchMethod( 2312 return buildStaticNoSuchMethod(
2235 new Selector.call(setter.memberName, callStructure), 2313 new Selector.call(setter.memberName, callStructure),
2236 args); 2314 arguments);
2237 } 2315 }
2238 2316
2239 @override 2317 @override
2240 ir.Primitive visitSuperGetterSet( 2318 ir.Primitive visitSuperGetterSet(
2241 ast.SendSet node, 2319 ast.SendSet node,
2242 GetterElement getter, 2320 GetterElement getter,
2243 ast.Node rhs, 2321 ast.Node rhs,
2244 _) { 2322 _) {
2245 return buildInstanceNoSuchMethod( 2323 return buildInstanceNoSuchMethod(
2246 new Selector.setter(getter.memberName), 2324 new Selector.setter(getter.memberName),
(...skipping 20 matching lines...) Expand all
2267 return buildInstanceNoSuchMethod( 2345 return buildInstanceNoSuchMethod(
2268 new Selector.setter(setter.memberName), 2346 new Selector.setter(setter.memberName),
2269 elements.getTypeMask(node), 2347 elements.getTypeMask(node),
2270 []); 2348 []);
2271 } 2349 }
2272 2350
2273 @override 2351 @override
2274 ir.Primitive visitSuperSetterInvoke( 2352 ir.Primitive visitSuperSetterInvoke(
2275 ast.Send node, 2353 ast.Send node,
2276 SetterElement setter, 2354 SetterElement setter,
2277 ast.NodeList arguments, 2355 ast.NodeList argumentsNode,
2278 CallStructure callStructure, _) { 2356 CallStructure callStructure, _) {
2279 List<ir.Primitive> args = 2357 List<ir.Primitive> arguments = <ir.Primitive>[];
2280 translateDynamicArguments(arguments, callStructure); 2358 callStructure =
2359 translateDynamicArguments(argumentsNode, callStructure, arguments);
2281 return buildInstanceNoSuchMethod( 2360 return buildInstanceNoSuchMethod(
2282 new Selector.call(setter.memberName, callStructure), 2361 new Selector.call(setter.memberName, callStructure),
2283 elements.getTypeMask(node), 2362 elements.getTypeMask(node),
2284 args); 2363 arguments);
2285 } 2364 }
2286 2365
2287 ir.FunctionDefinition nullIfGiveup(ir.FunctionDefinition action()) { 2366 ir.FunctionDefinition nullIfGiveup(ir.FunctionDefinition action()) {
2288 try { 2367 try {
2289 return action(); 2368 return action();
2290 } catch(e) { 2369 } catch(e) {
2291 if (e == ABORT_IRNODE_BUILDER) { 2370 if (e == ABORT_IRNODE_BUILDER) {
2292 return null; 2371 return null;
2293 } 2372 }
2294 rethrow; 2373 rethrow;
(...skipping 906 matching lines...) Expand 10 before | Expand all | Expand 10 after
3201 3280
3202 /// Creates a primitive for the default value of [parameter]. 3281 /// Creates a primitive for the default value of [parameter].
3203 ir.Primitive translateDefaultValue(ParameterElement parameter) { 3282 ir.Primitive translateDefaultValue(ParameterElement parameter) {
3204 if (parameter.initializer == null) { 3283 if (parameter.initializer == null) {
3205 return irBuilder.buildNullConstant(); 3284 return irBuilder.buildNullConstant();
3206 } else { 3285 } else {
3207 return inlineConstant(parameter.executableContext, parameter.initializer); 3286 return inlineConstant(parameter.executableContext, parameter.initializer);
3208 } 3287 }
3209 } 3288 }
3210 3289
3211 /// Inserts default arguments and normalizes order of named arguments. 3290 CallStructure normalizeStaticArguments(CallStructure callStructure,
3212 List<ir.Primitive> normalizeStaticArguments( 3291 FunctionElement target,
3213 CallStructure callStructure, 3292 List<ir.Primitive> arguments) {
3214 FunctionElement target,
3215 List<ir.Primitive> arguments) {
3216 target = target.implementation; 3293 target = target.implementation;
3217 FunctionSignature signature = target.functionSignature; 3294 FunctionSignature signature = target.functionSignature;
3218 if (!signature.optionalParametersAreNamed && 3295 if (!signature.optionalParametersAreNamed &&
3219 signature.parameterCount == arguments.length) { 3296 signature.parameterCount == arguments.length) {
3220 // Optimization: don't copy the argument list for trivial cases. 3297 return callStructure;
3221 return arguments;
3222 } 3298 }
3223 3299
3224 List<ir.Primitive> result = <ir.Primitive>[];
3225 int i = 0;
3226 signature.forEachRequiredParameter((ParameterElement element) {
3227 result.add(arguments[i]);
3228 ++i;
3229 });
3230
3231 if (!signature.optionalParametersAreNamed) { 3300 if (!signature.optionalParametersAreNamed) {
3301 int i = signature.requiredParameterCount;
3232 signature.forEachOptionalParameter((ParameterElement element) { 3302 signature.forEachOptionalParameter((ParameterElement element) {
3233 if (i < arguments.length) { 3303 if (i < callStructure.positionalArgumentCount) {
3234 result.add(arguments[i]);
3235 ++i; 3304 ++i;
3236 } else { 3305 } else {
3237 result.add(translateDefaultValue(element)); 3306 arguments.add(translateDefaultValue(element));
3238 } 3307 }
3239 }); 3308 });
3240 } else { 3309 return new CallStructure(signature.parameterCount);
3241 int offset = i;
3242 // Iterate over the optional parameters of the signature, and try to
3243 // find them in [compiledNamedArguments]. If found, we use the
3244 // value in the temporary list, otherwise the default value.
3245 signature.orderedOptionalParameters.forEach((ParameterElement element) {
3246 int nameIndex = callStructure.namedArguments.indexOf(element.name);
3247 if (nameIndex != -1) {
3248 int translatedIndex = offset + nameIndex;
3249 result.add(arguments[translatedIndex]);
3250 } else {
3251 result.add(translateDefaultValue(element));
3252 }
3253 });
3254 } 3310 }
3255 return result; 3311
3312 int offset = signature.requiredParameterCount;
3313 List<ir.Primitive> namedArguments = arguments.sublist(offset);
3314 arguments.length = offset;
3315 List<String> normalizedNames = <String>[];
3316 // Iterate over the optional parameters of the signature, and try to
3317 // find them in the callStructure's named arguments. If found, we use the
3318 // value in the temporary list, otherwise the default value.
3319 signature.orderedOptionalParameters.forEach((ParameterElement element) {
3320 int nameIndex = callStructure.namedArguments.indexOf(element.name);
3321 arguments.add(nameIndex == -1 ? translateDefaultValue(element)
3322 : namedArguments[nameIndex]);
3323 normalizedNames.add(element.name);
3324 });
3325 return new CallStructure(signature.parameterCount, normalizedNames);
3256 } 3326 }
3257 3327
3258 /// Normalizes order of named arguments. 3328 CallStructure normalizeDynamicArguments(CallStructure callStructure,
3259 List<ir.Primitive> normalizeDynamicArguments( 3329 List<ir.Primitive> arguments) {
3260 CallStructure callStructure,
3261 List<ir.Primitive> arguments) {
3262 assert(arguments.length == callStructure.argumentCount); 3330 assert(arguments.length == callStructure.argumentCount);
3263 // Optimization: don't copy the argument list for trivial cases. 3331 if (callStructure.namedArguments.isEmpty) return callStructure;
3264 if (callStructure.namedArguments.isEmpty) return arguments; 3332 int destinationIndex = callStructure.positionalArgumentCount;
3265 List<ir.Primitive> result = <ir.Primitive>[]; 3333 List<ir.Primitive> namedArguments = arguments.sublist(destinationIndex);
3266 for (int i=0; i < callStructure.positionalArgumentCount; i++) { 3334 for (String argName in callStructure.getOrderedNamedArguments()) {
3267 result.add(arguments[i]); 3335 int sourceIndex = callStructure.namedArguments.indexOf(argName);
3336 arguments[destinationIndex++] = namedArguments[sourceIndex];
3268 } 3337 }
3269 for (String argName in callStructure.getOrderedNamedArguments()) { 3338 return new CallStructure(callStructure.argumentCount,
3270 int nameIndex = callStructure.namedArguments.indexOf(argName); 3339 callStructure.getOrderedNamedArguments());
3271 int translatedIndex = callStructure.positionalArgumentCount + nameIndex;
3272 result.add(arguments[translatedIndex]);
3273 }
3274 return result;
3275 } 3340 }
3276 3341
3277 @override 3342 @override
3278 ir.Primitive handleConstructorInvoke( 3343 ir.Primitive handleConstructorInvoke(
3279 ast.NewExpression node, 3344 ast.NewExpression node,
3280 ConstructorElement constructor, 3345 ConstructorElement constructor,
3281 DartType type, 3346 DartType type,
3282 ast.NodeList arguments, 3347 ast.NodeList argumentsNode,
3283 CallStructure callStructure, 3348 CallStructure callStructure,
3284 _) { 3349 _) {
3285 List<ir.Primitive> arguments = 3350 List<ir.Primitive> arguments = argumentsNode.nodes.mapToList(visit);
3286 node.send.arguments.mapToList(visit, growable:false);
3287 // Use default values from the effective target, not the immediate target. 3351 // Use default values from the effective target, not the immediate target.
3288 ConstructorElement target = constructor.effectiveTarget; 3352 ConstructorElement target = constructor.effectiveTarget;
3289 arguments = normalizeStaticArguments(callStructure, target, arguments); 3353 callStructure =
3354 normalizeStaticArguments(callStructure, target, arguments);
3290 TypeMask allocationSiteType; 3355 TypeMask allocationSiteType;
3291 ast.Node send = node.send; 3356 ast.Node send = node.send;
3292 if (Elements.isFixedListConstructorCall(constructor, send, compiler) || 3357 if (Elements.isFixedListConstructorCall(constructor, send, compiler) ||
3293 Elements.isGrowableListConstructorCall(constructor, send, compiler) || 3358 Elements.isGrowableListConstructorCall(constructor, send, compiler) ||
3294 Elements.isFilledListConstructorCall(constructor, send, compiler) || 3359 Elements.isFilledListConstructorCall(constructor, send, compiler) ||
3295 Elements.isConstructorOfTypedArraySubclass(constructor, compiler)) { 3360 Elements.isConstructorOfTypedArraySubclass(constructor, compiler)) {
3296 allocationSiteType = getAllocationSiteType(send); 3361 allocationSiteType = getAllocationSiteType(send);
3297 } 3362 }
3298 return irBuilder.buildConstructorInvocation( 3363 return irBuilder.buildConstructorInvocation(
3299 target, 3364 target,
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
3390 } 3455 }
3391 3456
3392 /// Call a helper method from the isolate library. The isolate library uses 3457 /// Call a helper method from the isolate library. The isolate library uses
3393 /// its own isolate structure, that encapsulates dart2js's isolate. 3458 /// its own isolate structure, that encapsulates dart2js's isolate.
3394 ir.Primitive buildIsolateHelperInvocation(Element element, 3459 ir.Primitive buildIsolateHelperInvocation(Element element,
3395 CallStructure callStructure) { 3460 CallStructure callStructure) {
3396 if (element == null) { 3461 if (element == null) {
3397 reporter.internalError(node, 3462 reporter.internalError(node,
3398 'Isolate library and compiler mismatch.'); 3463 'Isolate library and compiler mismatch.');
3399 } 3464 }
3400 List<ir.Primitive> arguments = translateStaticArguments(argumentList, 3465 List<ir.Primitive> arguments = <ir.Primitive>[];
3401 element, callStructure); 3466 callStructure = translateStaticArguments(argumentList, element,
3402 return irBuilder.buildStaticFunctionInvocation(element, 3467 callStructure, arguments);
3403 callStructure, arguments, 3468 return irBuilder.buildStaticFunctionInvocation(
3469 element,
3470 callStructure,
3471 arguments,
3404 sourceInformation: 3472 sourceInformation:
3405 sourceInformationBuilder.buildCall(node, node.selector)); 3473 sourceInformationBuilder.buildCall(node, node.selector));
3406 } 3474 }
3407 3475
3408 /// Lookup the value of the enum described by [node]. 3476 /// Lookup the value of the enum described by [node].
3409 getEnumValue(ast.Node node, EnumClassElement enumClass, List values) { 3477 getEnumValue(ast.Node node, EnumClassElement enumClass, List values) {
3410 Element element = elements[node]; 3478 Element element = elements[node];
3411 if (element is! FieldElement || element.enclosingClass != enumClass) { 3479 if (element is! FieldElement || element.enclosingClass != enumClass) {
3412 internalError(node, 'expected a JsBuiltin enum value'); 3480 internalError(node, 'expected a JsBuiltin enum value');
3413 } 3481 }
3414 3482
3415 int index = enumClass.enumValues.indexOf(element); 3483 int index = enumClass.enumValues.indexOf(element);
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
3585 3653
3586 default: 3654 default:
3587 giveup(node, 'unplemented native construct: ${function.name}'); 3655 giveup(node, 'unplemented native construct: ${function.name}');
3588 break; 3656 break;
3589 } 3657 }
3590 } 3658 }
3591 3659
3592 @override 3660 @override
3593 ir.Primitive handleStaticFunctionInvoke(ast.Send node, 3661 ir.Primitive handleStaticFunctionInvoke(ast.Send node,
3594 MethodElement function, 3662 MethodElement function,
3595 ast.NodeList argumentList, 3663 ast.NodeList argumentsNode,
3596 CallStructure callStructure, 3664 CallStructure callStructure,
3597 _) { 3665 _) {
3598 if (compiler.backend.isForeign(function)) { 3666 if (compiler.backend.isForeign(function)) {
3599 return handleForeignCode(node, function, argumentList, callStructure); 3667 return handleForeignCode(node, function, argumentsNode, callStructure);
3600 } else { 3668 } else {
3601 return irBuilder.buildStaticFunctionInvocation(function, callStructure, 3669 List<ir.Primitive> arguments = <ir.Primitive>[];
3602 translateStaticArguments(argumentList, function, callStructure), 3670 callStructure = translateStaticArguments(argumentsNode, function,
3671 callStructure, arguments);
3672 return irBuilder.buildStaticFunctionInvocation(function,
3673 callStructure,
3674 arguments,
3603 sourceInformation: 3675 sourceInformation:
3604 sourceInformationBuilder.buildCall(node, node.selector)); 3676 sourceInformationBuilder.buildCall(node, node.selector));
3605 } 3677 }
3606 } 3678 }
3607 } 3679 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698