Chromium Code Reviews| Index: pkg/compiler/lib/src/cps_ir/type_propagation.dart |
| diff --git a/pkg/compiler/lib/src/cps_ir/type_propagation.dart b/pkg/compiler/lib/src/cps_ir/type_propagation.dart |
| index f1944ce5a88217e7debaaf8622e8ea196496396e..1fc027734871785e183c981d280f37406269dc6c 100644 |
| --- a/pkg/compiler/lib/src/cps_ir/type_propagation.dart |
| +++ b/pkg/compiler/lib/src/cps_ir/type_propagation.dart |
| @@ -38,6 +38,7 @@ import '../world.dart' show World; |
| import 'cps_fragment.dart'; |
| import 'cps_ir_nodes.dart'; |
| import 'type_mask_system.dart'; |
| +import 'effects.dart'; |
| class ConstantPropagationLattice { |
| final TypeMaskSystem typeSystem; |
| @@ -1882,7 +1883,19 @@ class TransformingVisitor extends DeepRecursiveVisitor { |
| } |
| } |
| + visitInvokeConstructor(InvokeConstructor node) { |
| + node.effectFlags = |
| + Effects.from(compiler.world.getSideEffectsOfElement(node.target)); |
| + } |
| + |
| visitInvokeMethodDirectly(InvokeMethodDirectly node) { |
| + Element target = node.target; |
| + if (target is ConstructorBodyElement) { |
| + ConstructorBodyElement constructorBody = target; |
| + target = constructorBody.constructor; |
| + } |
| + node.effectFlags = |
| + Effects.from(compiler.world.getSideEffectsOfElement(target)); |
| TypeMask receiverType = node.dartReceiver.type; |
| if (node.callingConvention == CallingConvention.Intercepted && |
| typeSystem.areDisjoint(receiverType, typeSystem.interceptorType)) { |
| @@ -1906,6 +1919,9 @@ class TransformingVisitor extends DeepRecursiveVisitor { |
| TypeMask receiverType = node.dartReceiver.type; |
| node.mask = typeSystem.intersection(node.mask, receiverType); |
| + node.effectFlags = Effects.from( |
| + compiler.world.getSideEffectsOfSelector(node.selector, node.mask)); |
| + |
| bool canBeNonThrowingCallOnNull = |
| selectorsOnNull.contains(node.selector) && |
| receiverType.isNullable; |
| @@ -1977,6 +1993,8 @@ class TransformingVisitor extends DeepRecursiveVisitor { |
| } |
| visitInvokeStatic(InvokeStatic node) { |
| + node.effectFlags = Effects.from( |
| + compiler.world.getSideEffectsOfElement(node.target)); |
| return specializeInternalMethodCall(node); |
| } |
| @@ -2276,6 +2294,28 @@ class TransformingVisitor extends DeepRecursiveVisitor { |
| return null; |
| } |
| + bool isFinal(Element element) { |
| + return element is FunctionElement || // Tear-offs are "final". |
| + element is FieldElement && classWorld.fieldNeverChanges(element); |
| + } |
| + |
| + visitGetField(GetField node) { |
| + node.isFinal = isFinal(node.field); |
|
Siggi Cherem (dart-lang)
2016/02/17 20:53:24
since `isFinal(element)` is based only on informat
asgerf
2016/02/29 12:48:17
Yeah it's better that way. Done.
|
| + } |
| + |
| + visitGetStatic(GetStatic node) { |
| + node.isFinal = isFinal(node.element); |
| + } |
| + |
| + visitGetLazyStatic(GetLazyStatic node) { |
| + node.isFinal = isFinal(node.element); |
| + } |
| + |
| + visitGetLength(GetLength node) { |
| + node.isFinal = typeSystem.isDefinitelyFixedLengthIndexable( |
| + node.object.definition.type, allowNull: true); |
| + } |
| + |
| visitReadTypeVariable(ReadTypeVariable node) { |
| // Pattern match on |
| // |