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 1509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1520 } else { | 1520 } else { |
1521 return defaultSelector; | 1521 return defaultSelector; |
1522 } | 1522 } |
1523 } | 1523 } |
1524 | 1524 |
1525 visitInvokeDynamicSetter(HInvokeDynamicSetter node) { | 1525 visitInvokeDynamicSetter(HInvokeDynamicSetter node) { |
1526 use(node.receiver); | 1526 use(node.receiver); |
1527 Selector setter = node.selector; | 1527 Selector setter = node.selector; |
1528 String name = backend.namer.setterName(setter.library, setter.name); | 1528 String name = backend.namer.setterName(setter.library, setter.name); |
1529 push(jsPropertyCall(pop(), name, visitArguments(node.inputs)), node); | 1529 push(jsPropertyCall(pop(), name, visitArguments(node.inputs)), node); |
1530 world.registerDynamicSetter( | 1530 Selector selector = getOptimizedSelectorFor(node, setter); |
1531 setter.name, getOptimizedSelectorFor(node, setter)); | 1531 world.registerDynamicSetter(setter.name, selector); |
1532 backend.addedDynamicSetter(selector, types[node.inputs[1]]); | |
1532 } | 1533 } |
1533 | 1534 |
1534 visitInvokeDynamicGetter(HInvokeDynamicGetter node) { | 1535 visitInvokeDynamicGetter(HInvokeDynamicGetter node) { |
1535 use(node.receiver); | 1536 use(node.receiver); |
1536 Selector getter = node.selector; | 1537 Selector getter = node.selector; |
1537 String name = backend.namer.getterName(getter.library, getter.name); | 1538 String name = backend.namer.getterName(getter.library, getter.name); |
1538 push(jsPropertyCall(pop(), name, visitArguments(node.inputs)), node); | 1539 push(jsPropertyCall(pop(), name, visitArguments(node.inputs)), node); |
1539 world.registerDynamicGetter( | 1540 world.registerDynamicGetter( |
1540 getter.name, getOptimizedSelectorFor(node, getter)); | 1541 getter.name, getOptimizedSelectorFor(node, getter)); |
1541 } | 1542 } |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1630 if (value.guaranteedType.union(HType.NUMBER) == HType.NUMBER) return true; | 1631 if (value.guaranteedType.union(HType.NUMBER) == HType.NUMBER) return true; |
1631 if (value is HBinaryArithmetic) { | 1632 if (value is HBinaryArithmetic) { |
1632 return (isSimpleFieldNumberComputation(value.left, node) && | 1633 return (isSimpleFieldNumberComputation(value.left, node) && |
1633 isSimpleFieldNumberComputation(value.right, node)); | 1634 isSimpleFieldNumberComputation(value.right, node)); |
1634 } | 1635 } |
1635 if (value is HFieldGet) return value.element == node.element; | 1636 if (value is HFieldGet) return value.element == node.element; |
1636 return false; | 1637 return false; |
1637 } | 1638 } |
1638 | 1639 |
1639 visitFieldSet(HFieldSet node) { | 1640 visitFieldSet(HFieldSet node) { |
1640 if (work.element.isGenerativeConstructorBody() && | |
1641 node.element.isMember() && | |
1642 node.value.hasGuaranteedType() && | |
1643 node.block.dominates(currentGraph.exit)) { | |
1644 backend.updateFieldConstructorSetters(node.element, | |
1645 node.value.guaranteedType); | |
1646 } | |
1647 String name = backend.namer.getName(node.element); | 1641 String name = backend.namer.getName(node.element); |
1648 DartType type = types[node.receiver].computeType(compiler); | 1642 DartType type = types[node.receiver].computeType(compiler); |
1649 if (type != null) { | 1643 if (type != null) { |
1644 // Field setters in the generative constructor body are handled in a | |
1645 // separate step in the ssa optimizer. | |
ngeoffray
2012/09/25 21:15:43
Please name the step.
Søren Gjesse
2012/09/27 11:53:40
Done.
| |
1650 if (!work.element.isGenerativeConstructorBody()) { | 1646 if (!work.element.isGenerativeConstructorBody()) { |
1651 world.registerFieldSetter( | 1647 world.registerFieldSetter( |
1652 node.element.name, node.element.getLibrary(), type); | 1648 node.element.name, node.element.getLibrary(), type); |
1653 } | 1649 backend.registerFieldSetter(work.element, node.element, types[node.value ]); |
ngeoffray
2012/09/25 21:15:43
Line too long
Søren Gjesse
2012/09/27 11:53:40
Done.
| |
1654 // Determine the types seen so far for the field. If only number | |
1655 // types have been seen and the value of the field set is a | |
1656 // simple number computation only depending on that field, we | |
1657 // can safely keep the number type for the field. | |
1658 HType fieldSettersType = backend.fieldSettersTypeSoFar(node.element); | |
1659 HType initializersType = | |
1660 backend.typeFromInitializersSoFar(node.element); | |
1661 HType fieldType = fieldSettersType.union(initializersType); | |
1662 if (HType.NUMBER.union(fieldType) == HType.NUMBER && | |
1663 isSimpleFieldNumberComputation(node.value, node)) { | |
1664 backend.updateFieldSetters(node.element, HType.NUMBER); | |
1665 } else { | |
1666 backend.updateFieldSetters(node.element, types[node.value]); | |
1667 } | 1650 } |
1668 } | 1651 } |
1669 use(node.receiver); | 1652 use(node.receiver); |
1670 js.Expression receiver = pop(); | 1653 js.Expression receiver = pop(); |
1671 use(node.value); | 1654 use(node.value); |
1672 push(new js.Assignment(new js.PropertyAccess.field(receiver, name), pop()), | 1655 push(new js.Assignment(new js.PropertyAccess.field(receiver, name), pop()), |
1673 node); | 1656 node); |
1674 } | 1657 } |
1675 | 1658 |
1676 visitLocalGet(HLocalGet node) { | 1659 visitLocalGet(HLocalGet node) { |
(...skipping 18 matching lines...) Expand all Loading... | |
1695 List<js.Expression> data = <js.Expression>[]; | 1678 List<js.Expression> data = <js.Expression>[]; |
1696 for (int i = 0; i < inputs.length; i++) { | 1679 for (int i = 0; i < inputs.length; i++) { |
1697 use(inputs[i]); | 1680 use(inputs[i]); |
1698 data.add(pop()); | 1681 data.add(pop()); |
1699 } | 1682 } |
1700 push(new js.LiteralExpression.withData(code, data), node); | 1683 push(new js.LiteralExpression.withData(code, data), node); |
1701 } | 1684 } |
1702 } | 1685 } |
1703 | 1686 |
1704 visitForeignNew(HForeignNew node) { | 1687 visitForeignNew(HForeignNew node) { |
1705 int j = 0; | |
1706 node.element.forEachInstanceField( | |
1707 includeBackendMembers: true, | |
1708 includeSuperMembers: true, | |
1709 f: (ClassElement enclosingClass, Element member) { | |
1710 backend.updateFieldInitializers(member, types[node.inputs[j]]); | |
1711 j++; | |
1712 }); | |
1713 String jsClassReference = backend.namer.isolateAccess(node.element); | 1688 String jsClassReference = backend.namer.isolateAccess(node.element); |
1714 List<HInstruction> inputs = node.inputs; | 1689 List<HInstruction> inputs = node.inputs; |
1715 // We can't use 'visitArguments', since our arguments start at input[0]. | 1690 // We can't use 'visitArguments', since our arguments start at input[0]. |
1716 List<js.Expression> arguments = <js.Expression>[]; | 1691 List<js.Expression> arguments = <js.Expression>[]; |
1717 for (int i = 0; i < inputs.length; i++) { | 1692 for (int i = 0; i < inputs.length; i++) { |
1718 use(inputs[i]); | 1693 use(inputs[i]); |
1719 arguments.add(pop()); | 1694 arguments.add(pop()); |
1720 } | 1695 } |
1721 // TODO(floitsch): jsClassReference is an Access. We shouldn't treat it | 1696 // TODO(floitsch): jsClassReference is an Access. We shouldn't treat it |
1722 // as if it was a string. | 1697 // as if it was a string. |
(...skipping 1271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2994 if (leftType.canBeNull() && rightType.canBeNull()) { | 2969 if (leftType.canBeNull() && rightType.canBeNull()) { |
2995 if (left.isConstantNull() || right.isConstantNull() || | 2970 if (left.isConstantNull() || right.isConstantNull() || |
2996 (leftType.isPrimitive() && leftType == rightType)) { | 2971 (leftType.isPrimitive() && leftType == rightType)) { |
2997 return '=='; | 2972 return '=='; |
2998 } | 2973 } |
2999 return null; | 2974 return null; |
3000 } else { | 2975 } else { |
3001 return '==='; | 2976 return '==='; |
3002 } | 2977 } |
3003 } | 2978 } |
OLD | NEW |