| 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 b26464f5e344e9f31377fa5a55d7a173afa70c78..1c2443bb708a7d84f3b94597b07f61ea03e925a2 100644
|
| --- a/pkg/compiler/lib/src/ssa/codegen.dart
|
| +++ b/pkg/compiler/lib/src/ssa/codegen.dart
|
| @@ -1550,8 +1550,7 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
|
| List<js.Expression> arguments = visitArguments(node.inputs);
|
| var isolate = new js.VariableUse(
|
| backend.namer.globalObjectFor(backend.interceptorsLibrary));
|
| - Selector selector = node.selector;
|
| - TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask);
|
| + Selector selector = getOptimizedSelectorFor(node, node.selector);
|
| String methodName = backend.registerOneShotInterceptor(selector);
|
| push(js.propertyCall(isolate, methodName, arguments), node);
|
| if (selector.isGetter) {
|
| @@ -1564,26 +1563,24 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
|
| registry.registerUseInterceptor();
|
| }
|
|
|
| - TypeMask getOptimizedSelectorFor(HInvokeDynamic node,
|
| - Selector selector,
|
| - TypeMask mask) {
|
| + Selector getOptimizedSelectorFor(HInvokeDynamic node, Selector selector) {
|
| if (node.element != null) {
|
| // Create an artificial type mask to make sure only
|
| // [node.element] will be enqueued. We're not using the receiver
|
| // type because our optimizations might end up in a state where the
|
| // invoke dynamic knows more than the receiver.
|
| ClassElement enclosing = node.element.enclosingClass;
|
| - return
|
| + TypeMask receiverType =
|
| new TypeMask.nonNullExact(enclosing.declaration, compiler.world);
|
| + return new TypedSelector(receiverType, selector, compiler.world);
|
| }
|
| // If [JSInvocationMirror._invokeOn] is enabled, and this call
|
| // might hit a `noSuchMethod`, we register an untyped selector.
|
| - return compiler.world.extendMaskIfReachesAll(selector, mask);
|
| + return selector.extendIfReachesAll(compiler);
|
| }
|
|
|
| void registerMethodInvoke(HInvokeDynamic node) {
|
| - Selector selector = node.selector;
|
| - TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask);
|
| + Selector selector = getOptimizedSelectorFor(node, node.selector);
|
|
|
| // 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
|
| @@ -1594,25 +1591,19 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
|
| // may know something about the types of closures that need
|
| // the specific closure call method.
|
| Selector call = new Selector.callClosureFrom(selector);
|
| - registry.registerDynamicInvocation(
|
| - new UniverseSelector(call, null));
|
| + registry.registerDynamicInvocation(call);
|
| }
|
| - registry.registerDynamicInvocation(
|
| - new UniverseSelector(selector, mask));
|
| + registry.registerDynamicInvocation(selector);
|
| }
|
|
|
| void registerSetter(HInvokeDynamic node) {
|
| - Selector selector = node.selector;
|
| - TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask);
|
| - registry.registerDynamicSetter(
|
| - new UniverseSelector(selector, mask));
|
| + Selector selector = getOptimizedSelectorFor(node, node.selector);
|
| + registry.registerDynamicSetter(selector);
|
| }
|
|
|
| void registerGetter(HInvokeDynamic node) {
|
| - Selector selector = node.selector;
|
| - TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask);
|
| - registry.registerDynamicGetter(
|
| - new UniverseSelector(selector, mask));
|
| + Selector selector = getOptimizedSelectorFor(node, node.selector);
|
| + registry.registerDynamicGetter(selector);
|
| }
|
|
|
| visitInvokeDynamicSetter(HInvokeDynamicSetter node) {
|
| @@ -1636,8 +1627,7 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
|
| backend.namer.invocationName(call),
|
| visitArguments(node.inputs)),
|
| node);
|
| - registry.registerDynamicInvocation(
|
| - new UniverseSelector(call, null));
|
| + registry.registerDynamicInvocation(call);
|
| }
|
|
|
| visitInvokeStatic(HInvokeStatic node) {
|
| @@ -1708,10 +1698,10 @@ class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
|
| // bound closure for a method.
|
| TypeMask receiverType =
|
| new TypeMask.nonNullExact(superClass, compiler.world);
|
| + selector = new TypedSelector(receiverType, selector, compiler.world);
|
| // TODO(floitsch): we know the target. We shouldn't register a
|
| // dynamic getter.
|
| - registry.registerDynamicGetter(
|
| - new UniverseSelector(selector, receiverType));
|
| + registry.registerDynamicGetter(selector);
|
| registry.registerGetterForSuperMethod(node.element);
|
| methodName = backend.namer.invocationName(selector);
|
| } else {
|
|
|