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

Side by Side Diff: lib/compiler/implementation/ssa/codegen.dart

Issue 10964016: Change the type inference for fields in dart2js (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Rebased to r12709 Created 8 years, 3 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 | Annotate | Revision Log
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 class SsaCodeGeneratorTask extends CompilerTask { 5 class SsaCodeGeneratorTask extends CompilerTask {
6 6
7 final JavaScriptBackend backend; 7 final JavaScriptBackend backend;
8 8
9 SsaCodeGeneratorTask(JavaScriptBackend backend) 9 SsaCodeGeneratorTask(JavaScriptBackend backend)
10 : this.backend = backend, 10 : this.backend = backend,
(...skipping 1509 matching lines...) Expand 10 before | Expand all | Expand 10 after
1520 } else { 1520 } else {
1521 return defaultSelector; 1521 return defaultSelector;
1522 } 1522 }
1523 } 1523 }
1524 1524
1525 visitInvokeDynamicSetter(HInvokeDynamicSetter node) { 1525 visitInvokeDynamicSetter(HInvokeDynamicSetter node) {
1526 use(node.receiver); 1526 use(node.receiver);
1527 Selector setter = node.selector; 1527 Selector setter = node.selector;
1528 String name = backend.namer.setterName(setter.library, setter.name); 1528 String name = backend.namer.setterName(setter.library, setter.name);
1529 push(jsPropertyCall(pop(), name, visitArguments(node.inputs)), node); 1529 push(jsPropertyCall(pop(), name, visitArguments(node.inputs)), node);
1530 world.registerDynamicSetter( 1530 Selector selector = getOptimizedSelectorFor(node, setter);
1531 setter.name, getOptimizedSelectorFor(node, setter)); 1531 world.registerDynamicSetter(setter.name, selector);
1532 } 1532 }
1533 1533
1534 visitInvokeDynamicGetter(HInvokeDynamicGetter node) { 1534 visitInvokeDynamicGetter(HInvokeDynamicGetter node) {
1535 use(node.receiver); 1535 use(node.receiver);
1536 Selector getter = node.selector; 1536 Selector getter = node.selector;
1537 String name = backend.namer.getterName(getter.library, getter.name); 1537 String name = backend.namer.getterName(getter.library, getter.name);
1538 push(jsPropertyCall(pop(), name, visitArguments(node.inputs)), node); 1538 push(jsPropertyCall(pop(), name, visitArguments(node.inputs)), node);
1539 world.registerDynamicGetter( 1539 world.registerDynamicGetter(
1540 getter.name, getOptimizedSelectorFor(node, getter)); 1540 getter.name, getOptimizedSelectorFor(node, getter));
1541 } 1541 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1630 if (value.guaranteedType.union(HType.NUMBER) == HType.NUMBER) return true; 1630 if (value.guaranteedType.union(HType.NUMBER) == HType.NUMBER) return true;
1631 if (value is HBinaryArithmetic) { 1631 if (value is HBinaryArithmetic) {
1632 return (isSimpleFieldNumberComputation(value.left, node) && 1632 return (isSimpleFieldNumberComputation(value.left, node) &&
1633 isSimpleFieldNumberComputation(value.right, node)); 1633 isSimpleFieldNumberComputation(value.right, node));
1634 } 1634 }
1635 if (value is HFieldGet) return value.element == node.element; 1635 if (value is HFieldGet) return value.element == node.element;
1636 return false; 1636 return false;
1637 } 1637 }
1638 1638
1639 visitFieldSet(HFieldSet node) { 1639 visitFieldSet(HFieldSet node) {
1640 if (work.element.isGenerativeConstructorBody() &&
1641 node.element.isMember() &&
1642 node.value.hasGuaranteedType() &&
1643 node.block.dominates(currentGraph.exit)) {
1644 backend.updateFieldConstructorSetters(node.element,
1645 node.value.guaranteedType);
1646 }
1647 String name = backend.namer.getName(node.element); 1640 String name = backend.namer.getName(node.element);
1648 DartType type = types[node.receiver].computeType(compiler); 1641 DartType type = types[node.receiver].computeType(compiler);
1649 if (type != null) { 1642 if (type != null) {
1650 if (!work.element.isGenerativeConstructorBody()) { 1643 if (!work.element.isGenerativeConstructorBody()) {
ngeoffray 2012/09/24 08:15:49 Please add a comment on why you're checking this.
Søren Gjesse 2012/09/24 15:06:50 Done.
1651 world.registerFieldSetter( 1644 world.registerFieldSetter(
1652 node.element.name, node.element.getLibrary(), type); 1645 node.element.name, node.element.getLibrary(), type);
1653 } 1646 backend.registerFieldSetter(node, types);
ngeoffray 2012/09/24 08:15:49 Does the backend have to know about types/nodes? Y
Søren Gjesse 2012/09/24 15:06:50 No. Changed to pass Element and HType.
1654 // Determine the types seen so far for the field. If only number
1655 // types have been seen and the value of the field set is a
1656 // simple number computation only depending on that field, we
1657 // can safely keep the number type for the field.
1658 HType fieldSettersType = backend.fieldSettersTypeSoFar(node.element);
1659 HType initializersType =
1660 backend.typeFromInitializersSoFar(node.element);
1661 HType fieldType = fieldSettersType.union(initializersType);
1662 if (HType.NUMBER.union(fieldType) == HType.NUMBER &&
1663 isSimpleFieldNumberComputation(node.value, node)) {
1664 backend.updateFieldSetters(node.element, HType.NUMBER);
1665 } else {
1666 backend.updateFieldSetters(node.element, types[node.value]);
1667 } 1647 }
1668 } 1648 }
1669 use(node.receiver); 1649 use(node.receiver);
1670 js.Expression receiver = pop(); 1650 js.Expression receiver = pop();
1671 use(node.value); 1651 use(node.value);
1672 push(new js.Assignment(new js.PropertyAccess.field(receiver, name), pop()), 1652 push(new js.Assignment(new js.PropertyAccess.field(receiver, name), pop()),
1673 node); 1653 node);
1674 } 1654 }
1675 1655
1676 visitLocalGet(HLocalGet node) { 1656 visitLocalGet(HLocalGet node) {
(...skipping 18 matching lines...) Expand all
1695 List<js.Expression> data = <js.Expression>[]; 1675 List<js.Expression> data = <js.Expression>[];
1696 for (int i = 0; i < inputs.length; i++) { 1676 for (int i = 0; i < inputs.length; i++) {
1697 use(inputs[i]); 1677 use(inputs[i]);
1698 data.add(pop()); 1678 data.add(pop());
1699 } 1679 }
1700 push(new js.LiteralExpression.withData(code, data), node); 1680 push(new js.LiteralExpression.withData(code, data), node);
1701 } 1681 }
1702 } 1682 }
1703 1683
1704 visitForeignNew(HForeignNew node) { 1684 visitForeignNew(HForeignNew node) {
1705 int j = 0;
1706 node.element.forEachInstanceField(
1707 includeBackendMembers: true,
1708 includeSuperMembers: true,
1709 f: (ClassElement enclosingClass, Element member) {
1710 backend.updateFieldInitializers(member, types[node.inputs[j]]);
1711 j++;
1712 });
1713 String jsClassReference = backend.namer.isolateAccess(node.element); 1685 String jsClassReference = backend.namer.isolateAccess(node.element);
1714 List<HInstruction> inputs = node.inputs; 1686 List<HInstruction> inputs = node.inputs;
1715 // We can't use 'visitArguments', since our arguments start at input[0]. 1687 // We can't use 'visitArguments', since our arguments start at input[0].
1716 List<js.Expression> arguments = <js.Expression>[]; 1688 List<js.Expression> arguments = <js.Expression>[];
1717 for (int i = 0; i < inputs.length; i++) { 1689 for (int i = 0; i < inputs.length; i++) {
1718 use(inputs[i]); 1690 use(inputs[i]);
1719 arguments.add(pop()); 1691 arguments.add(pop());
1720 } 1692 }
1721 // TODO(floitsch): jsClassReference is an Access. We shouldn't treat it 1693 // TODO(floitsch): jsClassReference is an Access. We shouldn't treat it
1722 // as if it was a string. 1694 // as if it was a string.
(...skipping 1271 matching lines...) Expand 10 before | Expand all | Expand 10 after
2994 if (leftType.canBeNull() && rightType.canBeNull()) { 2966 if (leftType.canBeNull() && rightType.canBeNull()) {
2995 if (left.isConstantNull() || right.isConstantNull() || 2967 if (left.isConstantNull() || right.isConstantNull() ||
2996 (leftType.isPrimitive() && leftType == rightType)) { 2968 (leftType.isPrimitive() && leftType == rightType)) {
2997 return '=='; 2969 return '==';
2998 } 2970 }
2999 return null; 2971 return null;
3000 } else { 2972 } else {
3001 return '==='; 2973 return '===';
3002 } 2974 }
3003 } 2975 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698