Chromium Code Reviews| 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 '../constants/expressions.dart'; | 9 import '../constants/expressions.dart'; |
| 10 import '../dart_types.dart'; | 10 import '../dart_types.dart'; |
| (...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 718 ast.Send node, | 718 ast.Send node, |
| 719 ast.Node receiver, | 719 ast.Node receiver, |
| 720 Selector selector, | 720 Selector selector, |
| 721 _) { | 721 _) { |
| 722 return irBuilder.buildDynamicGet( | 722 return irBuilder.buildDynamicGet( |
| 723 translateReceiver(receiver), | 723 translateReceiver(receiver), |
| 724 selector); | 724 selector); |
| 725 } | 725 } |
| 726 | 726 |
| 727 @override | 727 @override |
| 728 ir.Primitive visitIfNotNullDynamicPropertyGet( | |
| 729 ast.Send node, | |
| 730 ast.Node receiver, | |
| 731 Selector selector, | |
| 732 _) { | |
| 733 ir.Primitive builtReceiver = visit(receiver); | |
|
Kevin Millikin (Google)
2015/05/29 11:02:03
I don't completely understand how we decide what g
Siggi Cherem (dart-lang)
2015/05/29 18:14:05
Good point - I made some changes to reflect this.
| |
| 734 ir.Primitive condition = irBuilder.buildCheckNull(builtReceiver); | |
| 735 return irBuilder.buildConditional( | |
| 736 condition, | |
| 737 (builder) => builtReceiver, | |
|
Kevin Millikin (Google)
2015/05/29 11:02:03
We normally give a type annotation on closures:
(
Siggi Cherem (dart-lang)
2015/05/29 18:14:05
Done.
| |
| 738 (builder) => builder.buildDynamicGet(builtReceiver, selector)); | |
| 739 } | |
| 740 | |
| 741 @override | |
| 728 ir.Primitive visitDynamicTypeLiteralGet( | 742 ir.Primitive visitDynamicTypeLiteralGet( |
| 729 ast.Send node, | 743 ast.Send node, |
| 730 ConstantExpression constant, | 744 ConstantExpression constant, |
| 731 _) { | 745 _) { |
| 732 return irBuilder.buildConstant(constant); | 746 return irBuilder.buildConstant(constant); |
| 733 } | 747 } |
| 734 | 748 |
| 735 @override | 749 @override |
| 736 ir.Primitive visitLocalVariableGet( | 750 ir.Primitive visitLocalVariableGet( |
| 737 ast.Send node, | 751 ast.Send node, |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 839 return withBuilder(rightBuilder, () => visit(right)); | 853 return withBuilder(rightBuilder, () => visit(right)); |
| 840 } | 854 } |
| 841 | 855 |
| 842 return irBuilder.buildLogicalOperator( | 856 return irBuilder.buildLogicalOperator( |
| 843 leftValue, buildRightValue, isLazyOr: isLazyOr); | 857 leftValue, buildRightValue, isLazyOr: isLazyOr); |
| 844 } | 858 } |
| 845 | 859 |
| 846 @override | 860 @override |
| 847 ir.Primitive visitIfNull( | 861 ir.Primitive visitIfNull( |
| 848 ast.Send node, ast.Node left, ast.Node right, _) { | 862 ast.Send node, ast.Node left, ast.Node right, _) { |
| 849 internalError(node, "If-null not yet implemented in cps_ir"); | 863 ir.Primitive receiver = build(left); |
| 864 ir.Primitive condition = irBuilder.buildCheckNull(receiver); | |
| 865 return irBuilder.buildConditional( | |
| 866 condition, | |
| 867 subbuild(right), | |
| 868 (IrBuilder b) => receiver); | |
|
Kevin Millikin (Google)
2015/05/29 11:02:03
Inconsistently named (the other's are all 'builder
Siggi Cherem (dart-lang)
2015/05/29 18:14:05
Done.
| |
| 850 } | 869 } |
| 851 | 870 |
| 852 @override | 871 @override |
| 853 ir.Primitive visitLogicalAnd( | 872 ir.Primitive visitLogicalAnd( |
| 854 ast.Send node, ast.Node left, ast.Node right, _) { | 873 ast.Send node, ast.Node left, ast.Node right, _) { |
| 855 return translateLogicalOperator(left, right, isLazyOr: false); | 874 return translateLogicalOperator(left, right, isLazyOr: false); |
| 856 } | 875 } |
| 857 | 876 |
| 858 @override | 877 @override |
| 859 ir.Primitive visitLogicalOr( | 878 ir.Primitive visitLogicalOr( |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1058 ast.Send node, | 1077 ast.Send node, |
| 1059 ast.Node receiver, | 1078 ast.Node receiver, |
| 1060 ast.NodeList arguments, | 1079 ast.NodeList arguments, |
| 1061 Selector selector, | 1080 Selector selector, |
| 1062 _) { | 1081 _) { |
| 1063 return irBuilder.buildDynamicInvocation( | 1082 return irBuilder.buildDynamicInvocation( |
| 1064 translateReceiver(receiver), selector, | 1083 translateReceiver(receiver), selector, |
| 1065 translateDynamicArguments(arguments, selector.callStructure)); | 1084 translateDynamicArguments(arguments, selector.callStructure)); |
| 1066 } | 1085 } |
| 1067 | 1086 |
| 1087 @override | |
| 1088 ir.Primitive visitIfNotNullDynamicPropertyInvoke( | |
| 1089 ast.Send node, | |
| 1090 ast.Node receiver, | |
| 1091 ast.NodeList arguments, | |
| 1092 Selector selector, | |
| 1093 _) { | |
| 1094 ir.Primitive builtReceiver = visit(receiver); | |
| 1095 ir.Primitive condition = irBuilder.buildCheckNull(builtReceiver); | |
| 1096 return irBuilder.buildConditional( | |
| 1097 condition, | |
| 1098 (builder) => builtReceiver, | |
| 1099 (builder) => withBuilder(builder, () => | |
|
Johnni Winther
2015/05/29 10:23:24
Introduce helper function in IrBuilderMixin for th
Siggi Cherem (dart-lang)
2015/05/29 18:14:05
Done. Much better
| |
| 1100 builder.buildDynamicInvocation(builtReceiver, selector, | |
| 1101 translateDynamicArguments(arguments, selector.callStructure)))); | |
| 1102 } | |
| 1103 | |
| 1068 ir.Primitive handleLocalInvoke( | 1104 ir.Primitive handleLocalInvoke( |
| 1069 ast.Send node, | 1105 ast.Send node, |
| 1070 LocalElement element, | 1106 LocalElement element, |
| 1071 ast.NodeList arguments, | 1107 ast.NodeList arguments, |
| 1072 CallStructure callStructure, | 1108 CallStructure callStructure, |
| 1073 _) { | 1109 _) { |
| 1074 return irBuilder.buildLocalVariableInvocation(element, callStructure, | 1110 return irBuilder.buildLocalVariableInvocation(element, callStructure, |
| 1075 translateDynamicArguments(arguments, callStructure)); | 1111 translateDynamicArguments(arguments, callStructure)); |
| 1076 } | 1112 } |
| 1077 | 1113 |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1248 ast.Node rhs, | 1284 ast.Node rhs, |
| 1249 _) { | 1285 _) { |
| 1250 return irBuilder.buildSuperIndexSet(function, visit(index), visit(rhs)); | 1286 return irBuilder.buildSuperIndexSet(function, visit(index), visit(rhs)); |
| 1251 } | 1287 } |
| 1252 | 1288 |
| 1253 ir.Primitive translateCompounds( | 1289 ir.Primitive translateCompounds( |
| 1254 {ir.Primitive getValue(), | 1290 {ir.Primitive getValue(), |
| 1255 CompoundRhs rhs, | 1291 CompoundRhs rhs, |
| 1256 void setValue(ir.Primitive value)}) { | 1292 void setValue(ir.Primitive value)}) { |
| 1257 ir.Primitive value = getValue(); | 1293 ir.Primitive value = getValue(); |
| 1258 Selector operatorSelector = | 1294 op.BinaryOperator operator = rhs.operator; |
| 1259 new Selector.binaryOperator(rhs.operator.selectorName); | 1295 if (operator.kind == op.BinaryOperatorKind.IF_NULL) { |
| 1260 ir.Primitive rhsValue; | 1296 // Unlike other compound operators if-null conditionally will not do the |
| 1261 if (rhs.kind == CompoundKind.ASSIGNMENT) { | 1297 // assignment operation. |
| 1262 rhsValue = visit(rhs.rhs); | 1298 return irBuilder.buildConditional( |
| 1299 irBuilder.buildCheckNull(value), | |
| 1300 (builder) => withBuilder(builder, () { | |
| 1301 ir.Primitive newValue = visit(rhs.rhs); | |
| 1302 setValue(newValue); | |
| 1303 return newValue; | |
| 1304 }), | |
| 1305 (builder) => value); | |
| 1263 } else { | 1306 } else { |
| 1264 rhsValue = irBuilder.buildIntegerConstant(1); | 1307 Selector operatorSelector = |
| 1308 new Selector.binaryOperator(operator.selectorName); | |
| 1309 ir.Primitive rhsValue; | |
| 1310 if (rhs.kind == CompoundKind.ASSIGNMENT) { | |
| 1311 rhsValue = visit(rhs.rhs); | |
| 1312 } else { | |
| 1313 rhsValue = irBuilder.buildIntegerConstant(1); | |
| 1314 } | |
| 1315 List<ir.Primitive> arguments = <ir.Primitive>[rhsValue]; | |
| 1316 arguments = normalizeDynamicArguments( | |
| 1317 operatorSelector.callStructure, arguments); | |
| 1318 ir.Primitive result = | |
| 1319 irBuilder.buildDynamicInvocation(value, operatorSelector, arguments); | |
| 1320 setValue(result); | |
| 1321 return rhs.kind == CompoundKind.POSTFIX ? value : result; | |
| 1265 } | 1322 } |
| 1266 List<ir.Primitive> arguments = <ir.Primitive>[rhsValue]; | |
| 1267 arguments = normalizeDynamicArguments( | |
| 1268 operatorSelector.callStructure, arguments); | |
| 1269 ir.Primitive result = | |
| 1270 irBuilder.buildDynamicInvocation(value, operatorSelector, arguments); | |
| 1271 setValue(result); | |
| 1272 return rhs.kind == CompoundKind.POSTFIX ? value : result; | |
| 1273 } | 1323 } |
| 1274 | 1324 |
| 1275 @override | 1325 @override |
| 1276 ir.Primitive handleDynamicSet( | 1326 ir.Primitive handleDynamicSet( |
| 1277 ast.SendSet node, | 1327 ast.SendSet node, |
| 1278 ast.Node receiver, | 1328 ast.Node receiver, |
| 1279 Selector selector, | 1329 Selector selector, |
| 1280 ast.Node rhs, | 1330 ast.Node rhs, |
| 1281 _) { | 1331 _) { |
| 1282 return irBuilder.buildDynamicSet( | 1332 return irBuilder.buildDynamicSet( |
| 1283 translateReceiver(receiver), | 1333 translateReceiver(receiver), |
| 1284 selector, | 1334 selector, |
| 1285 visit(rhs)); | 1335 visit(rhs)); |
| 1286 } | 1336 } |
| 1287 | 1337 |
| 1288 @override | 1338 @override |
| 1339 ir.Primitive visitIfNotNullDynamicPropertySet( | |
| 1340 ast.SendSet node, | |
| 1341 ast.Node receiver, | |
| 1342 Selector selector, | |
| 1343 ast.Node rhs, | |
| 1344 _) { | |
| 1345 ir.Primitive builtReceiver = visit(receiver); | |
| 1346 ir.Primitive condition = irBuilder.buildCheckNull(builtReceiver); | |
| 1347 return irBuilder.buildConditional( | |
| 1348 condition, | |
| 1349 (builder) => builtReceiver, | |
| 1350 (builder) => withBuilder(builder, () => | |
| 1351 builder.buildDynamicSet(builtReceiver, selector, visit(rhs)))); | |
| 1352 } | |
| 1353 | |
| 1354 @override | |
| 1289 ir.Primitive handleLocalSet( | 1355 ir.Primitive handleLocalSet( |
| 1290 ast.SendSet node, | 1356 ast.SendSet node, |
| 1291 LocalElement element, | 1357 LocalElement element, |
| 1292 ast.Node rhs, | 1358 ast.Node rhs, |
| 1293 _) { | 1359 _) { |
| 1294 return irBuilder.buildLocalVariableSet(element, visit(rhs)); | 1360 return irBuilder.buildLocalVariableSet(element, visit(rhs)); |
| 1295 } | 1361 } |
| 1296 | 1362 |
| 1297 @override | 1363 @override |
| 1298 ir.Primitive handleStaticFieldSet( | 1364 ir.Primitive handleStaticFieldSet( |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1354 | 1420 |
| 1355 @override | 1421 @override |
| 1356 ir.Primitive handleDynamicCompounds( | 1422 ir.Primitive handleDynamicCompounds( |
| 1357 ast.Send node, | 1423 ast.Send node, |
| 1358 ast.Node receiver, | 1424 ast.Node receiver, |
| 1359 CompoundRhs rhs, | 1425 CompoundRhs rhs, |
| 1360 Selector getterSelector, | 1426 Selector getterSelector, |
| 1361 Selector setterSelector, | 1427 Selector setterSelector, |
| 1362 arg) { | 1428 arg) { |
| 1363 ir.Primitive target = translateReceiver(receiver); | 1429 ir.Primitive target = translateReceiver(receiver); |
| 1364 return translateCompounds( | 1430 ir.Primitive helper() { |
| 1365 getValue: () => irBuilder.buildDynamicGet(target, getterSelector), | 1431 return translateCompounds( |
| 1366 rhs: rhs, | 1432 getValue: () => irBuilder.buildDynamicGet(target, getterSelector), |
| 1367 setValue: (ir.Primitive result) { | 1433 rhs: rhs, |
| 1368 irBuilder.buildDynamicSet(target, setterSelector, result); | 1434 setValue: (ir.Primitive result) { |
| 1369 }); | 1435 irBuilder.buildDynamicSet(target, setterSelector, result); |
| 1436 }); | |
| 1437 } | |
| 1438 if (node.isConditional) { | |
| 1439 return irBuilder.buildConditional( | |
| 1440 irBuilder.buildCheckNull(target), | |
| 1441 (_) => target, | |
| 1442 (builder) => withBuilder(builder, helper)); | |
| 1443 } else { | |
| 1444 return helper(); | |
| 1445 } | |
| 1370 } | 1446 } |
| 1371 | 1447 |
| 1372 ir.Primitive buildLocalNoSuchSetter(Local local, ir.Primitive value) { | 1448 ir.Primitive buildLocalNoSuchSetter(Local local, ir.Primitive value) { |
| 1373 Selector selector = new Selector.setter(local.name, null); | 1449 Selector selector = new Selector.setter(local.name, null); |
| 1374 return buildStaticNoSuchMethod(selector, [value]); | 1450 return buildStaticNoSuchMethod(selector, [value]); |
| 1375 } | 1451 } |
| 1376 | 1452 |
| 1377 @override | 1453 @override |
| 1378 ir.Primitive handleLocalCompounds( | 1454 ir.Primitive handleLocalCompounds( |
| 1379 ast.SendSet node, | 1455 ast.SendSet node, |
| (...skipping 1699 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3079 node.body = replacementFor(node.body); | 3155 node.body = replacementFor(node.body); |
| 3080 } | 3156 } |
| 3081 } | 3157 } |
| 3082 | 3158 |
| 3083 /// Visit a just-deleted subterm and unlink all [Reference]s in it. | 3159 /// Visit a just-deleted subterm and unlink all [Reference]s in it. |
| 3084 class RemovalVisitor extends ir.RecursiveVisitor { | 3160 class RemovalVisitor extends ir.RecursiveVisitor { |
| 3085 processReference(ir.Reference reference) { | 3161 processReference(ir.Reference reference) { |
| 3086 reference.unlink(); | 3162 reference.unlink(); |
| 3087 } | 3163 } |
| 3088 } | 3164 } |
| OLD | NEW |