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

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

Issue 1313323002: Add visitor methods specific to ??= to SemanticSendVisitor. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. Created 5 years, 3 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 '../common/names.dart' show 9 import '../common/names.dart' show
10 Names, 10 Names,
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 with IrBuilderMixin<ast.Node>, 115 with IrBuilderMixin<ast.Node>,
116 SemanticSendResolvedMixin<ir.Primitive, dynamic>, 116 SemanticSendResolvedMixin<ir.Primitive, dynamic>,
117 SendResolverMixin, 117 SendResolverMixin,
118 ErrorBulkMixin<ir.Primitive, dynamic>, 118 ErrorBulkMixin<ir.Primitive, dynamic>,
119 BaseImplementationOfStaticsMixin<ir.Primitive, dynamic>, 119 BaseImplementationOfStaticsMixin<ir.Primitive, dynamic>,
120 BaseImplementationOfLocalsMixin<ir.Primitive, dynamic>, 120 BaseImplementationOfLocalsMixin<ir.Primitive, dynamic>,
121 BaseImplementationOfDynamicsMixin<ir.Primitive, dynamic>, 121 BaseImplementationOfDynamicsMixin<ir.Primitive, dynamic>,
122 BaseImplementationOfConstantsMixin<ir.Primitive, dynamic>, 122 BaseImplementationOfConstantsMixin<ir.Primitive, dynamic>,
123 BaseImplementationOfNewMixin<ir.Primitive, dynamic>, 123 BaseImplementationOfNewMixin<ir.Primitive, dynamic>,
124 BaseImplementationOfCompoundsMixin<ir.Primitive, dynamic>, 124 BaseImplementationOfCompoundsMixin<ir.Primitive, dynamic>,
125 BaseImplementationOfSetIfNullsMixin<ir.Primitive, dynamic>,
125 BaseImplementationOfIndexCompoundsMixin<ir.Primitive, dynamic> 126 BaseImplementationOfIndexCompoundsMixin<ir.Primitive, dynamic>
126 implements SemanticSendVisitor<ir.Primitive, dynamic> { 127 implements SemanticSendVisitor<ir.Primitive, dynamic> {
127 final TreeElements elements; 128 final TreeElements elements;
128 final Compiler compiler; 129 final Compiler compiler;
129 final SourceInformationBuilder sourceInformationBuilder; 130 final SourceInformationBuilder sourceInformationBuilder;
130 131
131 /// A map from try statements in the source to analysis information about 132 /// A map from try statements in the source to analysis information about
132 /// them. 133 /// them.
133 /// 134 ///
134 /// The analysis information includes the set of variables that must be 135 /// The analysis information includes the set of variables that must be
(...skipping 1208 matching lines...) Expand 10 before | Expand all | Expand 10 after
1343 elements.getOperatorTypeMaskInComplexSendSet(node); 1344 elements.getOperatorTypeMaskInComplexSendSet(node);
1344 SourceInformation operatorSourceInformation = 1345 SourceInformation operatorSourceInformation =
1345 sourceInformationBuilder.buildCall(node, node.assignmentOperator); 1346 sourceInformationBuilder.buildCall(node, node.assignmentOperator);
1346 ir.Primitive result = irBuilder.buildDynamicInvocation( 1347 ir.Primitive result = irBuilder.buildDynamicInvocation(
1347 value, operatorSelector, operatorTypeMask, arguments, 1348 value, operatorSelector, operatorTypeMask, arguments,
1348 sourceInformation: operatorSourceInformation); 1349 sourceInformation: operatorSourceInformation);
1349 setValue(result); 1350 setValue(result);
1350 return rhs.kind == CompoundKind.POSTFIX ? value : result; 1351 return rhs.kind == CompoundKind.POSTFIX ? value : result;
1351 } 1352 }
1352 1353
1354 ir.Primitive translateSetIfNull(
1355 ast.SendSet node,
1356 {ir.Primitive getValue(),
1357 ast.Node rhs,
1358 void setValue(ir.Primitive value)}) {
1359 ir.Primitive value = getValue();
1360 // Unlike other compound operators if-null conditionally will not do the
1361 // assignment operation.
1362 return irBuilder.buildIfNull(value, nested(() {
1363 ir.Primitive newValue = build(rhs);
1364 setValue(newValue);
1365 return newValue;
1366 }));
1367 }
1368
1353 @override 1369 @override
1354 ir.Primitive handleDynamicSet( 1370 ir.Primitive handleDynamicSet(
1355 ast.SendSet node, 1371 ast.SendSet node,
1356 ast.Node receiver, 1372 ast.Node receiver,
1357 Name name, 1373 Name name,
1358 ast.Node rhs, 1374 ast.Node rhs,
1359 _) { 1375 _) {
1360 return irBuilder.buildDynamicSet( 1376 return irBuilder.buildDynamicSet(
1361 translateReceiver(receiver), 1377 translateReceiver(receiver),
1362 new Selector.setter(name), 1378 new Selector.setter(name),
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1446 node, 1462 node,
1447 getValue: () { 1463 getValue: () {
1448 return buildConstantExpression(constant, 1464 return buildConstantExpression(constant,
1449 sourceInformationBuilder.buildGet(node)); 1465 sourceInformationBuilder.buildGet(node));
1450 }, 1466 },
1451 rhs: rhs, 1467 rhs: rhs,
1452 setValue: (value) {}); // The binary operator will throw before this. 1468 setValue: (value) {}); // The binary operator will throw before this.
1453 } 1469 }
1454 1470
1455 @override 1471 @override
1472 ir.Primitive handleTypeLiteralConstantSetIfNulls(
1473 ast.SendSet node,
1474 ConstantExpression constant,
1475 ast.Node rhs,
1476 _) {
1477 // The type literal is never `null`.
1478 return buildConstantExpression(constant,
1479 sourceInformationBuilder.buildGet(node));
1480 }
1481
1482 @override
1456 ir.Primitive handleDynamicCompounds( 1483 ir.Primitive handleDynamicCompounds(
1457 ast.SendSet node, 1484 ast.SendSet node,
1458 ast.Node receiver, 1485 ast.Node receiver,
1459 Name name, 1486 Name name,
1460 CompoundRhs rhs, 1487 CompoundRhs rhs,
1461 arg) { 1488 arg) {
1462 ir.Primitive target = translateReceiver(receiver); 1489 ir.Primitive target = translateReceiver(receiver);
1463 ir.Primitive helper() { 1490 ir.Primitive helper() {
1464 return translateCompounds( 1491 return translateCompounds(
1465 node, 1492 node,
1466 getValue: () => irBuilder.buildDynamicGet( 1493 getValue: () => irBuilder.buildDynamicGet(
1467 target, 1494 target,
1468 new Selector.getter(name), 1495 new Selector.getter(name),
1469 elements.getGetterTypeMaskInComplexSendSet(node), 1496 elements.getGetterTypeMaskInComplexSendSet(node),
1470 sourceInformationBuilder.buildGet(node)), 1497 sourceInformationBuilder.buildGet(node)),
1471 rhs: rhs, 1498 rhs: rhs,
1472 setValue: (ir.Primitive result) { 1499 setValue: (ir.Primitive result) {
1473 irBuilder.buildDynamicSet( 1500 irBuilder.buildDynamicSet(
1474 target, 1501 target,
1475 new Selector.setter(name), 1502 new Selector.setter(name),
1476 elements.getTypeMask(node), 1503 elements.getTypeMask(node),
1477 result); 1504 result);
1478 }); 1505 });
1479 } 1506 }
1480 return node.isConditional 1507 return node.isConditional
1481 ? irBuilder.buildIfNotNullSend(target, nested(helper)) 1508 ? irBuilder.buildIfNotNullSend(target, nested(helper))
1482 : helper(); 1509 : helper();
1483 } 1510 }
1484 1511
1512 @override
1513 ir.Primitive handleDynamicSetIfNulls(
1514 ast.Send node,
1515 ast.Node receiver,
1516 Name name,
1517 ast.Node rhs,
1518 _) {
1519 ir.Primitive target = translateReceiver(receiver);
1520 ir.Primitive helper() {
1521 return translateSetIfNull(
1522 node,
1523 getValue: () => irBuilder.buildDynamicGet(
1524 target,
1525 new Selector.getter(name),
1526 elements.getGetterTypeMaskInComplexSendSet(node),
1527 sourceInformationBuilder.buildGet(node)),
1528 rhs: rhs,
1529 setValue: (ir.Primitive result) {
1530 irBuilder.buildDynamicSet(
1531 target,
1532 new Selector.setter(name),
1533 elements.getTypeMask(node),
1534 result);
1535 });
1536 }
1537 return node.isConditional
1538 ? irBuilder.buildIfNotNullSend(target, nested(helper))
1539 : helper();
1540 }
1541
1485 ir.Primitive buildLocalNoSuchSetter(LocalElement local, ir.Primitive value) { 1542 ir.Primitive buildLocalNoSuchSetter(LocalElement local, ir.Primitive value) {
1486 Selector selector = new Selector.setter( 1543 Selector selector = new Selector.setter(
1487 new Name(local.name, local.library, isSetter: true)); 1544 new Name(local.name, local.library, isSetter: true));
1488 return buildStaticNoSuchMethod(selector, [value]); 1545 return buildStaticNoSuchMethod(selector, [value]);
1489 } 1546 }
1490 1547
1491 @override 1548 @override
1492 ir.Primitive handleLocalCompounds( 1549 ir.Primitive handleLocalCompounds(
1493 ast.SendSet node, 1550 ast.SendSet node,
1494 LocalElement local, 1551 LocalElement local,
(...skipping 12 matching lines...) Expand all
1507 rhs: rhs, 1564 rhs: rhs,
1508 setValue: (ir.Primitive result) { 1565 setValue: (ir.Primitive result) {
1509 if (isSetterValid) { 1566 if (isSetterValid) {
1510 irBuilder.buildLocalVariableSet(local, result); 1567 irBuilder.buildLocalVariableSet(local, result);
1511 } else { 1568 } else {
1512 return buildLocalNoSuchSetter(local, result); 1569 return buildLocalNoSuchSetter(local, result);
1513 } 1570 }
1514 }); 1571 });
1515 } 1572 }
1516 1573
1574 @override
1575 ir.Primitive handleLocalSetIfNulls(
1576 ast.SendSet node,
1577 LocalElement local,
1578 ast.Node rhs,
1579 _,
1580 {bool isSetterValid}) {
1581 return translateSetIfNull(
1582 node,
1583 getValue: () {
1584 if (local.isFunction) {
1585 return irBuilder.buildLocalFunctionGet(local);
1586 } else {
1587 return irBuilder.buildLocalVariableGet(local);
1588 }
1589 },
1590 rhs: rhs,
1591 setValue: (ir.Primitive result) {
1592 if (isSetterValid) {
1593 irBuilder.buildLocalVariableSet(local, result);
1594 } else {
1595 return buildLocalNoSuchSetter(local, result);
1596 }
1597 });
1598 }
1599
1517 ir.Primitive buildStaticNoSuchGetter(Element element) { 1600 ir.Primitive buildStaticNoSuchGetter(Element element) {
1518 return buildStaticNoSuchMethod( 1601 return buildStaticNoSuchMethod(
1519 new Selector.getter(new Name(element.name, element.library)), 1602 new Selector.getter(new Name(element.name, element.library)),
1520 const <ir.Primitive>[]); 1603 const <ir.Primitive>[]);
1521 } 1604 }
1522 1605
1523 ir.Primitive buildStaticNoSuchSetter(Element element, ir.Primitive value) { 1606 ir.Primitive buildStaticNoSuchSetter(Element element, ir.Primitive value) {
1524 return buildStaticNoSuchMethod( 1607 return buildStaticNoSuchMethod(
1525 new Selector.setter(new Name(element.name, element.library)), 1608 new Selector.setter(new Name(element.name, element.library)),
1526 <ir.Primitive>[value]); 1609 <ir.Primitive>[value]);
(...skipping 25 matching lines...) Expand all
1552 } 1635 }
1553 }, 1636 },
1554 rhs: rhs, 1637 rhs: rhs,
1555 setValue: (ir.Primitive result) { 1638 setValue: (ir.Primitive result) {
1556 switch (setterKind) { 1639 switch (setterKind) {
1557 case CompoundSetter.FIELD: 1640 case CompoundSetter.FIELD:
1558 return irBuilder.buildStaticFieldSet(setter, result); 1641 return irBuilder.buildStaticFieldSet(setter, result);
1559 case CompoundSetter.SETTER: 1642 case CompoundSetter.SETTER:
1560 return irBuilder.buildStaticSetterSet(setter, result); 1643 return irBuilder.buildStaticSetterSet(setter, result);
1561 case CompoundSetter.INVALID: 1644 case CompoundSetter.INVALID:
1562 // TODO(johnniwinther): Ensure [setter] is non null. 1645 return buildStaticNoSuchSetter(setter, result);
1563 return buildStaticNoSuchSetter(
1564 setter != null ? setter : getter, result);
1565 } 1646 }
1566 }); 1647 });
1567 } 1648 }
1649
1650 @override
1651 ir.Primitive handleStaticSetIfNulls(
1652 ast.SendSet node,
1653 Element getter,
1654 CompoundGetter getterKind,
1655 Element setter,
1656 CompoundSetter setterKind,
1657 ast.Node rhs,
1658 _) {
1659 return translateSetIfNull(
1660 node,
1661 getValue: () {
1662 switch (getterKind) {
1663 case CompoundGetter.FIELD:
1664 SourceInformation src = sourceInformationBuilder.buildGet(node);
1665 return irBuilder.buildStaticFieldGet(getter, src);
1666 case CompoundGetter.GETTER:
1667 return irBuilder.buildStaticGetterGet(
1668 getter, sourceInformationBuilder.buildGet(node));
1669 case CompoundGetter.METHOD:
1670 return irBuilder.buildStaticFunctionGet(getter);
1671 case CompoundGetter.UNRESOLVED:
1672 return buildStaticNoSuchGetter(getter);
1673 }
1674 },
1675 rhs: rhs,
1676 setValue: (ir.Primitive result) {
1677 switch (setterKind) {
1678 case CompoundSetter.FIELD:
1679 return irBuilder.buildStaticFieldSet(setter, result);
1680 case CompoundSetter.SETTER:
1681 return irBuilder.buildStaticSetterSet(setter, result);
1682 case CompoundSetter.INVALID:
1683 return buildStaticNoSuchSetter(setter, result);
1684 }
1685 });
1686 }
1568 1687
1569 ir.Primitive buildSuperNoSuchGetter(Element element, TypeMask mask) { 1688 ir.Primitive buildSuperNoSuchGetter(Element element, TypeMask mask) {
1570 return buildInstanceNoSuchMethod( 1689 return buildInstanceNoSuchMethod(
1571 new Selector.getter(new Name(element.name, element.library)), 1690 new Selector.getter(new Name(element.name, element.library)),
1572 mask, 1691 mask,
1573 const <ir.Primitive>[]); 1692 const <ir.Primitive>[]);
1574 } 1693 }
1575 1694
1576 ir.Primitive buildSuperNoSuchSetter(Element element, 1695 ir.Primitive buildSuperNoSuchSetter(Element element,
1577 TypeMask mask, 1696 TypeMask mask,
(...skipping 18 matching lines...) Expand all
1596 getValue: () { 1715 getValue: () {
1597 switch (getterKind) { 1716 switch (getterKind) {
1598 case CompoundGetter.FIELD: 1717 case CompoundGetter.FIELD:
1599 return irBuilder.buildSuperFieldGet(getter); 1718 return irBuilder.buildSuperFieldGet(getter);
1600 case CompoundGetter.GETTER: 1719 case CompoundGetter.GETTER:
1601 return irBuilder.buildSuperGetterGet( 1720 return irBuilder.buildSuperGetterGet(
1602 getter, sourceInformationBuilder.buildGet(node)); 1721 getter, sourceInformationBuilder.buildGet(node));
1603 case CompoundGetter.METHOD: 1722 case CompoundGetter.METHOD:
1604 return irBuilder.buildSuperMethodGet(getter); 1723 return irBuilder.buildSuperMethodGet(getter);
1605 case CompoundGetter.UNRESOLVED: 1724 case CompoundGetter.UNRESOLVED:
1606 // TODO(johnniwinther): Ensure [getter] is not null.
1607 return buildSuperNoSuchGetter( 1725 return buildSuperNoSuchGetter(
1608 getter != null ? getter : setter, 1726 getter,
1609 elements.getGetterTypeMaskInComplexSendSet(node)); 1727 elements.getGetterTypeMaskInComplexSendSet(node));
1610 } 1728 }
1611 }, 1729 },
1730 rhs: rhs,
1731 setValue: (ir.Primitive result) {
1732 switch (setterKind) {
1733 case CompoundSetter.FIELD:
1734 return irBuilder.buildSuperFieldSet(setter, result);
1735 case CompoundSetter.SETTER:
1736 return irBuilder.buildSuperSetterSet(setter, result);
1737 case CompoundSetter.INVALID:
1738 return buildSuperNoSuchSetter(
1739 setter, elements.getTypeMask(node), result);
1740 }
1741 });
1742 }
1743
1744 @override
1745 ir.Primitive handleSuperSetIfNulls(
1746 ast.SendSet node,
1747 Element getter,
1748 CompoundGetter getterKind,
1749 Element setter,
1750 CompoundSetter setterKind,
1751 ast.Node rhs,
1752 _) {
1753 return translateSetIfNull(
1754 node,
1755 getValue: () {
1756 switch (getterKind) {
1757 case CompoundGetter.FIELD:
1758 return irBuilder.buildSuperFieldGet(getter);
1759 case CompoundGetter.GETTER:
1760 return irBuilder.buildSuperGetterGet(
1761 getter, sourceInformationBuilder.buildGet(node));
1762 case CompoundGetter.METHOD:
1763 return irBuilder.buildSuperMethodGet(getter);
1764 case CompoundGetter.UNRESOLVED:
1765 return buildSuperNoSuchGetter(
1766 getter,
1767 elements.getGetterTypeMaskInComplexSendSet(node));
1768 }
1769 },
1612 rhs: rhs, 1770 rhs: rhs,
1613 setValue: (ir.Primitive result) { 1771 setValue: (ir.Primitive result) {
1614 switch (setterKind) { 1772 switch (setterKind) {
1615 case CompoundSetter.FIELD: 1773 case CompoundSetter.FIELD:
1616 return irBuilder.buildSuperFieldSet(setter, result); 1774 return irBuilder.buildSuperFieldSet(setter, result);
1617 case CompoundSetter.SETTER: 1775 case CompoundSetter.SETTER:
1618 return irBuilder.buildSuperSetterSet(setter, result); 1776 return irBuilder.buildSuperSetterSet(setter, result);
1619 case CompoundSetter.INVALID: 1777 case CompoundSetter.INVALID:
1620 return buildSuperNoSuchSetter( 1778 return buildSuperNoSuchSetter(
1621 setter, elements.getTypeMask(node), result); 1779 setter, elements.getTypeMask(node), result);
(...skipping 12 matching lines...) Expand all
1634 getValue: () { 1792 getValue: () {
1635 return irBuilder.buildReifyTypeVariable( 1793 return irBuilder.buildReifyTypeVariable(
1636 typeVariable.type, 1794 typeVariable.type,
1637 sourceInformationBuilder.buildGet(node)); 1795 sourceInformationBuilder.buildGet(node));
1638 }, 1796 },
1639 rhs: rhs, 1797 rhs: rhs,
1640 setValue: (value) {}); // The binary operator will throw before this. 1798 setValue: (value) {}); // The binary operator will throw before this.
1641 } 1799 }
1642 1800
1643 @override 1801 @override
1802 ir.Primitive visitTypeVariableTypeLiteralSetIfNull(
1803 ast.Send node,
1804 TypeVariableElement element,
1805 ast.Node rhs,
1806 _) {
1807 // The type variable is never `null`.
1808 return translateTypeVariableTypeLiteral(element,
1809 sourceInformationBuilder.buildGet(node));
1810 }
1811
1812 @override
1644 ir.Primitive handleIndexCompounds( 1813 ir.Primitive handleIndexCompounds(
1645 ast.SendSet node, 1814 ast.SendSet node,
1646 ast.Node receiver, 1815 ast.Node receiver,
1647 ast.Node index, 1816 ast.Node index,
1648 CompoundRhs rhs, 1817 CompoundRhs rhs,
1649 arg) { 1818 arg) {
1650 ir.Primitive target = visit(receiver); 1819 ir.Primitive target = visit(receiver);
1651 ir.Primitive indexValue = visit(index); 1820 ir.Primitive indexValue = visit(index);
1652 return translateCompounds( 1821 return translateCompounds(
1653 node, 1822 node,
(...skipping 1754 matching lines...) Expand 10 before | Expand all | Expand 10 after
3408 if (compiler.backend.isForeign(function)) { 3577 if (compiler.backend.isForeign(function)) {
3409 return handleForeignCode(node, function, argumentList, callStructure); 3578 return handleForeignCode(node, function, argumentList, callStructure);
3410 } else { 3579 } else {
3411 return irBuilder.buildStaticFunctionInvocation(function, callStructure, 3580 return irBuilder.buildStaticFunctionInvocation(function, callStructure,
3412 translateStaticArguments(argumentList, function, callStructure), 3581 translateStaticArguments(argumentList, function, callStructure),
3413 sourceInformation: 3582 sourceInformation:
3414 sourceInformationBuilder.buildCall(node, node.selector)); 3583 sourceInformationBuilder.buildCall(node, node.selector));
3415 } 3584 }
3416 } 3585 }
3417 } 3586 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/constants/constant_constructors.dart ('k') | pkg/compiler/lib/src/inferrer/inferrer_visitor.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698