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

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

Issue 1160833003: Add support for null-aware operators to the CPS-IR. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 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
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698