| Index: pkg/compiler/lib/src/universe/world_impact.dart
|
| diff --git a/pkg/compiler/lib/src/universe/world_impact.dart b/pkg/compiler/lib/src/universe/world_impact.dart
|
| index 0c708a23455fd5a9c7d253249eedca92a46df5c3..3620b853ca0bd9c78abb9c95530140225be6e083 100644
|
| --- a/pkg/compiler/lib/src/universe/world_impact.dart
|
| +++ b/pkg/compiler/lib/src/universe/world_impact.dart
|
| @@ -5,7 +5,7 @@
|
| library dart2js.universe.world_impact;
|
|
|
| import '../util/util.dart' show Setlet;
|
| -import 'use.dart' show DynamicUse, StaticUse, TypeUse;
|
| +import 'use.dart';
|
|
|
| /// Describes how an element (e.g. a method) impacts the closed-world
|
| /// semantics of a program.
|
| @@ -32,12 +32,15 @@ class WorldImpact {
|
|
|
| Iterable<TypeUse> get typeUses => const <TypeUse>[];
|
|
|
| + Iterable<ConstantUse> get constantUses => const <ConstantUse>[];
|
| +
|
| bool get isEmpty => true;
|
|
|
| void apply(WorldImpactVisitor visitor) {
|
| staticUses.forEach(visitor.visitStaticUse);
|
| dynamicUses.forEach(visitor.visitDynamicUse);
|
| typeUses.forEach(visitor.visitTypeUse);
|
| + constantUses.forEach(visitor.visitConstantUse);
|
| }
|
|
|
| String toString() => dump(this);
|
| @@ -59,6 +62,7 @@ class WorldImpact {
|
| add('dynamic uses', worldImpact.dynamicUses);
|
| add('static uses', worldImpact.staticUses);
|
| add('type uses', worldImpact.typeUses);
|
| + add('constant uses', worldImpact.constantUses);
|
| }
|
| }
|
|
|
| @@ -66,6 +70,7 @@ abstract class WorldImpactBuilder {
|
| void registerDynamicUse(DynamicUse dynamicUse);
|
| void registerTypeUse(TypeUse typeUse);
|
| void registerStaticUse(StaticUse staticUse);
|
| + void registerConstantUse(ConstantUse constantUse);
|
| }
|
|
|
| class WorldImpactBuilderImpl extends WorldImpact implements WorldImpactBuilder {
|
| @@ -74,10 +79,14 @@ class WorldImpactBuilderImpl extends WorldImpact implements WorldImpactBuilder {
|
| Set<DynamicUse> _dynamicUses;
|
| Set<StaticUse> _staticUses;
|
| Set<TypeUse> _typeUses;
|
| + Set<ConstantUse> _constantUses;
|
|
|
| @override
|
| bool get isEmpty =>
|
| - _dynamicUses == null && _staticUses == null && _typeUses == null;
|
| + _dynamicUses == null &&
|
| + _staticUses == null &&
|
| + _typeUses == null &&
|
| + _constantUses == null;
|
|
|
| /// Copy uses in [impact] to this impact builder.
|
| void addImpact(WorldImpact impact) {
|
| @@ -85,6 +94,7 @@ class WorldImpactBuilderImpl extends WorldImpact implements WorldImpactBuilder {
|
| impact.dynamicUses.forEach(registerDynamicUse);
|
| impact.staticUses.forEach(registerStaticUse);
|
| impact.typeUses.forEach(registerTypeUse);
|
| + impact.constantUses.forEach(registerConstantUse);
|
| }
|
|
|
| void registerDynamicUse(DynamicUse dynamicUse) {
|
| @@ -122,6 +132,18 @@ class WorldImpactBuilderImpl extends WorldImpact implements WorldImpactBuilder {
|
| Iterable<StaticUse> get staticUses {
|
| return _staticUses != null ? _staticUses : const <StaticUse>[];
|
| }
|
| +
|
| + void registerConstantUse(ConstantUse constantUse) {
|
| + assert(constantUse != null);
|
| + if (_constantUses == null) {
|
| + _constantUses = new Setlet<ConstantUse>();
|
| + }
|
| + _constantUses.add(constantUse);
|
| + }
|
| +
|
| + Iterable<ConstantUse> get constantUses {
|
| + return _constantUses != null ? _constantUses : const <ConstantUse>[];
|
| + }
|
| }
|
|
|
| /// [WorldImpactBuilder] that can create and collect a sequence of
|
| @@ -160,6 +182,12 @@ class StagedWorldImpactBuilder implements WorldImpactBuilder {
|
| _currentBuilder.registerStaticUse(staticUse);
|
| }
|
|
|
| + @override
|
| + void registerConstantUse(ConstantUse constantUse) {
|
| + _ensureBuilder();
|
| + _currentBuilder.registerConstantUse(constantUse);
|
| + }
|
| +
|
| /// Returns the [WorldImpact] built so far with this builder. The builder
|
| /// is reset, and if [collectImpacts] is `true` the impact is cached for
|
| /// [worldImpacts].
|
| @@ -183,6 +211,7 @@ class TransformedWorldImpact implements WorldImpact, WorldImpactBuilder {
|
| Setlet<StaticUse> _staticUses;
|
| Setlet<TypeUse> _typeUses;
|
| Setlet<DynamicUse> _dynamicUses;
|
| + Setlet<ConstantUse> _constantUses;
|
|
|
| TransformedWorldImpact(this.worldImpact);
|
|
|
| @@ -191,7 +220,8 @@ class TransformedWorldImpact implements WorldImpact, WorldImpactBuilder {
|
| return worldImpact.isEmpty &&
|
| _staticUses == null &&
|
| _typeUses == null &&
|
| - _dynamicUses == null;
|
| + _dynamicUses == null &&
|
| + _constantUses == null;
|
| }
|
|
|
| @override
|
| @@ -233,10 +263,24 @@ class TransformedWorldImpact implements WorldImpact, WorldImpactBuilder {
|
| return _staticUses != null ? _staticUses : worldImpact.staticUses;
|
| }
|
|
|
| + @override
|
| + Iterable<ConstantUse> get constantUses {
|
| + return _constantUses != null ? _constantUses : worldImpact.constantUses;
|
| + }
|
| +
|
| + void registerConstantUse(ConstantUse constantUse) {
|
| + if (_constantUses == null) {
|
| + _constantUses = new Setlet<ConstantUse>();
|
| + _constantUses.addAll(worldImpact.constantUses);
|
| + }
|
| + _constantUses.add(constantUse);
|
| + }
|
| +
|
| void apply(WorldImpactVisitor visitor) {
|
| staticUses.forEach(visitor.visitStaticUse);
|
| dynamicUses.forEach(visitor.visitDynamicUse);
|
| typeUses.forEach(visitor.visitTypeUse);
|
| + constantUses.forEach(visitor.visitConstantUse);
|
| }
|
|
|
| String toString() {
|
| @@ -279,6 +323,7 @@ abstract class WorldImpactVisitor {
|
| void visitStaticUse(StaticUse staticUse);
|
| void visitDynamicUse(DynamicUse dynamicUse);
|
| void visitTypeUse(TypeUse typeUse);
|
| + void visitConstantUse(ConstantUse typeUse);
|
| }
|
|
|
| // TODO(johnniwinther): Remove these when we get anonymous local classes.
|
| @@ -288,14 +333,17 @@ class WorldImpactVisitorImpl implements WorldImpactVisitor {
|
| final VisitUse<StaticUse> _visitStaticUse;
|
| final VisitUse<DynamicUse> _visitDynamicUse;
|
| final VisitUse<TypeUse> _visitTypeUse;
|
| + final VisitUse<ConstantUse> _visitConstantUse;
|
|
|
| WorldImpactVisitorImpl(
|
| {VisitUse<StaticUse> visitStaticUse,
|
| VisitUse<DynamicUse> visitDynamicUse,
|
| - VisitUse<TypeUse> visitTypeUse})
|
| + VisitUse<TypeUse> visitTypeUse,
|
| + VisitUse<ConstantUse> visitConstantUse})
|
| : _visitStaticUse = visitStaticUse,
|
| _visitDynamicUse = visitDynamicUse,
|
| - _visitTypeUse = visitTypeUse;
|
| + _visitTypeUse = visitTypeUse,
|
| + _visitConstantUse = visitConstantUse;
|
|
|
| @override
|
| void visitStaticUse(StaticUse use) {
|
| @@ -317,4 +365,11 @@ class WorldImpactVisitorImpl implements WorldImpactVisitor {
|
| _visitTypeUse(use);
|
| }
|
| }
|
| +
|
| + @override
|
| + void visitConstantUse(ConstantUse use) {
|
| + if (_visitConstantUse != null) {
|
| + _visitConstantUse(use);
|
| + }
|
| + }
|
| }
|
|
|