OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 = normalizeStaticArguments( |
320 arguments); | 320 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 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 = node.arguments.mapToList(visit); |
723 arguments = normalizeDynamicArguments(callStructure, arguments); | 723 CallStructure normalizedCallStructure = |
724 normalizeDynamicArguments(callStructure, arguments); | |
724 return irBuilder.buildCallInvocation( | 725 return irBuilder.buildCallInvocation( |
725 receiver, callStructure, arguments, | 726 receiver, normalizedCallStructure, arguments, |
726 sourceInformation: | 727 sourceInformation: |
727 sourceInformationBuilder.buildCall(node, argumentsNode)); | 728 sourceInformationBuilder.buildCall(node, argumentsNode)); |
728 } | 729 } |
729 | 730 |
730 /// Returns `true` if [node] is a super call. | 731 /// Returns `true` if [node] is a super call. |
731 // TODO(johnniwinther): Remove the need for this. | 732 // TODO(johnniwinther): Remove the need for this. |
732 bool isSuperCall(ast.Send node) { | 733 bool isSuperCall(ast.Send node) { |
733 return node != null && node.receiver != null && node.receiver.isSuper(); | 734 return node != null && node.receiver != null && node.receiver.isSuper(); |
734 } | 735 } |
735 | 736 |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
946 return irBuilder.buildNegation(check); | 947 return irBuilder.buildNegation(check); |
947 } | 948 } |
948 | 949 |
949 ir.Primitive translateBinary(ast.Send node, | 950 ir.Primitive translateBinary(ast.Send node, |
950 ast.Node left, | 951 ast.Node left, |
951 op.BinaryOperator operator, | 952 op.BinaryOperator operator, |
952 ast.Node right) { | 953 ast.Node right) { |
953 Selector selector = new Selector.binaryOperator(operator.selectorName); | 954 Selector selector = new Selector.binaryOperator(operator.selectorName); |
954 ir.Primitive receiver = visit(left); | 955 ir.Primitive receiver = visit(left); |
955 List<ir.Primitive> arguments = <ir.Primitive>[visit(right)]; | 956 List<ir.Primitive> arguments = <ir.Primitive>[visit(right)]; |
956 arguments = normalizeDynamicArguments(selector.callStructure, arguments); | 957 CallStructure callStructure = |
958 normalizeDynamicArguments(selector.callStructure, arguments); | |
957 return irBuilder.buildDynamicInvocation( | 959 return irBuilder.buildDynamicInvocation( |
958 receiver, selector, elements.getTypeMask(node), arguments, | 960 receiver, |
961 new Selector(selector.kind, selector.memberName, callStructure), | |
962 elements.getTypeMask(node), | |
963 arguments, | |
959 sourceInformation: | 964 sourceInformation: |
960 sourceInformationBuilder.buildCall(node, node.selector)); | 965 sourceInformationBuilder.buildCall(node, node.selector)); |
961 } | 966 } |
962 | 967 |
963 @override | 968 @override |
964 ir.Primitive visitBinary(ast.Send node, | 969 ir.Primitive visitBinary(ast.Send node, |
965 ast.Node left, | 970 ast.Node left, |
966 op.BinaryOperator operator, | 971 op.BinaryOperator operator, |
967 ast.Node right, _) { | 972 ast.Node right, _) { |
968 return translateBinary(node, left, operator, right); | 973 return translateBinary(node, left, operator, right); |
969 } | 974 } |
970 | 975 |
971 @override | 976 @override |
972 ir.Primitive visitIndex(ast.Send node, | 977 ir.Primitive visitIndex(ast.Send node, |
973 ast.Node receiver, | 978 ast.Node receiver, |
974 ast.Node index, _) { | 979 ast.Node index, _) { |
975 Selector selector = new Selector.index(); | 980 Selector selector = new Selector.index(); |
976 ir.Primitive target = visit(receiver); | 981 ir.Primitive target = visit(receiver); |
977 List<ir.Primitive> arguments = <ir.Primitive>[visit(index)]; | 982 List<ir.Primitive> arguments = <ir.Primitive>[visit(index)]; |
978 arguments = normalizeDynamicArguments(selector.callStructure, arguments); | 983 CallStructure callStructure = |
984 normalizeDynamicArguments(selector.callStructure, arguments); | |
979 return irBuilder.buildDynamicInvocation( | 985 return irBuilder.buildDynamicInvocation( |
980 target, selector, elements.getTypeMask(node), arguments, | 986 target, |
987 new Selector(selector.kind, selector.memberName, callStructure), | |
988 elements.getTypeMask(node), | |
989 arguments, | |
981 sourceInformation: | 990 sourceInformation: |
982 sourceInformationBuilder.buildCall(receiver, node.selector)); | 991 sourceInformationBuilder.buildCall(receiver, node.selector)); |
983 } | 992 } |
984 | 993 |
985 ir.Primitive translateSuperBinary(FunctionElement function, | 994 ir.Primitive translateSuperBinary(FunctionElement function, |
986 op.BinaryOperator operator, | 995 op.BinaryOperator operator, |
987 ast.Node argument) { | 996 ast.Node argument) { |
988 CallStructure callStructure = CallStructure.ONE_ARG; | |
989 List<ir.Primitive> arguments = <ir.Primitive>[visit(argument)]; | 997 List<ir.Primitive> arguments = <ir.Primitive>[visit(argument)]; |
990 arguments = normalizeDynamicArguments(callStructure, arguments); | 998 CallStructure callStructure = |
999 normalizeDynamicArguments(CallStructure.ONE_ARG, arguments); | |
991 return irBuilder.buildSuperMethodInvocation( | 1000 return irBuilder.buildSuperMethodInvocation( |
992 function, callStructure, arguments); | 1001 function, callStructure, arguments); |
993 } | 1002 } |
994 | 1003 |
995 @override | 1004 @override |
996 ir.Primitive visitSuperBinary( | 1005 ir.Primitive visitSuperBinary( |
997 ast.Send node, | 1006 ast.Send node, |
998 FunctionElement function, | 1007 FunctionElement function, |
999 op.BinaryOperator operator, | 1008 op.BinaryOperator operator, |
1000 ast.Node argument, | 1009 ast.Node argument, |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1074 ast.Send node, | 1083 ast.Send node, |
1075 op.UnaryOperator operator, | 1084 op.UnaryOperator operator, |
1076 FunctionElement function, | 1085 FunctionElement function, |
1077 _) { | 1086 _) { |
1078 return irBuilder.buildSuperMethodInvocation( | 1087 return irBuilder.buildSuperMethodInvocation( |
1079 function, CallStructure.NO_ARGS, const []); | 1088 function, CallStructure.NO_ARGS, const []); |
1080 } | 1089 } |
1081 | 1090 |
1082 // TODO(johnniwinther): Handle this in the [IrBuilder] to ensure the correct | 1091 // TODO(johnniwinther): Handle this in the [IrBuilder] to ensure the correct |
1083 // semantic correlation between arguments and invocation. | 1092 // semantic correlation between arguments and invocation. |
1084 List<ir.Primitive> translateDynamicArguments(ast.NodeList nodeList, | 1093 CallStructure translateDynamicArguments(ast.NodeList nodeList, |
1085 CallStructure callStructure) { | 1094 CallStructure callStructure, |
1086 List<ir.Primitive> arguments = nodeList.nodes.mapToList(visit); | 1095 List<ir.Primitive> arguments) { |
1096 assert(arguments.isEmpty); | |
1097 for (ast.Node node in nodeList) arguments.add(visit(node)); | |
1087 return normalizeDynamicArguments(callStructure, arguments); | 1098 return normalizeDynamicArguments(callStructure, arguments); |
1088 } | 1099 } |
1089 | 1100 |
1090 // TODO(johnniwinther): Handle this in the [IrBuilder] to ensure the correct | 1101 // TODO(johnniwinther): Handle this in the [IrBuilder] to ensure the correct |
1091 // semantic correlation between arguments and invocation. | 1102 // semantic correlation between arguments and invocation. |
1092 List<ir.Primitive> translateStaticArguments(ast.NodeList nodeList, | 1103 CallStructure translateStaticArguments(ast.NodeList nodeList, |
1093 Element element, | 1104 Element element, |
1094 CallStructure callStructure) { | 1105 CallStructure callStructure, |
1095 List<ir.Primitive> arguments = nodeList.nodes.mapToList(visit); | 1106 List<ir.Primitive> arguments) { |
1107 assert(arguments.isEmpty); | |
1108 for (ast.Node node in nodeList) arguments.add(visit(node)); | |
1096 return normalizeStaticArguments(callStructure, element, arguments); | 1109 return normalizeStaticArguments(callStructure, element, arguments); |
1097 } | 1110 } |
1098 | 1111 |
1099 ir.Primitive translateCallInvoke(ir.Primitive target, | 1112 ir.Primitive translateCallInvoke(ir.Primitive target, |
1100 ast.NodeList arguments, | 1113 ast.NodeList arguments, |
1101 CallStructure callStructure, | 1114 CallStructure callStructure, |
1102 SourceInformation sourceInformation) { | 1115 SourceInformation sourceInformation) { |
1103 | 1116 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; |
1104 return irBuilder.buildCallInvocation(target, callStructure, | 1117 CallStructure normalizedCallStructure = translateDynamicArguments( |
1105 translateDynamicArguments(arguments, callStructure), | 1118 arguments, callStructure, normalizedArguments); |
1119 return irBuilder.buildCallInvocation(target, normalizedCallStructure, | |
1120 normalizedArguments, | |
1106 sourceInformation: sourceInformation); | 1121 sourceInformation: sourceInformation); |
1107 } | 1122 } |
1108 | 1123 |
1109 @override | 1124 @override |
1110 ir.Primitive handleConstantInvoke( | 1125 ir.Primitive handleConstantInvoke( |
1111 ast.Send node, | 1126 ast.Send node, |
1112 ConstantExpression constant, | 1127 ConstantExpression constant, |
1113 ast.NodeList arguments, | 1128 ast.NodeList arguments, |
1114 CallStructure callStructure, | 1129 CallStructure callStructure, |
1115 _) { | 1130 _) { |
1116 ir.Primitive target = buildConstantExpression(constant, | 1131 ir.Primitive target = buildConstantExpression(constant, |
1117 sourceInformationBuilder.buildGet(node)); | 1132 sourceInformationBuilder.buildGet(node)); |
1118 return translateCallInvoke(target, arguments, callStructure, | 1133 return translateCallInvoke(target, arguments, callStructure, |
1119 sourceInformationBuilder.buildCall(node, arguments)); | 1134 sourceInformationBuilder.buildCall(node, arguments)); |
1120 } | 1135 } |
1121 | 1136 |
1122 @override | 1137 @override |
1123 ir.Primitive handleDynamicInvoke( | 1138 ir.Primitive handleDynamicInvoke( |
1124 ast.Send node, | 1139 ast.Send node, |
1125 ast.Node receiver, | 1140 ast.Node receiver, |
1126 ast.NodeList arguments, | 1141 ast.NodeList arguments, |
1127 Selector selector, | 1142 Selector selector, |
1128 _) { | 1143 _) { |
1144 ir.Primitive target = translateReceiver(receiver); | |
1145 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; | |
1146 CallStructure normalizedCallStructure = translateDynamicArguments( | |
1147 arguments, selector.callStructure, normalizedArguments); | |
1129 return irBuilder.buildDynamicInvocation( | 1148 return irBuilder.buildDynamicInvocation( |
1130 translateReceiver(receiver), selector, elements.getTypeMask(node), | 1149 target, |
1131 translateDynamicArguments(arguments, selector.callStructure), | 1150 new Selector(selector.kind, selector.memberName, |
1151 normalizedCallStructure), | |
1152 elements.getTypeMask(node), | |
1153 normalizedArguments, | |
1132 sourceInformation: | 1154 sourceInformation: |
1133 sourceInformationBuilder.buildCall(node, node.selector)); | 1155 sourceInformationBuilder.buildCall(node, node.selector)); |
1134 } | 1156 } |
1135 | 1157 |
1136 @override | 1158 @override |
1137 ir.Primitive visitIfNotNullDynamicPropertyInvoke( | 1159 ir.Primitive visitIfNotNullDynamicPropertyInvoke( |
1138 ast.Send node, | 1160 ast.Send node, |
1139 ast.Node receiver, | 1161 ast.Node receiver, |
1140 ast.NodeList arguments, | 1162 ast.NodeList arguments, |
1141 Selector selector, | 1163 Selector selector, |
1142 _) { | 1164 _) { |
1143 ir.Primitive target = visit(receiver); | 1165 ir.Primitive target = visit(receiver); |
1144 return irBuilder.buildIfNotNullSend( | 1166 return irBuilder.buildIfNotNullSend( |
1145 target, | 1167 target, |
1146 nested(() => irBuilder.buildDynamicInvocation( | 1168 nested(() { |
1147 target, selector, elements.getTypeMask(node), | 1169 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; |
1148 translateDynamicArguments(arguments, selector.callStructure)))); | 1170 CallStructure normalizedCallStructure = translateDynamicArguments( |
1171 arguments, selector.callStructure, normalizedArguments); | |
1172 return irBuilder.buildDynamicInvocation( | |
1173 target, | |
1174 new Selector(selector.kind, selector.memberName, | |
1175 normalizedCallStructure), | |
1176 elements.getTypeMask(node), | |
1177 normalizedArguments); | |
1178 })); | |
1149 } | 1179 } |
1150 | 1180 |
1151 ir.Primitive handleLocalInvoke( | 1181 ir.Primitive handleLocalInvoke( |
1152 ast.Send node, | 1182 ast.Send node, |
1153 LocalElement element, | 1183 LocalElement element, |
1154 ast.NodeList arguments, | 1184 ast.NodeList arguments, |
1155 CallStructure callStructure, | 1185 CallStructure callStructure, |
1156 _) { | 1186 _) { |
1157 return irBuilder.buildLocalVariableInvocation(element, callStructure, | 1187 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; |
1158 translateDynamicArguments(arguments, callStructure), | 1188 CallStructure normalizedCallStructure = translateDynamicArguments( |
1189 arguments, callStructure, normalizedArguments); | |
1190 return irBuilder.buildLocalVariableInvocation( | |
1191 element, | |
1192 normalizedCallStructure, | |
1193 normalizedArguments, | |
1159 callSourceInformation: | 1194 callSourceInformation: |
1160 sourceInformationBuilder.buildCall(node, arguments)); | 1195 sourceInformationBuilder.buildCall(node, arguments)); |
1161 } | 1196 } |
1162 | 1197 |
1163 @override | 1198 @override |
1164 ir.Primitive visitLocalFunctionInvoke( | 1199 ir.Primitive visitLocalFunctionInvoke( |
1165 ast.Send node, | 1200 ast.Send node, |
1166 LocalFunctionElement function, | 1201 LocalFunctionElement function, |
1167 ast.NodeList arguments, | 1202 ast.NodeList arguments, |
1168 CallStructure callStructure, | 1203 CallStructure callStructure, |
1169 _) { | 1204 _) { |
1170 return irBuilder.buildLocalFunctionInvocation(function, callStructure, | 1205 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; |
1171 translateDynamicArguments(arguments, callStructure), | 1206 CallStructure normalizedCallStructure = translateDynamicArguments( |
1207 arguments, callStructure, normalizedArguments); | |
1208 return irBuilder.buildLocalFunctionInvocation( | |
1209 function, | |
1210 normalizedCallStructure, | |
1211 normalizedArguments, | |
1172 sourceInformationBuilder.buildCall(node, arguments)); | 1212 sourceInformationBuilder.buildCall(node, arguments)); |
1173 } | 1213 } |
1174 | 1214 |
1175 @override | 1215 @override |
1176 ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) { | 1216 ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) { |
1177 return buildStaticFieldGet(field, sourceInformationBuilder.buildGet(node)); | 1217 return buildStaticFieldGet(field, sourceInformationBuilder.buildGet(node)); |
1178 } | 1218 } |
1179 | 1219 |
1180 @override | 1220 @override |
1181 ir.Primitive handleStaticFieldInvoke( | 1221 ir.Primitive handleStaticFieldInvoke( |
1182 ast.Send node, | 1222 ast.Send node, |
1183 FieldElement field, | 1223 FieldElement field, |
1184 ast.NodeList arguments, | 1224 ast.NodeList arguments, |
1185 CallStructure callStructure, | 1225 CallStructure callStructure, |
1186 _) { | 1226 _) { |
1187 SourceInformation src = sourceInformationBuilder.buildGet(node); | 1227 SourceInformation src = sourceInformationBuilder.buildGet(node); |
1188 ir.Primitive target = buildStaticFieldGet(field, src); | 1228 ir.Primitive target = buildStaticFieldGet(field, src); |
1189 return irBuilder.buildCallInvocation(target, | 1229 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; |
1190 callStructure, | 1230 CallStructure normalizedCallStructure = translateDynamicArguments( |
1191 translateDynamicArguments(arguments, callStructure), | 1231 arguments, callStructure, normalizedArguments); |
1232 return irBuilder.buildCallInvocation( | |
1233 target, | |
1234 normalizedCallStructure, | |
1235 normalizedArguments, | |
1192 sourceInformation: | 1236 sourceInformation: |
1193 sourceInformationBuilder.buildCall(node, arguments)); | 1237 sourceInformationBuilder.buildCall(node, arguments)); |
1194 } | 1238 } |
1195 | 1239 |
1196 @override | 1240 @override |
1197 ir.Primitive handleStaticFunctionInvoke( | 1241 ir.Primitive handleStaticFunctionInvoke( |
1198 ast.Send node, | 1242 ast.Send node, |
1199 MethodElement function, | 1243 MethodElement function, |
1200 ast.NodeList arguments, | 1244 ast.NodeList arguments, |
1201 CallStructure callStructure, | 1245 CallStructure callStructure, |
(...skipping 12 matching lines...) Expand all Loading... | |
1214 | 1258 |
1215 @override | 1259 @override |
1216 ir.Primitive handleStaticGetterInvoke( | 1260 ir.Primitive handleStaticGetterInvoke( |
1217 ast.Send node, | 1261 ast.Send node, |
1218 FunctionElement getter, | 1262 FunctionElement getter, |
1219 ast.NodeList arguments, | 1263 ast.NodeList arguments, |
1220 CallStructure callStructure, | 1264 CallStructure callStructure, |
1221 _) { | 1265 _) { |
1222 ir.Primitive target = irBuilder.buildStaticGetterGet( | 1266 ir.Primitive target = irBuilder.buildStaticGetterGet( |
1223 getter, sourceInformationBuilder.buildGet(node)); | 1267 getter, sourceInformationBuilder.buildGet(node)); |
1224 return irBuilder.buildCallInvocation(target, | 1268 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; |
1225 callStructure, | 1269 CallStructure normalizedCallStructure = translateDynamicArguments( |
1226 translateDynamicArguments(arguments, callStructure), | 1270 arguments, callStructure, normalizedArguments); |
1271 return irBuilder.buildCallInvocation( | |
1272 target, | |
1273 normalizedCallStructure, | |
1274 normalizedArguments, | |
1227 sourceInformation: | 1275 sourceInformation: |
1228 sourceInformationBuilder.buildCall(node, arguments)); | 1276 sourceInformationBuilder.buildCall(node, arguments)); |
1229 } | 1277 } |
1230 | 1278 |
1231 @override | 1279 @override |
1232 ir.Primitive visitSuperFieldInvoke( | 1280 ir.Primitive visitSuperFieldInvoke( |
1233 ast.Send node, | 1281 ast.Send node, |
1234 FieldElement field, | 1282 FieldElement field, |
1235 ast.NodeList arguments, | 1283 ast.NodeList arguments, |
1236 CallStructure callStructure, | 1284 CallStructure callStructure, |
1237 _) { | 1285 _) { |
1238 ir.Primitive target = irBuilder.buildSuperFieldGet(field); | 1286 ir.Primitive target = irBuilder.buildSuperFieldGet(field); |
1239 return irBuilder.buildCallInvocation(target, | 1287 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; |
1240 callStructure, | 1288 CallStructure normalizedCallStructure = translateDynamicArguments( |
1241 translateDynamicArguments(arguments, callStructure), | 1289 arguments, callStructure, normalizedArguments); |
1290 return irBuilder.buildCallInvocation( | |
1291 target, | |
1292 normalizedCallStructure, | |
1293 normalizedArguments, | |
1242 sourceInformation: | 1294 sourceInformation: |
1243 sourceInformationBuilder.buildCall(node, arguments)); | 1295 sourceInformationBuilder.buildCall(node, arguments)); |
1244 } | 1296 } |
1245 | 1297 |
1246 @override | 1298 @override |
1247 ir.Primitive visitSuperGetterInvoke( | 1299 ir.Primitive visitSuperGetterInvoke( |
1248 ast.Send node, | 1300 ast.Send node, |
1249 FunctionElement getter, | 1301 FunctionElement getter, |
1250 ast.NodeList arguments, | 1302 ast.NodeList arguments, |
1251 CallStructure callStructure, | 1303 CallStructure callStructure, |
1252 _) { | 1304 _) { |
1253 ir.Primitive target = irBuilder.buildSuperGetterGet( | 1305 ir.Primitive target = irBuilder.buildSuperGetterGet( |
1254 getter, sourceInformationBuilder.buildGet(node)); | 1306 getter, sourceInformationBuilder.buildGet(node)); |
1255 return irBuilder.buildCallInvocation(target, | 1307 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; |
1256 callStructure, | 1308 CallStructure normalizedCallStructure = translateDynamicArguments( |
1257 translateDynamicArguments(arguments, callStructure), | 1309 arguments, callStructure, normalizedArguments); |
1310 return irBuilder.buildCallInvocation( | |
1311 target, | |
1312 normalizedCallStructure, | |
1313 normalizedArguments, | |
1258 sourceInformation: | 1314 sourceInformation: |
1259 sourceInformationBuilder.buildCall(node, arguments)); | 1315 sourceInformationBuilder.buildCall(node, arguments)); |
1260 } | 1316 } |
1261 | 1317 |
1262 @override | 1318 @override |
1263 ir.Primitive visitSuperMethodInvoke( | 1319 ir.Primitive visitSuperMethodInvoke( |
1264 ast.Send node, | 1320 ast.Send node, |
1265 MethodElement method, | 1321 MethodElement method, |
1266 ast.NodeList arguments, | 1322 ast.NodeList arguments, |
1267 CallStructure callStructure, | 1323 CallStructure callStructure, |
1268 _) { | 1324 _) { |
1269 return irBuilder.buildSuperMethodInvocation(method, callStructure, | 1325 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; |
1270 translateDynamicArguments(arguments, callStructure), | 1326 CallStructure normalizedCallStructure = translateDynamicArguments( |
1327 arguments, callStructure, normalizedArguments); | |
1328 return irBuilder.buildSuperMethodInvocation( | |
1329 method, | |
1330 normalizedCallStructure, | |
1331 normalizedArguments, | |
1271 sourceInformation: | 1332 sourceInformation: |
1272 sourceInformationBuilder.buildCall(node, node.selector)); | 1333 sourceInformationBuilder.buildCall(node, node.selector)); |
1273 } | 1334 } |
1274 | 1335 |
1275 @override | 1336 @override |
1276 ir.Primitive visitSuperMethodIncompatibleInvoke( | 1337 ir.Primitive visitSuperMethodIncompatibleInvoke( |
1277 ast.Send node, | 1338 ast.Send node, |
1278 MethodElement method, | 1339 MethodElement method, |
1279 ast.NodeList arguments, | 1340 ast.NodeList arguments, |
1280 CallStructure callStructure, _) { | 1341 CallStructure callStructure, _) { |
1342 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; | |
1343 translateDynamicArguments(arguments, callStructure, normalizedArguments); | |
1281 return buildInstanceNoSuchMethod( | 1344 return buildInstanceNoSuchMethod( |
1282 elements.getSelector(node), | 1345 elements.getSelector(node), |
Kevin Millikin (Google)
2015/12/02 15:45:31
It's not obvious whether this selector should matc
Johnni Winther
2015/12/03 12:15:42
We should. Create the new selector by:
CallStruct
Kevin Millikin (Google)
2015/12/09 12:49:13
Done.
| |
1283 elements.getTypeMask(node), | 1346 elements.getTypeMask(node), |
1284 translateDynamicArguments(arguments, callStructure)); | 1347 normalizedArguments); |
1285 } | 1348 } |
1286 | 1349 |
1287 @override | 1350 @override |
1288 ir.Primitive visitUnresolvedSuperInvoke( | 1351 ir.Primitive visitUnresolvedSuperInvoke( |
1289 ast.Send node, | 1352 ast.Send node, |
1290 Element element, | 1353 Element element, |
1291 ast.NodeList arguments, | 1354 ast.NodeList arguments, |
1292 Selector selector, _) { | 1355 Selector selector, _) { |
1356 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; | |
1357 translateDynamicArguments(arguments, selector.callStructure, | |
1358 normalizedArguments); | |
1293 return buildInstanceNoSuchMethod( | 1359 return buildInstanceNoSuchMethod( |
1294 elements.getSelector(node), | 1360 elements.getSelector(node), |
Kevin Millikin (Google)
2015/12/02 15:45:31
It's not obvious whether this selector should matc
Johnni Winther
2015/12/03 12:15:42
Also here. Obtain the member name from `elements.g
Kevin Millikin (Google)
2015/12/09 12:49:13
Done.
| |
1295 elements.getTypeMask(node), | 1361 elements.getTypeMask(node), |
1296 translateDynamicArguments(arguments, selector.callStructure)); | 1362 normalizedArguments); |
1297 } | 1363 } |
1298 | 1364 |
1299 @override | 1365 @override |
1300 ir.Primitive visitThisInvoke( | 1366 ir.Primitive visitThisInvoke( |
1301 ast.Send node, | 1367 ast.Send node, |
1302 ast.NodeList arguments, | 1368 ast.NodeList arguments, |
1303 CallStructure callStructure, | 1369 CallStructure callStructure, |
1304 _) { | 1370 _) { |
1305 return translateCallInvoke( | 1371 return translateCallInvoke( |
1306 irBuilder.buildThis(), | 1372 irBuilder.buildThis(), |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1364 | 1430 |
1365 Selector operatorSelector = | 1431 Selector operatorSelector = |
1366 new Selector.binaryOperator(operator.selectorName); | 1432 new Selector.binaryOperator(operator.selectorName); |
1367 ir.Primitive rhsValue; | 1433 ir.Primitive rhsValue; |
1368 if (rhs.kind == CompoundKind.ASSIGNMENT) { | 1434 if (rhs.kind == CompoundKind.ASSIGNMENT) { |
1369 rhsValue = visit(rhs.rhs); | 1435 rhsValue = visit(rhs.rhs); |
1370 } else { | 1436 } else { |
1371 rhsValue = irBuilder.buildIntegerConstant(1); | 1437 rhsValue = irBuilder.buildIntegerConstant(1); |
1372 } | 1438 } |
1373 List<ir.Primitive> arguments = <ir.Primitive>[rhsValue]; | 1439 List<ir.Primitive> arguments = <ir.Primitive>[rhsValue]; |
1374 arguments = normalizeDynamicArguments( | 1440 CallStructure callStructure = |
1375 operatorSelector.callStructure, arguments); | 1441 normalizeDynamicArguments(operatorSelector.callStructure, arguments); |
1376 TypeMask operatorTypeMask = | 1442 TypeMask operatorTypeMask = |
1377 elements.getOperatorTypeMaskInComplexSendSet(node); | 1443 elements.getOperatorTypeMaskInComplexSendSet(node); |
1378 SourceInformation operatorSourceInformation = | 1444 SourceInformation operatorSourceInformation = |
1379 sourceInformationBuilder.buildCall(node, node.assignmentOperator); | 1445 sourceInformationBuilder.buildCall(node, node.assignmentOperator); |
1380 ir.Primitive result = irBuilder.buildDynamicInvocation( | 1446 ir.Primitive result = irBuilder.buildDynamicInvocation( |
1381 value, operatorSelector, operatorTypeMask, arguments, | 1447 value, |
1382 sourceInformation: operatorSourceInformation); | 1448 new Selector(operatorSelector.kind, operatorSelector.memberName, |
1449 callStructure), | |
1450 operatorTypeMask, | |
1451 arguments, | |
1452 sourceInformation: operatorSourceInformation); | |
1383 setValue(result); | 1453 setValue(result); |
1384 return rhs.kind == CompoundKind.POSTFIX ? value : result; | 1454 return rhs.kind == CompoundKind.POSTFIX ? value : result; |
1385 } | 1455 } |
1386 | 1456 |
1387 ir.Primitive translateSetIfNull( | 1457 ir.Primitive translateSetIfNull( |
1388 ast.SendSet node, | 1458 ast.SendSet node, |
1389 {ir.Primitive getValue(), | 1459 {ir.Primitive getValue(), |
1390 ast.Node rhs, | 1460 ast.Node rhs, |
1391 void setValue(ir.Primitive value)}) { | 1461 void setValue(ir.Primitive value)}) { |
1392 ir.Primitive value = getValue(); | 1462 ir.Primitive value = getValue(); |
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1851 ast.Node index, | 1921 ast.Node index, |
1852 CompoundRhs rhs, | 1922 CompoundRhs rhs, |
1853 arg) { | 1923 arg) { |
1854 ir.Primitive target = visit(receiver); | 1924 ir.Primitive target = visit(receiver); |
1855 ir.Primitive indexValue = visit(index); | 1925 ir.Primitive indexValue = visit(index); |
1856 return translateCompounds( | 1926 return translateCompounds( |
1857 node, | 1927 node, |
1858 getValue: () { | 1928 getValue: () { |
1859 Selector selector = new Selector.index(); | 1929 Selector selector = new Selector.index(); |
1860 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; | 1930 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; |
1861 arguments = | 1931 CallStructure callStructure = |
1862 normalizeDynamicArguments(selector.callStructure, arguments); | 1932 normalizeDynamicArguments(selector.callStructure, arguments); |
1863 return irBuilder.buildDynamicInvocation( | 1933 return irBuilder.buildDynamicInvocation( |
1864 target, | 1934 target, |
1865 selector, | 1935 new Selector(selector.kind, selector.memberName, callStructure), |
1866 elements.getGetterTypeMaskInComplexSendSet(node), | 1936 elements.getGetterTypeMaskInComplexSendSet(node), |
1867 arguments, | 1937 arguments, |
1868 sourceInformation: | 1938 sourceInformation: |
1869 sourceInformationBuilder.buildCall(receiver, node)); | 1939 sourceInformationBuilder.buildCall(receiver, node)); |
1870 }, | 1940 }, |
1871 rhs: rhs, | 1941 rhs: rhs, |
1872 setValue: (ir.Primitive result) { | 1942 setValue: (ir.Primitive result) { |
1873 irBuilder.buildDynamicIndexSet( | 1943 irBuilder.buildDynamicIndexSet( |
1874 target, | 1944 target, |
1875 elements.getTypeMask(node), | 1945 elements.getTypeMask(node), |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2004 } | 2074 } |
2005 | 2075 |
2006 @override | 2076 @override |
2007 ir.Primitive visitUnresolvedConstructorInvoke( | 2077 ir.Primitive visitUnresolvedConstructorInvoke( |
2008 ast.NewExpression node, | 2078 ast.NewExpression node, |
2009 Element constructor, | 2079 Element constructor, |
2010 DartType type, | 2080 DartType type, |
2011 ast.NodeList arguments, | 2081 ast.NodeList arguments, |
2012 Selector selector, _) { | 2082 Selector selector, _) { |
2013 // If the class is there but the constructor is missing, it's an NSM error. | 2083 // If the class is there but the constructor is missing, it's an NSM error. |
2014 return buildStaticNoSuchMethod(selector, | 2084 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; |
2015 translateDynamicArguments(arguments, selector.callStructure)); | 2085 translateDynamicArguments(arguments, selector.callStructure, |
2086 normalizedArguments); | |
2087 return buildStaticNoSuchMethod(selector, normalizedArguments); | |
Kevin Millikin (Google)
2015/12/02 15:45:31
This selector doesn't seem to matter because it lo
Johnni Winther
2015/12/03 12:15:42
Similar to the super-cases above. We should normal
Kevin Millikin (Google)
2015/12/09 12:49:13
Done.
| |
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 Element constructor, |
2022 DartType type, | 2094 DartType type, |
2023 ast.NodeList arguments, | 2095 ast.NodeList arguments, |
2024 CallStructure callStructure, _) { | 2096 CallStructure callStructure, _) { |
2097 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; | |
2098 translateDynamicArguments(arguments, callStructure, normalizedArguments); | |
2025 return buildStaticNoSuchMethod(elements.getSelector(node.send), | 2099 return buildStaticNoSuchMethod(elements.getSelector(node.send), |
Kevin Millikin (Google)
2015/12/02 15:45:31
It's not clear if this selector should match the n
| |
2026 translateDynamicArguments(arguments, callStructure)); | 2100 normalizedArguments); |
2027 } | 2101 } |
2028 | 2102 |
2029 @override | 2103 @override |
2030 ir.Primitive visitUnresolvedGet( | 2104 ir.Primitive visitUnresolvedGet( |
2031 ast.Send node, | 2105 ast.Send node, |
2032 Element element, _) { | 2106 Element element, _) { |
2033 return buildStaticNoSuchMethod(elements.getSelector(node), []); | 2107 return buildStaticNoSuchMethod(elements.getSelector(node), []); |
Kevin Millikin (Google)
2015/12/02 15:45:31
It's not clear if this selector should match the n
| |
2034 } | 2108 } |
2035 | 2109 |
2036 @override | 2110 @override |
2037 ir.Primitive visitUnresolvedInvoke( | 2111 ir.Primitive visitUnresolvedInvoke( |
2038 ast.Send node, | 2112 ast.Send node, |
2039 Element element, | 2113 Element element, |
2040 ast.NodeList arguments, | 2114 ast.NodeList arguments, |
2041 Selector selector, _) { | 2115 Selector selector, _) { |
2042 return buildStaticNoSuchMethod(elements.getSelector(node), | 2116 return buildStaticNoSuchMethod(elements.getSelector(node), |
Kevin Millikin (Google)
2015/12/02 15:45:31
It's not clear if this selector should match the n
| |
2043 arguments.nodes.mapToList(visit)); | 2117 arguments.nodes.mapToList(visit)); |
2044 } | 2118 } |
2045 | 2119 |
2046 @override | 2120 @override |
2047 ir.Primitive visitUnresolvedRedirectingFactoryConstructorInvoke( | 2121 ir.Primitive visitUnresolvedRedirectingFactoryConstructorInvoke( |
2048 ast.NewExpression node, | 2122 ast.NewExpression node, |
2049 ConstructorElement constructor, | 2123 ConstructorElement constructor, |
2050 InterfaceType type, | 2124 InterfaceType type, |
2051 ast.NodeList arguments, | 2125 ast.NodeList arguments, |
2052 CallStructure callStructure, _) { | 2126 CallStructure callStructure, _) { |
2053 String nameString = Elements.reconstructConstructorName(constructor); | 2127 String nameString = Elements.reconstructConstructorName(constructor); |
2054 Name name = new Name(nameString, constructor.library); | 2128 Name name = new Name(nameString, constructor.library); |
2129 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; | |
2130 CallStructure normalizedCallStructure = translateDynamicArguments( | |
2131 arguments, callStructure, normalizedArguments); | |
2055 return buildStaticNoSuchMethod( | 2132 return buildStaticNoSuchMethod( |
Kevin Millikin (Google)
2015/12/02 15:45:31
It's not clear if this selector should match the n
| |
2056 new Selector.call(name, callStructure), | 2133 new Selector.call(name, normalizedCallStructure), |
2057 translateDynamicArguments(arguments, callStructure)); | 2134 normalizedArguments); |
2058 } | 2135 } |
2059 | 2136 |
2060 @override | 2137 @override |
2061 ir.Primitive visitUnresolvedSet( | 2138 ir.Primitive visitUnresolvedSet( |
2062 ast.Send node, | 2139 ast.Send node, |
2063 Element element, | 2140 Element element, |
2064 ast.Node rhs, _) { | 2141 ast.Node rhs, _) { |
2065 return buildStaticNoSuchMethod(elements.getSelector(node), [visit(rhs)]); | 2142 return buildStaticNoSuchMethod(elements.getSelector(node), [visit(rhs)]); |
Kevin Millikin (Google)
2015/12/02 15:45:31
It's not clear if this selector should match the n
| |
2066 } | 2143 } |
2067 | 2144 |
2068 @override | 2145 @override |
2069 ir.Primitive visitUnresolvedSuperIndex( | 2146 ir.Primitive visitUnresolvedSuperIndex( |
2070 ast.Send node, | 2147 ast.Send node, |
2071 Element function, | 2148 Element function, |
2072 ast.Node index, _) { | 2149 ast.Node index, _) { |
2073 // Assume the index getter is missing. | 2150 // Assume the index getter is missing. |
2074 return buildInstanceNoSuchMethod( | 2151 return buildInstanceNoSuchMethod( |
2075 new Selector.index(), elements.getTypeMask(node), [visit(index)]); | 2152 new Selector.index(), elements.getTypeMask(node), [visit(index)]); |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2268 elements.getTypeMask(node), | 2345 elements.getTypeMask(node), |
2269 []); | 2346 []); |
2270 } | 2347 } |
2271 | 2348 |
2272 @override | 2349 @override |
2273 ir.Primitive visitSuperSetterInvoke( | 2350 ir.Primitive visitSuperSetterInvoke( |
2274 ast.Send node, | 2351 ast.Send node, |
2275 SetterElement setter, | 2352 SetterElement setter, |
2276 ast.NodeList arguments, | 2353 ast.NodeList arguments, |
2277 CallStructure callStructure, _) { | 2354 CallStructure callStructure, _) { |
2278 List<ir.Primitive> args = | 2355 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; |
2279 translateDynamicArguments(arguments, callStructure); | 2356 CallStructure normalizedCallStructure = translateDynamicArguments( |
2357 arguments, callStructure, normalizedArguments); | |
2280 return buildInstanceNoSuchMethod( | 2358 return buildInstanceNoSuchMethod( |
2281 new Selector.call(setter.memberName, callStructure), | 2359 new Selector.call(setter.memberName, normalizedCallStructure), |
Kevin Millikin (Google)
2015/12/02 15:45:31
It's not obvious if this selector should match the
| |
2282 elements.getTypeMask(node), | 2360 elements.getTypeMask(node), |
2283 args); | 2361 normalizedArguments); |
2284 } | 2362 } |
2285 | 2363 |
2286 ir.FunctionDefinition nullIfGiveup(ir.FunctionDefinition action()) { | 2364 ir.FunctionDefinition nullIfGiveup(ir.FunctionDefinition action()) { |
2287 try { | 2365 try { |
2288 return action(); | 2366 return action(); |
2289 } catch(e) { | 2367 } catch(e) { |
2290 if (e == ABORT_IRNODE_BUILDER) { | 2368 if (e == ABORT_IRNODE_BUILDER) { |
2291 return null; | 2369 return null; |
2292 } | 2370 } |
2293 rethrow; | 2371 rethrow; |
(...skipping 906 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3200 | 3278 |
3201 /// Creates a primitive for the default value of [parameter]. | 3279 /// Creates a primitive for the default value of [parameter]. |
3202 ir.Primitive translateDefaultValue(ParameterElement parameter) { | 3280 ir.Primitive translateDefaultValue(ParameterElement parameter) { |
3203 if (parameter.initializer == null) { | 3281 if (parameter.initializer == null) { |
3204 return irBuilder.buildNullConstant(); | 3282 return irBuilder.buildNullConstant(); |
3205 } else { | 3283 } else { |
3206 return inlineConstant(parameter.executableContext, parameter.initializer); | 3284 return inlineConstant(parameter.executableContext, parameter.initializer); |
3207 } | 3285 } |
3208 } | 3286 } |
3209 | 3287 |
3210 /// Inserts default arguments and normalizes order of named arguments. | 3288 CallStructure normalizeStaticArguments(CallStructure callStructure, |
3211 List<ir.Primitive> normalizeStaticArguments( | 3289 FunctionElement target, |
3212 CallStructure callStructure, | 3290 List<ir.Primitive> arguments) { |
3213 FunctionElement target, | |
3214 List<ir.Primitive> arguments) { | |
3215 target = target.implementation; | 3291 target = target.implementation; |
3216 FunctionSignature signature = target.functionSignature; | 3292 FunctionSignature signature = target.functionSignature; |
3217 if (!signature.optionalParametersAreNamed && | 3293 if (!signature.optionalParametersAreNamed && |
3218 signature.parameterCount == arguments.length) { | 3294 signature.parameterCount == arguments.length) { |
3219 // Optimization: don't copy the argument list for trivial cases. | 3295 return callStructure; |
3220 return arguments; | |
3221 } | 3296 } |
3222 | 3297 |
3223 List<ir.Primitive> result = <ir.Primitive>[]; | |
3224 int i = 0; | |
3225 signature.forEachRequiredParameter((ParameterElement element) { | |
3226 result.add(arguments[i]); | |
3227 ++i; | |
3228 }); | |
3229 | |
3230 if (!signature.optionalParametersAreNamed) { | 3298 if (!signature.optionalParametersAreNamed) { |
3299 int i = signature.requiredParameterCount; | |
3231 signature.forEachOptionalParameter((ParameterElement element) { | 3300 signature.forEachOptionalParameter((ParameterElement element) { |
3232 if (i < arguments.length) { | 3301 if (i < callStructure.positionalArgumentCount) { |
3233 result.add(arguments[i]); | |
3234 ++i; | 3302 ++i; |
3235 } else { | 3303 } else { |
3236 result.add(translateDefaultValue(element)); | 3304 arguments.add(translateDefaultValue(element)); |
3237 } | 3305 } |
3238 }); | 3306 }); |
3239 } else { | 3307 return new CallStructure(signature.parameterCount); |
3240 int offset = i; | |
3241 // Iterate over the optional parameters of the signature, and try to | |
3242 // find them in [compiledNamedArguments]. If found, we use the | |
3243 // value in the temporary list, otherwise the default value. | |
3244 signature.orderedOptionalParameters.forEach((ParameterElement element) { | |
3245 int nameIndex = callStructure.namedArguments.indexOf(element.name); | |
3246 if (nameIndex != -1) { | |
3247 int translatedIndex = offset + nameIndex; | |
3248 result.add(arguments[translatedIndex]); | |
3249 } else { | |
3250 result.add(translateDefaultValue(element)); | |
3251 } | |
3252 }); | |
3253 } | 3308 } |
3254 return result; | 3309 |
3310 int offset = signature.requiredParameterCount; | |
3311 List<ir.Primitive> namedArguments = arguments.sublist(offset); | |
3312 arguments.length = offset; | |
3313 List<String> normalizedNames = <String>[]; | |
3314 // Iterate over the optional parameters of the signature, and try to | |
3315 // find them in the callStructure's named arguments. If found, we use the | |
3316 // value in the temporary list, otherwise the default value. | |
3317 signature.orderedOptionalParameters.forEach((ParameterElement element) { | |
3318 int nameIndex = callStructure.namedArguments.indexOf(element.name); | |
3319 arguments.add(nameIndex == -1 ? translateDefaultValue(element) | |
3320 : namedArguments[nameIndex]); | |
3321 normalizedNames.add(element.name); | |
3322 }); | |
3323 return new CallStructure(signature.parameterCount, normalizedNames); | |
3255 } | 3324 } |
3256 | 3325 |
3257 /// Normalizes order of named arguments. | 3326 CallStructure normalizeDynamicArguments(CallStructure callStructure, |
3258 List<ir.Primitive> normalizeDynamicArguments( | 3327 List<ir.Primitive> arguments) { |
3259 CallStructure callStructure, | |
3260 List<ir.Primitive> arguments) { | |
3261 assert(arguments.length == callStructure.argumentCount); | 3328 assert(arguments.length == callStructure.argumentCount); |
3262 // Optimization: don't copy the argument list for trivial cases. | 3329 if (callStructure.namedArguments.isEmpty) return callStructure; |
3263 if (callStructure.namedArguments.isEmpty) return arguments; | 3330 int destinationIndex = callStructure.positionalArgumentCount; |
3264 List<ir.Primitive> result = <ir.Primitive>[]; | 3331 List<ir.Primitive> namedArguments = arguments.sublist(destinationIndex); |
3265 for (int i=0; i < callStructure.positionalArgumentCount; i++) { | 3332 for (String argName in callStructure.getOrderedNamedArguments()) { |
3266 result.add(arguments[i]); | 3333 int sourceIndex = callStructure.namedArguments.indexOf(argName); |
3334 arguments[destinationIndex++] = namedArguments[sourceIndex]; | |
3267 } | 3335 } |
3268 for (String argName in callStructure.getOrderedNamedArguments()) { | 3336 return new CallStructure(callStructure.argumentCount, |
3269 int nameIndex = callStructure.namedArguments.indexOf(argName); | 3337 callStructure.getOrderedNamedArguments()); |
3270 int translatedIndex = callStructure.positionalArgumentCount + nameIndex; | |
3271 result.add(arguments[translatedIndex]); | |
3272 } | |
3273 return result; | |
3274 } | 3338 } |
3275 | 3339 |
3276 @override | 3340 @override |
3277 ir.Primitive handleConstructorInvoke( | 3341 ir.Primitive handleConstructorInvoke( |
3278 ast.NewExpression node, | 3342 ast.NewExpression node, |
3279 ConstructorElement constructor, | 3343 ConstructorElement constructor, |
3280 DartType type, | 3344 DartType type, |
3281 ast.NodeList arguments, | 3345 ast.NodeList arguments, |
3282 CallStructure callStructure, | 3346 CallStructure callStructure, |
3283 _) { | 3347 _) { |
3284 List<ir.Primitive> arguments = | 3348 List<ir.Primitive> arguments = node.send.arguments.mapToList(visit); |
3285 node.send.arguments.mapToList(visit, growable:false); | |
3286 // Use default values from the effective target, not the immediate target. | 3349 // Use default values from the effective target, not the immediate target. |
3287 ConstructorElement target = constructor.effectiveTarget; | 3350 ConstructorElement target = constructor.effectiveTarget; |
3288 arguments = normalizeStaticArguments(callStructure, target, arguments); | 3351 CallStructure normalizedCallStructure = |
3352 normalizeStaticArguments(callStructure, target, arguments); | |
3289 TypeMask allocationSiteType; | 3353 TypeMask allocationSiteType; |
3290 ast.Node send = node.send; | 3354 ast.Node send = node.send; |
3291 if (Elements.isFixedListConstructorCall(constructor, send, compiler) || | 3355 if (Elements.isFixedListConstructorCall(constructor, send, compiler) || |
3292 Elements.isGrowableListConstructorCall(constructor, send, compiler) || | 3356 Elements.isGrowableListConstructorCall(constructor, send, compiler) || |
3293 Elements.isFilledListConstructorCall(constructor, send, compiler) || | 3357 Elements.isFilledListConstructorCall(constructor, send, compiler) || |
3294 Elements.isConstructorOfTypedArraySubclass(constructor, compiler)) { | 3358 Elements.isConstructorOfTypedArraySubclass(constructor, compiler)) { |
3295 allocationSiteType = getAllocationSiteType(send); | 3359 allocationSiteType = getAllocationSiteType(send); |
3296 } | 3360 } |
3297 return irBuilder.buildConstructorInvocation( | 3361 return irBuilder.buildConstructorInvocation( |
3298 target, | 3362 target, |
3299 callStructure, | 3363 normalizedCallStructure, |
3300 constructor.computeEffectiveTargetType(type), | 3364 constructor.computeEffectiveTargetType(type), |
3301 arguments, | 3365 arguments, |
3302 sourceInformationBuilder.buildNew(node), | 3366 sourceInformationBuilder.buildNew(node), |
3303 allocationSiteType: allocationSiteType); | 3367 allocationSiteType: allocationSiteType); |
3304 } | 3368 } |
3305 | 3369 |
3306 @override | 3370 @override |
3307 ir.Primitive buildStaticNoSuchMethod(Selector selector, | 3371 ir.Primitive buildStaticNoSuchMethod(Selector selector, |
3308 List<ir.Primitive> arguments) { | 3372 List<ir.Primitive> arguments) { |
3309 Element thrower = backend.helpers.throwNoSuchMethod; | 3373 Element thrower = backend.helpers.throwNoSuchMethod; |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3389 } | 3453 } |
3390 | 3454 |
3391 /// Call a helper method from the isolate library. The isolate library uses | 3455 /// Call a helper method from the isolate library. The isolate library uses |
3392 /// its own isolate structure, that encapsulates dart2js's isolate. | 3456 /// its own isolate structure, that encapsulates dart2js's isolate. |
3393 ir.Primitive buildIsolateHelperInvocation(Element element, | 3457 ir.Primitive buildIsolateHelperInvocation(Element element, |
3394 CallStructure callStructure) { | 3458 CallStructure callStructure) { |
3395 if (element == null) { | 3459 if (element == null) { |
3396 reporter.internalError(node, | 3460 reporter.internalError(node, |
3397 'Isolate library and compiler mismatch.'); | 3461 'Isolate library and compiler mismatch.'); |
3398 } | 3462 } |
3399 List<ir.Primitive> arguments = translateStaticArguments(argumentList, | 3463 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; |
3400 element, callStructure); | 3464 CallStructure normalizedCallStructure = translateStaticArguments( |
3401 return irBuilder.buildStaticFunctionInvocation(element, | 3465 argumentList, element, callStructure, normalizedArguments); |
3402 callStructure, arguments, | 3466 return irBuilder.buildStaticFunctionInvocation( |
3467 element, | |
3468 normalizedCallStructure, | |
3469 normalizedArguments, | |
3403 sourceInformation: | 3470 sourceInformation: |
3404 sourceInformationBuilder.buildCall(node, node.selector)); | 3471 sourceInformationBuilder.buildCall(node, node.selector)); |
3405 } | 3472 } |
3406 | 3473 |
3407 /// Lookup the value of the enum described by [node]. | 3474 /// Lookup the value of the enum described by [node]. |
3408 getEnumValue(ast.Node node, EnumClassElement enumClass, List values) { | 3475 getEnumValue(ast.Node node, EnumClassElement enumClass, List values) { |
3409 Element element = elements[node]; | 3476 Element element = elements[node]; |
3410 if (element is! FieldElement || element.enclosingClass != enumClass) { | 3477 if (element is! FieldElement || element.enclosingClass != enumClass) { |
3411 internalError(node, 'expected a JsBuiltin enum value'); | 3478 internalError(node, 'expected a JsBuiltin enum value'); |
3412 } | 3479 } |
3413 | 3480 |
3414 int index = enumClass.enumValues.indexOf(element); | 3481 int index = enumClass.enumValues.indexOf(element); |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3590 | 3657 |
3591 @override | 3658 @override |
3592 ir.Primitive handleStaticFunctionInvoke(ast.Send node, | 3659 ir.Primitive handleStaticFunctionInvoke(ast.Send node, |
3593 MethodElement function, | 3660 MethodElement function, |
3594 ast.NodeList argumentList, | 3661 ast.NodeList argumentList, |
3595 CallStructure callStructure, | 3662 CallStructure callStructure, |
3596 _) { | 3663 _) { |
3597 if (compiler.backend.isForeign(function)) { | 3664 if (compiler.backend.isForeign(function)) { |
3598 return handleForeignCode(node, function, argumentList, callStructure); | 3665 return handleForeignCode(node, function, argumentList, callStructure); |
3599 } else { | 3666 } else { |
3600 return irBuilder.buildStaticFunctionInvocation(function, callStructure, | 3667 List<ir.Primitive> normalizedArguments = <ir.Primitive>[]; |
3601 translateStaticArguments(argumentList, function, callStructure), | 3668 CallStructure normalizedCallStructure = translateStaticArguments( |
3669 argumentList, function, callStructure, normalizedArguments); | |
3670 return irBuilder.buildStaticFunctionInvocation(function, | |
3671 normalizedCallStructure, | |
3672 normalizedArguments, | |
3602 sourceInformation: | 3673 sourceInformation: |
3603 sourceInformationBuilder.buildCall(node, node.selector)); | 3674 sourceInformationBuilder.buildCall(node, node.selector)); |
3604 } | 3675 } |
3605 } | 3676 } |
3606 } | 3677 } |
OLD | NEW |