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

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

Issue 1250633002: Add operators test to source_mapping_test. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. Created 5 years, 5 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 642 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart ('k') | pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698