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

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

Issue 1182053010: Revert "Split TypedSelector into Selector and TypeMask." (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 6 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
« no previous file with comments | « pkg/compiler/lib/src/ssa/builder.dart ('k') | pkg/compiler/lib/src/ssa/codegen_helpers.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 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 SourceInformationFactory sourceInformationFactory; 10 final SourceInformationFactory sourceInformationFactory;
(...skipping 1532 matching lines...) Expand 10 before | Expand all | Expand 10 after
1543 String methodName = backend.namer.instanceMethodName(node.element); 1543 String methodName = backend.namer.instanceMethodName(node.element);
1544 List<js.Expression> arguments = visitArguments(node.inputs); 1544 List<js.Expression> arguments = visitArguments(node.inputs);
1545 push(js.propertyCall(object, methodName, arguments), node); 1545 push(js.propertyCall(object, methodName, arguments), node);
1546 registry.registerStaticUse(node.element); 1546 registry.registerStaticUse(node.element);
1547 } 1547 }
1548 1548
1549 void visitOneShotInterceptor(HOneShotInterceptor node) { 1549 void visitOneShotInterceptor(HOneShotInterceptor node) {
1550 List<js.Expression> arguments = visitArguments(node.inputs); 1550 List<js.Expression> arguments = visitArguments(node.inputs);
1551 var isolate = new js.VariableUse( 1551 var isolate = new js.VariableUse(
1552 backend.namer.globalObjectFor(backend.interceptorsLibrary)); 1552 backend.namer.globalObjectFor(backend.interceptorsLibrary));
1553 Selector selector = node.selector; 1553 Selector selector = getOptimizedSelectorFor(node, node.selector);
1554 TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask);
1555 String methodName = backend.registerOneShotInterceptor(selector); 1554 String methodName = backend.registerOneShotInterceptor(selector);
1556 push(js.propertyCall(isolate, methodName, arguments), node); 1555 push(js.propertyCall(isolate, methodName, arguments), node);
1557 if (selector.isGetter) { 1556 if (selector.isGetter) {
1558 registerGetter(node); 1557 registerGetter(node);
1559 } else if (selector.isSetter) { 1558 } else if (selector.isSetter) {
1560 registerSetter(node); 1559 registerSetter(node);
1561 } else { 1560 } else {
1562 registerMethodInvoke(node); 1561 registerMethodInvoke(node);
1563 } 1562 }
1564 registry.registerUseInterceptor(); 1563 registry.registerUseInterceptor();
1565 } 1564 }
1566 1565
1567 TypeMask getOptimizedSelectorFor(HInvokeDynamic node, 1566 Selector getOptimizedSelectorFor(HInvokeDynamic node, Selector selector) {
1568 Selector selector,
1569 TypeMask mask) {
1570 if (node.element != null) { 1567 if (node.element != null) {
1571 // Create an artificial type mask to make sure only 1568 // Create an artificial type mask to make sure only
1572 // [node.element] will be enqueued. We're not using the receiver 1569 // [node.element] will be enqueued. We're not using the receiver
1573 // type because our optimizations might end up in a state where the 1570 // type because our optimizations might end up in a state where the
1574 // invoke dynamic knows more than the receiver. 1571 // invoke dynamic knows more than the receiver.
1575 ClassElement enclosing = node.element.enclosingClass; 1572 ClassElement enclosing = node.element.enclosingClass;
1576 return 1573 TypeMask receiverType =
1577 new TypeMask.nonNullExact(enclosing.declaration, compiler.world); 1574 new TypeMask.nonNullExact(enclosing.declaration, compiler.world);
1575 return new TypedSelector(receiverType, selector, compiler.world);
1578 } 1576 }
1579 // If [JSInvocationMirror._invokeOn] is enabled, and this call 1577 // If [JSInvocationMirror._invokeOn] is enabled, and this call
1580 // might hit a `noSuchMethod`, we register an untyped selector. 1578 // might hit a `noSuchMethod`, we register an untyped selector.
1581 return compiler.world.extendMaskIfReachesAll(selector, mask); 1579 return selector.extendIfReachesAll(compiler);
1582 } 1580 }
1583 1581
1584 void registerMethodInvoke(HInvokeDynamic node) { 1582 void registerMethodInvoke(HInvokeDynamic node) {
1585 Selector selector = node.selector; 1583 Selector selector = getOptimizedSelectorFor(node, node.selector);
1586 TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask);
1587 1584
1588 // If we don't know what we're calling or if we are calling a getter, 1585 // If we don't know what we're calling or if we are calling a getter,
1589 // we need to register that fact that we may be calling a closure 1586 // we need to register that fact that we may be calling a closure
1590 // with the same arguments. 1587 // with the same arguments.
1591 Element target = node.element; 1588 Element target = node.element;
1592 if (target == null || target.isGetter) { 1589 if (target == null || target.isGetter) {
1593 // TODO(kasperl): If we have a typed selector for the call, we 1590 // TODO(kasperl): If we have a typed selector for the call, we
1594 // may know something about the types of closures that need 1591 // may know something about the types of closures that need
1595 // the specific closure call method. 1592 // the specific closure call method.
1596 Selector call = new Selector.callClosureFrom(selector); 1593 Selector call = new Selector.callClosureFrom(selector);
1597 registry.registerDynamicInvocation( 1594 registry.registerDynamicInvocation(call);
1598 new UniverseSelector(call, null));
1599 } 1595 }
1600 registry.registerDynamicInvocation( 1596 registry.registerDynamicInvocation(selector);
1601 new UniverseSelector(selector, mask));
1602 } 1597 }
1603 1598
1604 void registerSetter(HInvokeDynamic node) { 1599 void registerSetter(HInvokeDynamic node) {
1605 Selector selector = node.selector; 1600 Selector selector = getOptimizedSelectorFor(node, node.selector);
1606 TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); 1601 registry.registerDynamicSetter(selector);
1607 registry.registerDynamicSetter(
1608 new UniverseSelector(selector, mask));
1609 } 1602 }
1610 1603
1611 void registerGetter(HInvokeDynamic node) { 1604 void registerGetter(HInvokeDynamic node) {
1612 Selector selector = node.selector; 1605 Selector selector = getOptimizedSelectorFor(node, node.selector);
1613 TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask); 1606 registry.registerDynamicGetter(selector);
1614 registry.registerDynamicGetter(
1615 new UniverseSelector(selector, mask));
1616 } 1607 }
1617 1608
1618 visitInvokeDynamicSetter(HInvokeDynamicSetter node) { 1609 visitInvokeDynamicSetter(HInvokeDynamicSetter node) {
1619 use(node.receiver); 1610 use(node.receiver);
1620 String name = backend.namer.invocationName(node.selector); 1611 String name = backend.namer.invocationName(node.selector);
1621 push(js.propertyCall(pop(), name, visitArguments(node.inputs)), node); 1612 push(js.propertyCall(pop(), name, visitArguments(node.inputs)), node);
1622 registerSetter(node); 1613 registerSetter(node);
1623 } 1614 }
1624 1615
1625 visitInvokeDynamicGetter(HInvokeDynamicGetter node) { 1616 visitInvokeDynamicGetter(HInvokeDynamicGetter node) {
1626 use(node.receiver); 1617 use(node.receiver);
1627 String name = backend.namer.invocationName(node.selector); 1618 String name = backend.namer.invocationName(node.selector);
1628 push(js.propertyCall(pop(), name, visitArguments(node.inputs)), node); 1619 push(js.propertyCall(pop(), name, visitArguments(node.inputs)), node);
1629 registerGetter(node); 1620 registerGetter(node);
1630 } 1621 }
1631 1622
1632 visitInvokeClosure(HInvokeClosure node) { 1623 visitInvokeClosure(HInvokeClosure node) {
1633 Selector call = new Selector.callClosureFrom(node.selector); 1624 Selector call = new Selector.callClosureFrom(node.selector);
1634 use(node.receiver); 1625 use(node.receiver);
1635 push(js.propertyCall(pop(), 1626 push(js.propertyCall(pop(),
1636 backend.namer.invocationName(call), 1627 backend.namer.invocationName(call),
1637 visitArguments(node.inputs)), 1628 visitArguments(node.inputs)),
1638 node); 1629 node);
1639 registry.registerDynamicInvocation( 1630 registry.registerDynamicInvocation(call);
1640 new UniverseSelector(call, null));
1641 } 1631 }
1642 1632
1643 visitInvokeStatic(HInvokeStatic node) { 1633 visitInvokeStatic(HInvokeStatic node) {
1644 Element element = node.element; 1634 Element element = node.element;
1645 List<DartType> instantiatedTypes = node.instantiatedTypes; 1635 List<DartType> instantiatedTypes = node.instantiatedTypes;
1646 1636
1647 if (instantiatedTypes != null && !instantiatedTypes.isEmpty) { 1637 if (instantiatedTypes != null && !instantiatedTypes.isEmpty) {
1648 instantiatedTypes.forEach((type) { 1638 instantiatedTypes.forEach((type) {
1649 registry.registerInstantiatedType(type); 1639 registry.registerInstantiatedType(type);
1650 }); 1640 });
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1701 Selector selector = node.selector; 1691 Selector selector = node.selector;
1702 1692
1703 if (!backend.maybeRegisterAliasedSuperMember(superMethod, selector)) { 1693 if (!backend.maybeRegisterAliasedSuperMember(superMethod, selector)) {
1704 String methodName; 1694 String methodName;
1705 if (selector.isGetter) { 1695 if (selector.isGetter) {
1706 // If the selector we need to register a typed getter to the 1696 // If the selector we need to register a typed getter to the
1707 // [world]. The emitter needs to know if it needs to emit a 1697 // [world]. The emitter needs to know if it needs to emit a
1708 // bound closure for a method. 1698 // bound closure for a method.
1709 TypeMask receiverType = 1699 TypeMask receiverType =
1710 new TypeMask.nonNullExact(superClass, compiler.world); 1700 new TypeMask.nonNullExact(superClass, compiler.world);
1701 selector = new TypedSelector(receiverType, selector, compiler.world);
1711 // TODO(floitsch): we know the target. We shouldn't register a 1702 // TODO(floitsch): we know the target. We shouldn't register a
1712 // dynamic getter. 1703 // dynamic getter.
1713 registry.registerDynamicGetter( 1704 registry.registerDynamicGetter(selector);
1714 new UniverseSelector(selector, receiverType));
1715 registry.registerGetterForSuperMethod(node.element); 1705 registry.registerGetterForSuperMethod(node.element);
1716 methodName = backend.namer.invocationName(selector); 1706 methodName = backend.namer.invocationName(selector);
1717 } else { 1707 } else {
1718 assert(invariant(node, compiler.hasIncrementalSupport)); 1708 assert(invariant(node, compiler.hasIncrementalSupport));
1719 methodName = backend.namer.instanceMethodName(superMethod); 1709 methodName = backend.namer.instanceMethodName(superMethod);
1720 } 1710 }
1721 push(js.js('#.#.call(#)', 1711 push(js.js('#.#.call(#)',
1722 [backend.emitter.prototypeAccess(superClass, 1712 [backend.emitter.prototypeAccess(superClass,
1723 hasBeenInstantiated: true), 1713 hasBeenInstantiated: true),
1724 methodName, visitArguments(node.inputs, start: 0)]), 1714 methodName, visitArguments(node.inputs, start: 0)]),
(...skipping 1010 matching lines...) Expand 10 before | Expand all | Expand 10 after
2735 js.PropertyAccess accessHelper(String name) { 2725 js.PropertyAccess accessHelper(String name) {
2736 Element helper = backend.findHelper(name); 2726 Element helper = backend.findHelper(name);
2737 if (helper == null) { 2727 if (helper == null) {
2738 // For mocked-up tests. 2728 // For mocked-up tests.
2739 return js.js('(void 0).$name'); 2729 return js.js('(void 0).$name');
2740 } 2730 }
2741 registry.registerStaticUse(helper); 2731 registry.registerStaticUse(helper);
2742 return backend.emitter.staticFunctionAccess(helper); 2732 return backend.emitter.staticFunctionAccess(helper);
2743 } 2733 }
2744 } 2734 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/ssa/builder.dart ('k') | pkg/compiler/lib/src/ssa/codegen_helpers.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698