OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 class SsaCodeGeneratorTask extends CompilerTask { | 5 class SsaCodeGeneratorTask extends CompilerTask { |
6 | 6 |
7 final JavaScriptBackend backend; | 7 final JavaScriptBackend backend; |
8 | 8 |
9 SsaCodeGeneratorTask(JavaScriptBackend backend) | 9 SsaCodeGeneratorTask(JavaScriptBackend backend) |
10 : this.backend = backend, | 10 : this.backend = backend, |
(...skipping 1616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1627 if (value.guaranteedType.union(HType.NUMBER) == HType.NUMBER) return true; | 1627 if (value.guaranteedType.union(HType.NUMBER) == HType.NUMBER) return true; |
1628 if (value is HBinaryArithmetic) { | 1628 if (value is HBinaryArithmetic) { |
1629 return (isSimpleFieldNumberComputation(value.left, node) && | 1629 return (isSimpleFieldNumberComputation(value.left, node) && |
1630 isSimpleFieldNumberComputation(value.right, node)); | 1630 isSimpleFieldNumberComputation(value.right, node)); |
1631 } | 1631 } |
1632 if (value is HFieldGet) return value.element == node.element; | 1632 if (value is HFieldGet) return value.element == node.element; |
1633 return false; | 1633 return false; |
1634 } | 1634 } |
1635 | 1635 |
1636 visitFieldSet(HFieldSet node) { | 1636 visitFieldSet(HFieldSet node) { |
1637 if (work.element.isGenerativeConstructorBody() && | |
1638 node.element.isMember() && | |
1639 node.value.hasGuaranteedType() && | |
1640 node.block.dominates(currentGraph.exit)) { | |
1641 backend.updateFieldConstructorSetters(node.element, | |
1642 node.value.guaranteedType); | |
1643 } | |
1644 String name = backend.namer.getName(node.element); | 1637 String name = backend.namer.getName(node.element); |
1645 DartType type = types[node.receiver].computeType(compiler); | 1638 DartType type = types[node.receiver].computeType(compiler); |
1646 if (type != null) { | 1639 if (type != null) { |
1647 if (!work.element.isGenerativeConstructorBody()) { | 1640 if (!work.element.isGenerativeConstructorBody()) { |
1648 world.registerFieldSetter( | 1641 world.registerFieldSetter( |
1649 node.element.name, node.element.getLibrary(), type); | 1642 node.element.name, node.element.getLibrary(), type); |
1650 } | 1643 backend.registerFieldSetter(node, types); |
1651 // Determine the types seen so far for the field. If only number | |
1652 // types have been seen and the value of the field set is a | |
1653 // simple number computation only depending on that field, we | |
1654 // can safely keep the number type for the field. | |
1655 HType fieldSettersType = backend.fieldSettersTypeSoFar(node.element); | |
1656 HType initializersType = | |
1657 backend.typeFromInitializersSoFar(node.element); | |
1658 HType fieldType = fieldSettersType.union(initializersType); | |
1659 if (HType.NUMBER.union(fieldType) == HType.NUMBER && | |
1660 isSimpleFieldNumberComputation(node.value, node)) { | |
1661 backend.updateFieldSetters(node.element, HType.NUMBER); | |
1662 } else { | |
1663 backend.updateFieldSetters(node.element, types[node.value]); | |
1664 } | 1644 } |
1665 } | 1645 } |
1666 use(node.receiver); | 1646 use(node.receiver); |
1667 js.Expression receiver = pop(); | 1647 js.Expression receiver = pop(); |
1668 use(node.value); | 1648 use(node.value); |
1669 push(new js.Assignment(new js.PropertyAccess.field(receiver, name), pop()), | 1649 push(new js.Assignment(new js.PropertyAccess.field(receiver, name), pop()), |
1670 node); | 1650 node); |
1671 } | 1651 } |
1672 | 1652 |
1673 visitLocalGet(HLocalGet node) { | 1653 visitLocalGet(HLocalGet node) { |
(...skipping 18 matching lines...) Expand all Loading... |
1692 List<js.Expression> data = <js.Expression>[]; | 1672 List<js.Expression> data = <js.Expression>[]; |
1693 for (int i = 0; i < inputs.length; i++) { | 1673 for (int i = 0; i < inputs.length; i++) { |
1694 use(inputs[i]); | 1674 use(inputs[i]); |
1695 data.add(pop()); | 1675 data.add(pop()); |
1696 } | 1676 } |
1697 push(new js.LiteralExpression.withData(code, data), node); | 1677 push(new js.LiteralExpression.withData(code, data), node); |
1698 } | 1678 } |
1699 } | 1679 } |
1700 | 1680 |
1701 visitForeignNew(HForeignNew node) { | 1681 visitForeignNew(HForeignNew node) { |
1702 int j = 0; | |
1703 node.element.forEachInstanceField( | |
1704 includeBackendMembers: true, | |
1705 includeSuperMembers: true, | |
1706 f: (ClassElement enclosingClass, Element member) { | |
1707 backend.updateFieldInitializers(member, types[node.inputs[j]]); | |
1708 j++; | |
1709 }); | |
1710 String jsClassReference = backend.namer.isolateAccess(node.element); | 1682 String jsClassReference = backend.namer.isolateAccess(node.element); |
1711 List<HInstruction> inputs = node.inputs; | 1683 List<HInstruction> inputs = node.inputs; |
1712 // We can't use 'visitArguments', since our arguments start at input[0]. | 1684 // We can't use 'visitArguments', since our arguments start at input[0]. |
1713 List<js.Expression> arguments = <js.Expression>[]; | 1685 List<js.Expression> arguments = <js.Expression>[]; |
1714 for (int i = 0; i < inputs.length; i++) { | 1686 for (int i = 0; i < inputs.length; i++) { |
1715 use(inputs[i]); | 1687 use(inputs[i]); |
1716 arguments.add(pop()); | 1688 arguments.add(pop()); |
1717 } | 1689 } |
1718 // TODO(floitsch): jsClassReference is an Access. We shouldn't treat it | 1690 // TODO(floitsch): jsClassReference is an Access. We shouldn't treat it |
1719 // as if it was a string. | 1691 // as if it was a string. |
(...skipping 1269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2989 if (leftType.canBeNull() && rightType.canBeNull()) { | 2961 if (leftType.canBeNull() && rightType.canBeNull()) { |
2990 if (left.isConstantNull() || right.isConstantNull() || | 2962 if (left.isConstantNull() || right.isConstantNull() || |
2991 (leftType.isPrimitive() && leftType == rightType)) { | 2963 (leftType.isPrimitive() && leftType == rightType)) { |
2992 return '=='; | 2964 return '=='; |
2993 } | 2965 } |
2994 return null; | 2966 return null; |
2995 } else { | 2967 } else { |
2996 return '==='; | 2968 return '==='; |
2997 } | 2969 } |
2998 } | 2970 } |
OLD | NEW |