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 part of ssa; | 5 part of ssa; |
6 | 6 |
7 class SsaCodeGeneratorTask extends CompilerTask { | 7 class SsaCodeGeneratorTask extends CompilerTask { |
8 | 8 |
9 final JavaScriptBackend backend; | 9 final JavaScriptBackend backend; |
10 final SourceInformationStrategy sourceInformationFactory; | 10 final SourceInformationStrategy sourceInformationFactory; |
(...skipping 1626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1637 // If we don't know what we're calling or if we are calling a getter, | 1637 // If we don't know what we're calling or if we are calling a getter, |
1638 // we need to register that fact that we may be calling a closure | 1638 // we need to register that fact that we may be calling a closure |
1639 // with the same arguments. | 1639 // with the same arguments. |
1640 Element target = node.element; | 1640 Element target = node.element; |
1641 if (target == null || target.isGetter) { | 1641 if (target == null || target.isGetter) { |
1642 // TODO(kasperl): If we have a typed selector for the call, we | 1642 // TODO(kasperl): If we have a typed selector for the call, we |
1643 // may know something about the types of closures that need | 1643 // may know something about the types of closures that need |
1644 // the specific closure call method. | 1644 // the specific closure call method. |
1645 Selector call = new Selector.callClosureFrom(selector); | 1645 Selector call = new Selector.callClosureFrom(selector); |
1646 registry.registerDynamicUse( | 1646 registry.registerDynamicUse( |
1647 new UniverseSelector(call, null)); | 1647 new DynamicUse(call, null)); |
1648 } | 1648 } |
1649 registry.registerDynamicUse( | 1649 registry.registerDynamicUse( |
1650 new UniverseSelector(selector, mask)); | 1650 new DynamicUse(selector, mask)); |
1651 } | 1651 } |
1652 | 1652 |
1653 void registerSetter(HInvokeDynamic node) { | 1653 void registerSetter(HInvokeDynamic node) { |
1654 Selector selector = node.selector; | 1654 Selector selector = node.selector; |
1655 TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); | 1655 TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); |
1656 registry.registerDynamicUse( | 1656 registry.registerDynamicUse( |
1657 new UniverseSelector(selector, mask)); | 1657 new DynamicUse(selector, mask)); |
1658 } | 1658 } |
1659 | 1659 |
1660 void registerGetter(HInvokeDynamic node) { | 1660 void registerGetter(HInvokeDynamic node) { |
1661 Selector selector = node.selector; | 1661 Selector selector = node.selector; |
1662 TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); | 1662 TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); |
1663 registry.registerDynamicUse( | 1663 registry.registerDynamicUse( |
1664 new UniverseSelector(selector, mask)); | 1664 new DynamicUse(selector, mask)); |
1665 } | 1665 } |
1666 | 1666 |
1667 visitInvokeDynamicSetter(HInvokeDynamicSetter node) { | 1667 visitInvokeDynamicSetter(HInvokeDynamicSetter node) { |
1668 use(node.receiver); | 1668 use(node.receiver); |
1669 js.Name name = backend.namer.invocationName(node.selector); | 1669 js.Name name = backend.namer.invocationName(node.selector); |
1670 push(js.propertyCall(pop(), name, visitArguments(node.inputs)) | 1670 push(js.propertyCall(pop(), name, visitArguments(node.inputs)) |
1671 .withSourceInformation(node.sourceInformation)); | 1671 .withSourceInformation(node.sourceInformation)); |
1672 registerSetter(node); | 1672 registerSetter(node); |
1673 } | 1673 } |
1674 | 1674 |
1675 visitInvokeDynamicGetter(HInvokeDynamicGetter node) { | 1675 visitInvokeDynamicGetter(HInvokeDynamicGetter node) { |
1676 use(node.receiver); | 1676 use(node.receiver); |
1677 js.Name name = backend.namer.invocationName(node.selector); | 1677 js.Name name = backend.namer.invocationName(node.selector); |
1678 push(js.propertyCall(pop(), name, visitArguments(node.inputs)) | 1678 push(js.propertyCall(pop(), name, visitArguments(node.inputs)) |
1679 .withSourceInformation(node.sourceInformation)); | 1679 .withSourceInformation(node.sourceInformation)); |
1680 registerGetter(node); | 1680 registerGetter(node); |
1681 } | 1681 } |
1682 | 1682 |
1683 visitInvokeClosure(HInvokeClosure node) { | 1683 visitInvokeClosure(HInvokeClosure node) { |
1684 Selector call = new Selector.callClosureFrom(node.selector); | 1684 Selector call = new Selector.callClosureFrom(node.selector); |
1685 use(node.receiver); | 1685 use(node.receiver); |
1686 push(js.propertyCall(pop(), | 1686 push(js.propertyCall(pop(), |
1687 backend.namer.invocationName(call), | 1687 backend.namer.invocationName(call), |
1688 visitArguments(node.inputs)) | 1688 visitArguments(node.inputs)) |
1689 .withSourceInformation(node.sourceInformation)); | 1689 .withSourceInformation(node.sourceInformation)); |
1690 registry.registerDynamicUse( | 1690 registry.registerDynamicUse( |
1691 new UniverseSelector(call, null)); | 1691 new DynamicUse(call, null)); |
1692 } | 1692 } |
1693 | 1693 |
1694 visitInvokeStatic(HInvokeStatic node) { | 1694 visitInvokeStatic(HInvokeStatic node) { |
1695 Element element = node.element; | 1695 Element element = node.element; |
1696 List<DartType> instantiatedTypes = node.instantiatedTypes; | 1696 List<DartType> instantiatedTypes = node.instantiatedTypes; |
1697 | 1697 |
1698 if (instantiatedTypes != null && !instantiatedTypes.isEmpty) { | 1698 if (instantiatedTypes != null && !instantiatedTypes.isEmpty) { |
1699 instantiatedTypes.forEach((type) { | 1699 instantiatedTypes.forEach((type) { |
1700 registry.registerInstantiation(type); | 1700 registry.registerInstantiation(type); |
1701 }); | 1701 }); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1768 // [world]. The emitter needs to know if it needs to emit a | 1768 // [world]. The emitter needs to know if it needs to emit a |
1769 // bound closure for a method. | 1769 // bound closure for a method. |
1770 | 1770 |
1771 // If [superMethod] is mixed in, [superClass] might not be live. | 1771 // If [superMethod] is mixed in, [superClass] might not be live. |
1772 // We use the superclass of the access instead. | 1772 // We use the superclass of the access instead. |
1773 TypeMask receiverType = | 1773 TypeMask receiverType = |
1774 new TypeMask.nonNullExact(node.caller.superclass, compiler.world); | 1774 new TypeMask.nonNullExact(node.caller.superclass, compiler.world); |
1775 // TODO(floitsch): we know the target. We shouldn't register a | 1775 // TODO(floitsch): we know the target. We shouldn't register a |
1776 // dynamic getter. | 1776 // dynamic getter. |
1777 registry.registerDynamicUse( | 1777 registry.registerDynamicUse( |
1778 new UniverseSelector(selector, receiverType)); | 1778 new DynamicUse(selector, receiverType)); |
1779 if (superElement.isFunction) { | 1779 if (superElement.isFunction) { |
1780 registry.registerStaticUse( | 1780 registry.registerStaticUse( |
1781 new StaticUse.superTearOff(superElement)); | 1781 new StaticUse.superTearOff(superElement)); |
1782 } | 1782 } |
1783 methodName = backend.namer.invocationName(selector); | 1783 methodName = backend.namer.invocationName(selector); |
1784 } else { | 1784 } else { |
1785 assert(invariant(node, compiler.hasIncrementalSupport)); | 1785 assert(invariant(node, compiler.hasIncrementalSupport)); |
1786 methodName = backend.namer.instanceMethodName(superElement); | 1786 methodName = backend.namer.instanceMethodName(superElement); |
1787 } | 1787 } |
1788 registry.registerStaticUse( | 1788 registry.registerStaticUse( |
(...skipping 1129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2918 new StaticUse.staticInvoke(helper, | 2918 new StaticUse.staticInvoke(helper, |
2919 new CallStructure.unnamed(argumentCount))); | 2919 new CallStructure.unnamed(argumentCount))); |
2920 return backend.emitter.staticFunctionAccess(helper); | 2920 return backend.emitter.staticFunctionAccess(helper); |
2921 } | 2921 } |
2922 | 2922 |
2923 @override | 2923 @override |
2924 void visitRef(HRef node) { | 2924 void visitRef(HRef node) { |
2925 visit(node.value); | 2925 visit(node.value); |
2926 } | 2926 } |
2927 } | 2927 } |
OLD | NEW |