Chromium Code Reviews| Index: pkg/compiler/lib/src/ssa/codegen.dart |
| diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart |
| index e677afdb4cb834933083c2f7a5b7aad5195631f7..beaa2ccdda4816093c2763730ec1fcf787bdff68 100644 |
| --- a/pkg/compiler/lib/src/ssa/codegen.dart |
| +++ b/pkg/compiler/lib/src/ssa/codegen.dart |
| @@ -1676,7 +1676,6 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
| void registerMethodInvoke(HInvokeDynamic node) { |
| Selector selector = node.selector; |
| - TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); |
| // If we don't know what we're calling or if we are calling a getter, |
| // we need to register that fact that we may be calling a closure |
| @@ -1689,19 +1688,35 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
| Selector call = new Selector.callClosureFrom(selector); |
| registry.registerDynamicUse(new DynamicUse(call, null)); |
| } |
| - registry.registerDynamicUse(new DynamicUse(selector, mask)); |
| + if (target != null) { |
| + assert(invariant(node, selector.applies(target), |
| + message: '$selector does not apply to $target')); |
| + registry.registerStaticUse( |
| + 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
|
| + } else { |
| + TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); |
| + registry.registerDynamicUse(new DynamicUse(selector, mask)); |
| + } |
| } |
| void registerSetter(HInvokeDynamic node) { |
| - Selector selector = node.selector; |
| - TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); |
| - registry.registerDynamicUse(new DynamicUse(selector, mask)); |
| + 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.
|
| + registry.registerStaticUse(new StaticUse.directSet(node.element)); |
| + } else { |
| + Selector selector = node.selector; |
| + TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); |
| + registry.registerDynamicUse(new DynamicUse(selector, mask)); |
| + } |
| } |
| void registerGetter(HInvokeDynamic node) { |
| - Selector selector = node.selector; |
| - TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); |
| - registry.registerDynamicUse(new DynamicUse(selector, mask)); |
| + if (node.element != null) { |
| + registry.registerStaticUse(new StaticUse.directGet(node.element)); |
| + } else { |
| + Selector selector = node.selector; |
| + TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); |
| + registry.registerDynamicUse(new DynamicUse(selector, mask)); |
| + } |
| } |
| visitInvokeDynamicSetter(HInvokeDynamicSetter node) { |