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 import '../common.dart'; | 5 import '../common.dart'; |
6 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; | 6 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; |
7 import '../common/tasks.dart' show CompilerTask; | 7 import '../common/tasks.dart' show CompilerTask; |
8 import '../compiler.dart' show Compiler; | 8 import '../compiler.dart' show Compiler; |
9 import '../constants/constant_system.dart'; | 9 import '../constants/constant_system.dart'; |
10 import '../constants/values.dart'; | 10 import '../constants/values.dart'; |
(...skipping 1658 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1669 enclosing.declaration, compiler.closedWorld); | 1669 enclosing.declaration, compiler.closedWorld); |
1670 } | 1670 } |
1671 } | 1671 } |
1672 // If [JSInvocationMirror._invokeOn] is enabled, and this call | 1672 // If [JSInvocationMirror._invokeOn] is enabled, and this call |
1673 // might hit a `noSuchMethod`, we register an untyped selector. | 1673 // might hit a `noSuchMethod`, we register an untyped selector. |
1674 return compiler.closedWorld.extendMaskIfReachesAll(selector, mask); | 1674 return compiler.closedWorld.extendMaskIfReachesAll(selector, mask); |
1675 } | 1675 } |
1676 | 1676 |
1677 void registerMethodInvoke(HInvokeDynamic node) { | 1677 void registerMethodInvoke(HInvokeDynamic node) { |
1678 Selector selector = node.selector; | 1678 Selector selector = node.selector; |
1679 TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); | |
1680 | 1679 |
1681 // If we don't know what we're calling or if we are calling a getter, | 1680 // If we don't know what we're calling or if we are calling a getter, |
1682 // we need to register that fact that we may be calling a closure | 1681 // we need to register that fact that we may be calling a closure |
1683 // with the same arguments. | 1682 // with the same arguments. |
1684 Element target = node.element; | 1683 Element target = node.element; |
1685 if (target == null || target.isGetter) { | 1684 if (target == null || target.isGetter) { |
1686 // TODO(kasperl): If we have a typed selector for the call, we | 1685 // TODO(kasperl): If we have a typed selector for the call, we |
1687 // may know something about the types of closures that need | 1686 // may know something about the types of closures that need |
1688 // the specific closure call method. | 1687 // the specific closure call method. |
1689 Selector call = new Selector.callClosureFrom(selector); | 1688 Selector call = new Selector.callClosureFrom(selector); |
1690 registry.registerDynamicUse(new DynamicUse(call, null)); | 1689 registry.registerDynamicUse(new DynamicUse(call, null)); |
1691 } | 1690 } |
1692 registry.registerDynamicUse(new DynamicUse(selector, mask)); | 1691 if (target != null) { |
1692 assert(invariant(node, selector.applies(target), | |
1693 message: '$selector does not apply to $target')); | |
1694 registry.registerStaticUse( | |
1695 new StaticUse.directInvoke(target, selector.callStructure)); | |
Siggi Cherem (dart-lang)
2016/10/17 19:55:36
I'm guessing this is a nSM? Maybe document it as s
Johnni Winther
2016/10/18 07:46:27
No. This is a dynamic invocation which we have fou
| |
1696 } else { | |
1697 TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); | |
1698 registry.registerDynamicUse(new DynamicUse(selector, mask)); | |
1699 } | |
1693 } | 1700 } |
1694 | 1701 |
1695 void registerSetter(HInvokeDynamic node) { | 1702 void registerSetter(HInvokeDynamic node) { |
1696 Selector selector = node.selector; | 1703 if (node.element != null) { |
Siggi Cherem (dart-lang)
2016/10/17 19:55:36
same here and below?
Johnni Winther
2016/10/18 07:46:27
Added comment.
| |
1697 TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); | 1704 registry.registerStaticUse(new StaticUse.directSet(node.element)); |
1698 registry.registerDynamicUse(new DynamicUse(selector, mask)); | 1705 } else { |
1706 Selector selector = node.selector; | |
1707 TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); | |
1708 registry.registerDynamicUse(new DynamicUse(selector, mask)); | |
1709 } | |
1699 } | 1710 } |
1700 | 1711 |
1701 void registerGetter(HInvokeDynamic node) { | 1712 void registerGetter(HInvokeDynamic node) { |
1702 Selector selector = node.selector; | 1713 if (node.element != null) { |
1703 TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); | 1714 registry.registerStaticUse(new StaticUse.directGet(node.element)); |
1704 registry.registerDynamicUse(new DynamicUse(selector, mask)); | 1715 } else { |
1716 Selector selector = node.selector; | |
1717 TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); | |
1718 registry.registerDynamicUse(new DynamicUse(selector, mask)); | |
1719 } | |
1705 } | 1720 } |
1706 | 1721 |
1707 visitInvokeDynamicSetter(HInvokeDynamicSetter node) { | 1722 visitInvokeDynamicSetter(HInvokeDynamicSetter node) { |
1708 use(node.receiver); | 1723 use(node.receiver); |
1709 js.Name name = backend.namer.invocationName(node.selector); | 1724 js.Name name = backend.namer.invocationName(node.selector); |
1710 push(js | 1725 push(js |
1711 .propertyCall(pop(), name, visitArguments(node.inputs)) | 1726 .propertyCall(pop(), name, visitArguments(node.inputs)) |
1712 .withSourceInformation(node.sourceInformation)); | 1727 .withSourceInformation(node.sourceInformation)); |
1713 registerSetter(node); | 1728 registerSetter(node); |
1714 } | 1729 } |
(...skipping 1284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2999 registry.registerStaticUse(new StaticUse.staticInvoke( | 3014 registry.registerStaticUse(new StaticUse.staticInvoke( |
3000 helper, new CallStructure.unnamed(argumentCount))); | 3015 helper, new CallStructure.unnamed(argumentCount))); |
3001 return backend.emitter.staticFunctionAccess(helper); | 3016 return backend.emitter.staticFunctionAccess(helper); |
3002 } | 3017 } |
3003 | 3018 |
3004 @override | 3019 @override |
3005 void visitRef(HRef node) { | 3020 void visitRef(HRef node) { |
3006 visit(node.value); | 3021 visit(node.value); |
3007 } | 3022 } |
3008 } | 3023 } |
OLD | NEW |