| 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 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 653 | 653 |
| 654 @override | 654 @override |
| 655 ir.Primitive handleDynamicGet( | 655 ir.Primitive handleDynamicGet( |
| 656 ast.Send node, | 656 ast.Send node, |
| 657 ast.Node receiver, | 657 ast.Node receiver, |
| 658 Selector selector, | 658 Selector selector, |
| 659 _) { | 659 _) { |
| 660 return irBuilder.buildDynamicGet( | 660 return irBuilder.buildDynamicGet( |
| 661 translateReceiver(receiver), | 661 translateReceiver(receiver), |
| 662 selector, | 662 selector, |
| 663 elements.getTypeMask(node)); | 663 elements.getTypeMask(node), |
| 664 sourceInformationBuilder.buildGet(node)); |
| 664 } | 665 } |
| 665 | 666 |
| 666 @override | 667 @override |
| 667 ir.Primitive visitIfNotNullDynamicPropertyGet( | 668 ir.Primitive visitIfNotNullDynamicPropertyGet( |
| 668 ast.Send node, | 669 ast.Send node, |
| 669 ast.Node receiver, | 670 ast.Node receiver, |
| 670 Selector selector, | 671 Selector selector, |
| 671 _) { | 672 _) { |
| 672 ir.Primitive target = visit(receiver); | 673 ir.Primitive target = visit(receiver); |
| 673 return irBuilder.buildIfNotNullSend( | 674 return irBuilder.buildIfNotNullSend( |
| 674 target, | 675 target, |
| 675 nested(() => irBuilder.buildDynamicGet( | 676 nested(() => irBuilder.buildDynamicGet( |
| 676 target, selector, elements.getTypeMask(node)))); | 677 target, selector, elements.getTypeMask(node), |
| 678 sourceInformationBuilder.buildGet(node)))); |
| 677 } | 679 } |
| 678 | 680 |
| 679 @override | 681 @override |
| 680 ir.Primitive visitDynamicTypeLiteralGet( | 682 ir.Primitive visitDynamicTypeLiteralGet( |
| 681 ast.Send node, | 683 ast.Send node, |
| 682 ConstantExpression constant, | 684 ConstantExpression constant, |
| 683 _) { | 685 _) { |
| 684 return buildConstantExpression(constant, | 686 return buildConstantExpression(constant, |
| 685 sourceInformationBuilder.buildGet(node)); | 687 sourceInformationBuilder.buildGet(node)); |
| 686 } | 688 } |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 874 | 876 |
| 875 @override | 877 @override |
| 876 ir.Primitive visitIndex(ast.Send node, | 878 ir.Primitive visitIndex(ast.Send node, |
| 877 ast.Node receiver, | 879 ast.Node receiver, |
| 878 ast.Node index, _) { | 880 ast.Node index, _) { |
| 879 Selector selector = new Selector.index(); | 881 Selector selector = new Selector.index(); |
| 880 ir.Primitive target = visit(receiver); | 882 ir.Primitive target = visit(receiver); |
| 881 List<ir.Primitive> arguments = <ir.Primitive>[visit(index)]; | 883 List<ir.Primitive> arguments = <ir.Primitive>[visit(index)]; |
| 882 arguments = normalizeDynamicArguments(selector.callStructure, arguments); | 884 arguments = normalizeDynamicArguments(selector.callStructure, arguments); |
| 883 return irBuilder.buildDynamicInvocation( | 885 return irBuilder.buildDynamicInvocation( |
| 884 target, selector, elements.getTypeMask(node), arguments); | 886 target, selector, elements.getTypeMask(node), arguments, |
| 887 sourceInformation: |
| 888 sourceInformationBuilder.buildCall(receiver, node.selector)); |
| 885 } | 889 } |
| 886 | 890 |
| 887 ir.Primitive translateSuperBinary(FunctionElement function, | 891 ir.Primitive translateSuperBinary(FunctionElement function, |
| 888 op.BinaryOperator operator, | 892 op.BinaryOperator operator, |
| 889 ast.Node argument) { | 893 ast.Node argument) { |
| 890 CallStructure callStructure = CallStructure.ONE_ARG; | 894 CallStructure callStructure = CallStructure.ONE_ARG; |
| 891 List<ir.Primitive> arguments = <ir.Primitive>[visit(argument)]; | 895 List<ir.Primitive> arguments = <ir.Primitive>[visit(argument)]; |
| 892 arguments = normalizeDynamicArguments(callStructure, arguments); | 896 arguments = normalizeDynamicArguments(callStructure, arguments); |
| 893 return irBuilder.buildSuperMethodInvocation( | 897 return irBuilder.buildSuperMethodInvocation( |
| 894 function, callStructure, arguments); | 898 function, callStructure, arguments); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 959 translateSuperBinary(function, op.BinaryOperator.NOT_EQ, argument)); | 963 translateSuperBinary(function, op.BinaryOperator.NOT_EQ, argument)); |
| 960 } | 964 } |
| 961 | 965 |
| 962 @override | 966 @override |
| 963 ir.Primitive visitUnary(ast.Send node, | 967 ir.Primitive visitUnary(ast.Send node, |
| 964 op.UnaryOperator operator, ast.Node expression, _) { | 968 op.UnaryOperator operator, ast.Node expression, _) { |
| 965 // TODO(johnniwinther): Clean up the creation of selectors. | 969 // TODO(johnniwinther): Clean up the creation of selectors. |
| 966 Selector selector = operator.selector; | 970 Selector selector = operator.selector; |
| 967 ir.Primitive receiver = translateReceiver(expression); | 971 ir.Primitive receiver = translateReceiver(expression); |
| 968 return irBuilder.buildDynamicInvocation( | 972 return irBuilder.buildDynamicInvocation( |
| 969 receiver, selector, elements.getTypeMask(node), const []); | 973 receiver, selector, elements.getTypeMask(node), const [], |
| 974 sourceInformation: sourceInformationBuilder.buildCall( |
| 975 expression, node)); |
| 970 } | 976 } |
| 971 | 977 |
| 972 @override | 978 @override |
| 973 ir.Primitive visitSuperUnary( | 979 ir.Primitive visitSuperUnary( |
| 974 ast.Send node, | 980 ast.Send node, |
| 975 op.UnaryOperator operator, | 981 op.UnaryOperator operator, |
| 976 FunctionElement function, | 982 FunctionElement function, |
| 977 _) { | 983 _) { |
| 978 return irBuilder.buildSuperMethodInvocation( | 984 return irBuilder.buildSuperMethodInvocation( |
| 979 function, CallStructure.NO_ARGS, const []); | 985 function, CallStructure.NO_ARGS, const []); |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1242 ir.Primitive visitSuperIndexSet( | 1248 ir.Primitive visitSuperIndexSet( |
| 1243 ast.SendSet node, | 1249 ast.SendSet node, |
| 1244 FunctionElement function, | 1250 FunctionElement function, |
| 1245 ast.Node index, | 1251 ast.Node index, |
| 1246 ast.Node rhs, | 1252 ast.Node rhs, |
| 1247 _) { | 1253 _) { |
| 1248 return irBuilder.buildSuperIndexSet(function, visit(index), visit(rhs)); | 1254 return irBuilder.buildSuperIndexSet(function, visit(index), visit(rhs)); |
| 1249 } | 1255 } |
| 1250 | 1256 |
| 1251 ir.Primitive translateCompounds( | 1257 ir.Primitive translateCompounds( |
| 1258 ast.SendSet node, |
| 1252 {ir.Primitive getValue(), | 1259 {ir.Primitive getValue(), |
| 1253 CompoundRhs rhs, | 1260 CompoundRhs rhs, |
| 1254 void setValue(ir.Primitive value), | 1261 void setValue(ir.Primitive value)}) { |
| 1255 TypeMask operatorTypeMask}) { | |
| 1256 ir.Primitive value = getValue(); | 1262 ir.Primitive value = getValue(); |
| 1257 op.BinaryOperator operator = rhs.operator; | 1263 op.BinaryOperator operator = rhs.operator; |
| 1258 if (operator.kind == op.BinaryOperatorKind.IF_NULL) { | 1264 if (operator.kind == op.BinaryOperatorKind.IF_NULL) { |
| 1259 // Unlike other compound operators if-null conditionally will not do the | 1265 // Unlike other compound operators if-null conditionally will not do the |
| 1260 // assignment operation. | 1266 // assignment operation. |
| 1261 return irBuilder.buildIfNull(value, nested(() { | 1267 return irBuilder.buildIfNull(value, nested(() { |
| 1262 ir.Primitive newValue = build(rhs.rhs); | 1268 ir.Primitive newValue = build(rhs.rhs); |
| 1263 setValue(newValue); | 1269 setValue(newValue); |
| 1264 return newValue; | 1270 return newValue; |
| 1265 })); | 1271 })); |
| 1266 } | 1272 } |
| 1267 | 1273 |
| 1268 Selector operatorSelector = | 1274 Selector operatorSelector = |
| 1269 new Selector.binaryOperator(operator.selectorName); | 1275 new Selector.binaryOperator(operator.selectorName); |
| 1270 ir.Primitive rhsValue; | 1276 ir.Primitive rhsValue; |
| 1271 if (rhs.kind == CompoundKind.ASSIGNMENT) { | 1277 if (rhs.kind == CompoundKind.ASSIGNMENT) { |
| 1272 rhsValue = visit(rhs.rhs); | 1278 rhsValue = visit(rhs.rhs); |
| 1273 } else { | 1279 } else { |
| 1274 rhsValue = irBuilder.buildIntegerConstant(1); | 1280 rhsValue = irBuilder.buildIntegerConstant(1); |
| 1275 } | 1281 } |
| 1276 List<ir.Primitive> arguments = <ir.Primitive>[rhsValue]; | 1282 List<ir.Primitive> arguments = <ir.Primitive>[rhsValue]; |
| 1277 arguments = normalizeDynamicArguments( | 1283 arguments = normalizeDynamicArguments( |
| 1278 operatorSelector.callStructure, arguments); | 1284 operatorSelector.callStructure, arguments); |
| 1279 ir.Primitive result = | 1285 TypeMask operatorTypeMask = |
| 1280 irBuilder.buildDynamicInvocation( | 1286 elements.getOperatorTypeMaskInComplexSendSet(node); |
| 1281 value, operatorSelector, operatorTypeMask, arguments); | 1287 SourceInformation operatorSourceInformation = |
| 1288 sourceInformationBuilder.buildCall(node, node.assignmentOperator); |
| 1289 ir.Primitive result = irBuilder.buildDynamicInvocation( |
| 1290 value, operatorSelector, operatorTypeMask, arguments, |
| 1291 sourceInformation: operatorSourceInformation); |
| 1282 setValue(result); | 1292 setValue(result); |
| 1283 return rhs.kind == CompoundKind.POSTFIX ? value : result; | 1293 return rhs.kind == CompoundKind.POSTFIX ? value : result; |
| 1284 } | 1294 } |
| 1285 | 1295 |
| 1286 @override | 1296 @override |
| 1287 ir.Primitive handleDynamicSet( | 1297 ir.Primitive handleDynamicSet( |
| 1288 ast.SendSet node, | 1298 ast.SendSet node, |
| 1289 ast.Node receiver, | 1299 ast.Node receiver, |
| 1290 Selector selector, | 1300 Selector selector, |
| 1291 ast.Node rhs, | 1301 ast.Node rhs, |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1366 return irBuilder.buildStaticSetterSet(setter, visit(rhs)); | 1376 return irBuilder.buildStaticSetterSet(setter, visit(rhs)); |
| 1367 } | 1377 } |
| 1368 | 1378 |
| 1369 @override | 1379 @override |
| 1370 ir.Primitive handleTypeLiteralConstantCompounds( | 1380 ir.Primitive handleTypeLiteralConstantCompounds( |
| 1371 ast.SendSet node, | 1381 ast.SendSet node, |
| 1372 ConstantExpression constant, | 1382 ConstantExpression constant, |
| 1373 CompoundRhs rhs, | 1383 CompoundRhs rhs, |
| 1374 arg) { | 1384 arg) { |
| 1375 return translateCompounds( | 1385 return translateCompounds( |
| 1386 node, |
| 1376 getValue: () { | 1387 getValue: () { |
| 1377 return buildConstantExpression(constant, | 1388 return buildConstantExpression(constant, |
| 1378 sourceInformationBuilder.buildGet(node)); | 1389 sourceInformationBuilder.buildGet(node)); |
| 1379 }, | 1390 }, |
| 1380 rhs: rhs, | 1391 rhs: rhs, |
| 1381 setValue: (value) {}, // The binary operator will throw before this. | 1392 setValue: (value) {}); // The binary operator will throw before this. |
| 1382 operatorTypeMask: elements.getOperatorTypeMaskInComplexSendSet(node)); | |
| 1383 } | 1393 } |
| 1384 | 1394 |
| 1385 @override | 1395 @override |
| 1386 ir.Primitive handleDynamicCompounds( | 1396 ir.Primitive handleDynamicCompounds( |
| 1387 ast.SendSet node, | 1397 ast.SendSet node, |
| 1388 ast.Node receiver, | 1398 ast.Node receiver, |
| 1389 CompoundRhs rhs, | 1399 CompoundRhs rhs, |
| 1390 Selector getterSelector, | 1400 Selector getterSelector, |
| 1391 Selector setterSelector, | 1401 Selector setterSelector, |
| 1392 arg) { | 1402 arg) { |
| 1393 ir.Primitive target = translateReceiver(receiver); | 1403 ir.Primitive target = translateReceiver(receiver); |
| 1394 ir.Primitive helper() { | 1404 ir.Primitive helper() { |
| 1395 return translateCompounds( | 1405 return translateCompounds( |
| 1406 node, |
| 1396 getValue: () => irBuilder.buildDynamicGet( | 1407 getValue: () => irBuilder.buildDynamicGet( |
| 1397 target, | 1408 target, |
| 1398 getterSelector, | 1409 getterSelector, |
| 1399 elements.getGetterTypeMaskInComplexSendSet(node)), | 1410 elements.getGetterTypeMaskInComplexSendSet(node), |
| 1411 sourceInformationBuilder.buildGet(node)), |
| 1400 rhs: rhs, | 1412 rhs: rhs, |
| 1401 setValue: (ir.Primitive result) { | 1413 setValue: (ir.Primitive result) { |
| 1402 irBuilder.buildDynamicSet( | 1414 irBuilder.buildDynamicSet( |
| 1403 target, setterSelector, elements.getTypeMask(node), result); | 1415 target, setterSelector, elements.getTypeMask(node), result); |
| 1404 }, | 1416 }); |
| 1405 operatorTypeMask: elements.getOperatorTypeMaskInComplexSendSet(node)); | |
| 1406 } | 1417 } |
| 1407 return node.isConditional | 1418 return node.isConditional |
| 1408 ? irBuilder.buildIfNotNullSend(target, nested(helper)) | 1419 ? irBuilder.buildIfNotNullSend(target, nested(helper)) |
| 1409 : helper(); | 1420 : helper(); |
| 1410 } | 1421 } |
| 1411 | 1422 |
| 1412 ir.Primitive buildLocalNoSuchSetter(Local local, ir.Primitive value) { | 1423 ir.Primitive buildLocalNoSuchSetter(Local local, ir.Primitive value) { |
| 1413 Selector selector = new Selector.setter(local.name, null); | 1424 Selector selector = new Selector.setter(local.name, null); |
| 1414 return buildStaticNoSuchMethod(selector, [value]); | 1425 return buildStaticNoSuchMethod(selector, [value]); |
| 1415 } | 1426 } |
| 1416 | 1427 |
| 1417 @override | 1428 @override |
| 1418 ir.Primitive handleLocalCompounds( | 1429 ir.Primitive handleLocalCompounds( |
| 1419 ast.SendSet node, | 1430 ast.SendSet node, |
| 1420 LocalElement local, | 1431 LocalElement local, |
| 1421 CompoundRhs rhs, | 1432 CompoundRhs rhs, |
| 1422 arg, | 1433 arg, |
| 1423 {bool isSetterValid}) { | 1434 {bool isSetterValid}) { |
| 1424 return translateCompounds( | 1435 return translateCompounds( |
| 1436 node, |
| 1425 getValue: () { | 1437 getValue: () { |
| 1426 if (local.isFunction) { | 1438 if (local.isFunction) { |
| 1427 return irBuilder.buildLocalFunctionGet(local); | 1439 return irBuilder.buildLocalFunctionGet(local); |
| 1428 } else { | 1440 } else { |
| 1429 return irBuilder.buildLocalVariableGet(local); | 1441 return irBuilder.buildLocalVariableGet(local); |
| 1430 } | 1442 } |
| 1431 }, | 1443 }, |
| 1432 rhs: rhs, | 1444 rhs: rhs, |
| 1433 setValue: (ir.Primitive result) { | 1445 setValue: (ir.Primitive result) { |
| 1434 if (isSetterValid) { | 1446 if (isSetterValid) { |
| 1435 irBuilder.buildLocalVariableSet(local, result); | 1447 irBuilder.buildLocalVariableSet(local, result); |
| 1436 } else { | 1448 } else { |
| 1437 return buildLocalNoSuchSetter(local, result); | 1449 return buildLocalNoSuchSetter(local, result); |
| 1438 } | 1450 } |
| 1439 }, | 1451 }); |
| 1440 operatorTypeMask: elements.getOperatorTypeMaskInComplexSendSet(node)); | |
| 1441 } | 1452 } |
| 1442 | 1453 |
| 1443 ir.Primitive buildStaticNoSuchGetter(Element element) { | 1454 ir.Primitive buildStaticNoSuchGetter(Element element) { |
| 1444 return buildStaticNoSuchMethod( | 1455 return buildStaticNoSuchMethod( |
| 1445 new Selector.getter(element.name, element.library), | 1456 new Selector.getter(element.name, element.library), |
| 1446 const <ir.Primitive>[]); | 1457 const <ir.Primitive>[]); |
| 1447 } | 1458 } |
| 1448 | 1459 |
| 1449 ir.Primitive buildStaticNoSuchSetter(Element element, ir.Primitive value) { | 1460 ir.Primitive buildStaticNoSuchSetter(Element element, ir.Primitive value) { |
| 1450 return buildStaticNoSuchMethod( | 1461 return buildStaticNoSuchMethod( |
| 1451 new Selector.setter(element.name, element.library), | 1462 new Selector.setter(element.name, element.library), |
| 1452 <ir.Primitive>[value]); | 1463 <ir.Primitive>[value]); |
| 1453 } | 1464 } |
| 1454 | 1465 |
| 1455 @override | 1466 @override |
| 1456 ir.Primitive handleStaticCompounds( | 1467 ir.Primitive handleStaticCompounds( |
| 1457 ast.SendSet node, | 1468 ast.SendSet node, |
| 1458 Element getter, | 1469 Element getter, |
| 1459 CompoundGetter getterKind, | 1470 CompoundGetter getterKind, |
| 1460 Element setter, | 1471 Element setter, |
| 1461 CompoundSetter setterKind, | 1472 CompoundSetter setterKind, |
| 1462 CompoundRhs rhs, | 1473 CompoundRhs rhs, |
| 1463 arg) { | 1474 arg) { |
| 1464 return translateCompounds( | 1475 return translateCompounds( |
| 1476 node, |
| 1465 getValue: () { | 1477 getValue: () { |
| 1466 switch (getterKind) { | 1478 switch (getterKind) { |
| 1467 case CompoundGetter.FIELD: | 1479 case CompoundGetter.FIELD: |
| 1468 SourceInformation src = sourceInformationBuilder.buildGet(node); | 1480 SourceInformation src = sourceInformationBuilder.buildGet(node); |
| 1469 return irBuilder.buildStaticFieldGet(getter, src); | 1481 return irBuilder.buildStaticFieldGet(getter, src); |
| 1470 case CompoundGetter.GETTER: | 1482 case CompoundGetter.GETTER: |
| 1471 return irBuilder.buildStaticGetterGet( | 1483 return irBuilder.buildStaticGetterGet( |
| 1472 getter, sourceInformationBuilder.buildGet(node)); | 1484 getter, sourceInformationBuilder.buildGet(node)); |
| 1473 case CompoundGetter.METHOD: | 1485 case CompoundGetter.METHOD: |
| 1474 return irBuilder.buildStaticFunctionGet(getter); | 1486 return irBuilder.buildStaticFunctionGet(getter); |
| 1475 case CompoundGetter.UNRESOLVED: | 1487 case CompoundGetter.UNRESOLVED: |
| 1476 return buildStaticNoSuchGetter(getter); | 1488 return buildStaticNoSuchGetter(getter); |
| 1477 } | 1489 } |
| 1478 }, | 1490 }, |
| 1479 rhs: rhs, | 1491 rhs: rhs, |
| 1480 setValue: (ir.Primitive result) { | 1492 setValue: (ir.Primitive result) { |
| 1481 switch (setterKind) { | 1493 switch (setterKind) { |
| 1482 case CompoundSetter.FIELD: | 1494 case CompoundSetter.FIELD: |
| 1483 return irBuilder.buildStaticFieldSet(setter, result); | 1495 return irBuilder.buildStaticFieldSet(setter, result); |
| 1484 case CompoundSetter.SETTER: | 1496 case CompoundSetter.SETTER: |
| 1485 return irBuilder.buildStaticSetterSet(setter, result); | 1497 return irBuilder.buildStaticSetterSet(setter, result); |
| 1486 case CompoundSetter.INVALID: | 1498 case CompoundSetter.INVALID: |
| 1487 // TODO(johnniwinther): Ensure [setter] is non null. | 1499 // TODO(johnniwinther): Ensure [setter] is non null. |
| 1488 return buildStaticNoSuchSetter( | 1500 return buildStaticNoSuchSetter( |
| 1489 setter != null ? setter : getter, result); | 1501 setter != null ? setter : getter, result); |
| 1490 } | 1502 } |
| 1491 }, | 1503 }); |
| 1492 operatorTypeMask: elements.getOperatorTypeMaskInComplexSendSet(node)); | |
| 1493 } | 1504 } |
| 1494 | 1505 |
| 1495 ir.Primitive buildSuperNoSuchGetter(Element element, TypeMask mask) { | 1506 ir.Primitive buildSuperNoSuchGetter(Element element, TypeMask mask) { |
| 1496 return buildInstanceNoSuchMethod( | 1507 return buildInstanceNoSuchMethod( |
| 1497 new Selector.getter(element.name, element.library), | 1508 new Selector.getter(element.name, element.library), |
| 1498 mask, | 1509 mask, |
| 1499 const <ir.Primitive>[]); | 1510 const <ir.Primitive>[]); |
| 1500 } | 1511 } |
| 1501 | 1512 |
| 1502 ir.Primitive buildSuperNoSuchSetter(Element element, | 1513 ir.Primitive buildSuperNoSuchSetter(Element element, |
| 1503 TypeMask mask, | 1514 TypeMask mask, |
| 1504 ir.Primitive value) { | 1515 ir.Primitive value) { |
| 1505 return buildInstanceNoSuchMethod( | 1516 return buildInstanceNoSuchMethod( |
| 1506 new Selector.setter(element.name, element.library), | 1517 new Selector.setter(element.name, element.library), |
| 1507 mask, | 1518 mask, |
| 1508 <ir.Primitive>[value]); | 1519 <ir.Primitive>[value]); |
| 1509 } | 1520 } |
| 1510 | 1521 |
| 1511 @override | 1522 @override |
| 1512 ir.Primitive handleSuperCompounds( | 1523 ir.Primitive handleSuperCompounds( |
| 1513 ast.SendSet node, | 1524 ast.SendSet node, |
| 1514 Element getter, | 1525 Element getter, |
| 1515 CompoundGetter getterKind, | 1526 CompoundGetter getterKind, |
| 1516 Element setter, | 1527 Element setter, |
| 1517 CompoundSetter setterKind, | 1528 CompoundSetter setterKind, |
| 1518 CompoundRhs rhs, | 1529 CompoundRhs rhs, |
| 1519 arg) { | 1530 arg) { |
| 1520 return translateCompounds( | 1531 return translateCompounds( |
| 1532 node, |
| 1521 getValue: () { | 1533 getValue: () { |
| 1522 switch (getterKind) { | 1534 switch (getterKind) { |
| 1523 case CompoundGetter.FIELD: | 1535 case CompoundGetter.FIELD: |
| 1524 return irBuilder.buildSuperFieldGet(getter); | 1536 return irBuilder.buildSuperFieldGet(getter); |
| 1525 case CompoundGetter.GETTER: | 1537 case CompoundGetter.GETTER: |
| 1526 return irBuilder.buildSuperGetterGet( | 1538 return irBuilder.buildSuperGetterGet( |
| 1527 getter, sourceInformationBuilder.buildGet(node)); | 1539 getter, sourceInformationBuilder.buildGet(node)); |
| 1528 case CompoundGetter.METHOD: | 1540 case CompoundGetter.METHOD: |
| 1529 return irBuilder.buildSuperMethodGet(getter); | 1541 return irBuilder.buildSuperMethodGet(getter); |
| 1530 case CompoundGetter.UNRESOLVED: | 1542 case CompoundGetter.UNRESOLVED: |
| 1531 // TODO(johnniwinther): Ensure [getter] is not null. | 1543 // TODO(johnniwinther): Ensure [getter] is not null. |
| 1532 return buildSuperNoSuchGetter( | 1544 return buildSuperNoSuchGetter( |
| 1533 getter != null ? getter : setter, | 1545 getter != null ? getter : setter, |
| 1534 elements.getGetterTypeMaskInComplexSendSet(node)); | 1546 elements.getGetterTypeMaskInComplexSendSet(node)); |
| 1535 } | 1547 } |
| 1536 }, | 1548 }, |
| 1537 rhs: rhs, | 1549 rhs: rhs, |
| 1538 setValue: (ir.Primitive result) { | 1550 setValue: (ir.Primitive result) { |
| 1539 switch (setterKind) { | 1551 switch (setterKind) { |
| 1540 case CompoundSetter.FIELD: | 1552 case CompoundSetter.FIELD: |
| 1541 return irBuilder.buildSuperFieldSet(setter, result); | 1553 return irBuilder.buildSuperFieldSet(setter, result); |
| 1542 case CompoundSetter.SETTER: | 1554 case CompoundSetter.SETTER: |
| 1543 return irBuilder.buildSuperSetterSet(setter, result); | 1555 return irBuilder.buildSuperSetterSet(setter, result); |
| 1544 case CompoundSetter.INVALID: | 1556 case CompoundSetter.INVALID: |
| 1545 return buildSuperNoSuchSetter( | 1557 return buildSuperNoSuchSetter( |
| 1546 setter, elements.getTypeMask(node), result); | 1558 setter, elements.getTypeMask(node), result); |
| 1547 } | 1559 } |
| 1548 }, | 1560 }); |
| 1549 operatorTypeMask: elements.getOperatorTypeMaskInComplexSendSet(node)); | |
| 1550 } | 1561 } |
| 1551 | 1562 |
| 1552 @override | 1563 @override |
| 1553 ir.Primitive handleTypeVariableTypeLiteralCompounds( | 1564 ir.Primitive handleTypeVariableTypeLiteralCompounds( |
| 1554 ast.SendSet node, | 1565 ast.SendSet node, |
| 1555 TypeVariableElement typeVariable, | 1566 TypeVariableElement typeVariable, |
| 1556 CompoundRhs rhs, | 1567 CompoundRhs rhs, |
| 1557 arg) { | 1568 arg) { |
| 1558 return translateCompounds( | 1569 return translateCompounds( |
| 1570 node, |
| 1559 getValue: () { | 1571 getValue: () { |
| 1560 return irBuilder.buildReifyTypeVariable( | 1572 return irBuilder.buildReifyTypeVariable( |
| 1561 typeVariable.type, | 1573 typeVariable.type, |
| 1562 sourceInformationBuilder.buildGet(node)); | 1574 sourceInformationBuilder.buildGet(node)); |
| 1563 }, | 1575 }, |
| 1564 rhs: rhs, | 1576 rhs: rhs, |
| 1565 setValue: (value) {}, // The binary operator will throw before this. | 1577 setValue: (value) {}); // The binary operator will throw before this. |
| 1566 operatorTypeMask: elements.getOperatorTypeMaskInComplexSendSet(node)); | |
| 1567 } | 1578 } |
| 1568 | 1579 |
| 1569 @override | 1580 @override |
| 1570 ir.Primitive handleIndexCompounds( | 1581 ir.Primitive handleIndexCompounds( |
| 1571 ast.SendSet node, | 1582 ast.SendSet node, |
| 1572 ast.Node receiver, | 1583 ast.Node receiver, |
| 1573 ast.Node index, | 1584 ast.Node index, |
| 1574 CompoundRhs rhs, | 1585 CompoundRhs rhs, |
| 1575 arg) { | 1586 arg) { |
| 1576 ir.Primitive target = visit(receiver); | 1587 ir.Primitive target = visit(receiver); |
| 1577 ir.Primitive indexValue = visit(index); | 1588 ir.Primitive indexValue = visit(index); |
| 1578 return translateCompounds( | 1589 return translateCompounds( |
| 1590 node, |
| 1579 getValue: () { | 1591 getValue: () { |
| 1580 Selector selector = new Selector.index(); | 1592 Selector selector = new Selector.index(); |
| 1581 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; | 1593 List<ir.Primitive> arguments = <ir.Primitive>[indexValue]; |
| 1582 arguments = | 1594 arguments = |
| 1583 normalizeDynamicArguments(selector.callStructure, arguments); | 1595 normalizeDynamicArguments(selector.callStructure, arguments); |
| 1584 return irBuilder.buildDynamicInvocation( | 1596 return irBuilder.buildDynamicInvocation( |
| 1585 target, | 1597 target, |
| 1586 selector, | 1598 selector, |
| 1587 elements.getGetterTypeMaskInComplexSendSet(node), | 1599 elements.getGetterTypeMaskInComplexSendSet(node), |
| 1588 arguments); | 1600 arguments, |
| 1601 sourceInformation: |
| 1602 sourceInformationBuilder.buildCall(receiver, node)); |
| 1589 }, | 1603 }, |
| 1590 rhs: rhs, | 1604 rhs: rhs, |
| 1591 setValue: (ir.Primitive result) { | 1605 setValue: (ir.Primitive result) { |
| 1592 irBuilder.buildDynamicIndexSet( | 1606 irBuilder.buildDynamicIndexSet( |
| 1593 target, | 1607 target, |
| 1594 elements.getTypeMask(node), | 1608 elements.getTypeMask(node), |
| 1595 indexValue, | 1609 indexValue, |
| 1596 result); | 1610 result); |
| 1597 }, | 1611 }); |
| 1598 operatorTypeMask: elements.getOperatorTypeMaskInComplexSendSet(node)); | |
| 1599 } | 1612 } |
| 1600 | 1613 |
| 1601 @override | 1614 @override |
| 1602 ir.Primitive handleSuperIndexCompounds( | 1615 ir.Primitive handleSuperIndexCompounds( |
| 1603 ast.SendSet node, | 1616 ast.SendSet node, |
| 1604 Element indexFunction, | 1617 Element indexFunction, |
| 1605 Element indexSetFunction, | 1618 Element indexSetFunction, |
| 1606 ast.Node index, | 1619 ast.Node index, |
| 1607 CompoundRhs rhs, | 1620 CompoundRhs rhs, |
| 1608 arg, | 1621 arg, |
| 1609 {bool isGetterValid, | 1622 {bool isGetterValid, |
| 1610 bool isSetterValid}) { | 1623 bool isSetterValid}) { |
| 1611 ir.Primitive indexValue = visit(index); | 1624 ir.Primitive indexValue = visit(index); |
| 1612 return translateCompounds( | 1625 return translateCompounds( |
| 1626 node, |
| 1613 getValue: () { | 1627 getValue: () { |
| 1614 if (isGetterValid) { | 1628 if (isGetterValid) { |
| 1615 return irBuilder.buildSuperIndex(indexFunction, indexValue); | 1629 return irBuilder.buildSuperIndex(indexFunction, indexValue); |
| 1616 } else { | 1630 } else { |
| 1617 return buildInstanceNoSuchMethod( | 1631 return buildInstanceNoSuchMethod( |
| 1618 new Selector.index(), | 1632 new Selector.index(), |
| 1619 elements.getGetterTypeMaskInComplexSendSet(node), | 1633 elements.getGetterTypeMaskInComplexSendSet(node), |
| 1620 <ir.Primitive>[indexValue]); | 1634 <ir.Primitive>[indexValue]); |
| 1621 } | 1635 } |
| 1622 }, | 1636 }, |
| 1623 rhs: rhs, | 1637 rhs: rhs, |
| 1624 setValue: (ir.Primitive result) { | 1638 setValue: (ir.Primitive result) { |
| 1625 if (isSetterValid) { | 1639 if (isSetterValid) { |
| 1626 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result); | 1640 irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result); |
| 1627 } else { | 1641 } else { |
| 1628 buildInstanceNoSuchMethod( | 1642 buildInstanceNoSuchMethod( |
| 1629 new Selector.indexSet(), | 1643 new Selector.indexSet(), |
| 1630 elements.getTypeMask(node), | 1644 elements.getTypeMask(node), |
| 1631 <ir.Primitive>[indexValue, result]); | 1645 <ir.Primitive>[indexValue, result]); |
| 1632 } | 1646 } |
| 1633 }, | 1647 }); |
| 1634 operatorTypeMask: elements.getOperatorTypeMaskInComplexSendSet(node)); | |
| 1635 } | 1648 } |
| 1636 | 1649 |
| 1637 /// Evaluates a string interpolation and appends each part to [accumulator] | 1650 /// Evaluates a string interpolation and appends each part to [accumulator] |
| 1638 /// (after stringify conversion). | 1651 /// (after stringify conversion). |
| 1639 void buildStringParts(ast.Node node, List<ir.Primitive> accumulator) { | 1652 void buildStringParts(ast.Node node, List<ir.Primitive> accumulator) { |
| 1640 if (node is ast.StringJuxtaposition) { | 1653 if (node is ast.StringJuxtaposition) { |
| 1641 buildStringParts(node.first, accumulator); | 1654 buildStringParts(node.first, accumulator); |
| 1642 buildStringParts(node.second, accumulator); | 1655 buildStringParts(node.second, accumulator); |
| 1643 } else if (node is ast.StringInterpolation) { | 1656 } else if (node is ast.StringInterpolation) { |
| 1644 buildStringParts(node.string, accumulator); | 1657 buildStringParts(node.string, accumulator); |
| (...skipping 1748 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3393 } | 3406 } |
| 3394 | 3407 |
| 3395 processSetStatic(ir.SetStatic node) { | 3408 processSetStatic(ir.SetStatic node) { |
| 3396 node.body = replacementFor(node.body); | 3409 node.body = replacementFor(node.body); |
| 3397 } | 3410 } |
| 3398 | 3411 |
| 3399 processContinuation(ir.Continuation node) { | 3412 processContinuation(ir.Continuation node) { |
| 3400 node.body = replacementFor(node.body); | 3413 node.body = replacementFor(node.body); |
| 3401 } | 3414 } |
| 3402 } | 3415 } |
| OLD | NEW |