Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(324)

Side by Side Diff: pkg/compiler/lib/src/ssa/codegen.dart

Issue 2423953002: Change TypeInference to handle super calls as direct invocations. (Closed)
Patch Set: Fix comment. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698