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

Unified Diff: pkg/compiler/lib/src/universe/world_impact.dart

Issue 1464773002: Remove WorldImpact from caches when no longer needed. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 1 month 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 side-by-side diff with in-line comments
Download patch
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 fe7822dbb57a4f8d8472ffe5486186d85d0d59d6..524b50680afbe6e13201f3a637b6f38a96628272 100644
--- a/pkg/compiler/lib/src/universe/world_impact.dart
+++ b/pkg/compiler/lib/src/universe/world_impact.dart
@@ -34,6 +34,12 @@ class WorldImpact {
Iterable<TypeUse> get typeUses => const <TypeUse>[];
+ void apply(WorldImpactVisitor visitor) {
+ staticUses.forEach(visitor.visitStaticUse);
+ dynamicUses.forEach(visitor.visitDynamicUse);
+ typeUses.forEach(visitor.visitTypeUse);
+ }
+
String toString() => dump(this);
static String dump(WorldImpact worldImpact) {
@@ -154,6 +160,12 @@ class TransformedWorldImpact implements WorldImpact {
return _staticUses != null ? _staticUses : worldImpact.staticUses;
}
+ void apply(WorldImpactVisitor visitor) {
+ staticUses.forEach(visitor.visitStaticUse);
+ dynamicUses.forEach(visitor.visitDynamicUse);
+ typeUses.forEach(visitor.visitTypeUse);
+ }
+
String toString() {
StringBuffer sb = new StringBuffer();
sb.write('TransformedWorldImpact($worldImpact)');
@@ -161,3 +173,69 @@ class TransformedWorldImpact implements WorldImpact {
return sb.toString();
}
}
+
+class ImpactUse {
sigurdm 2015/11/20 12:13:19 dartdoc
Johnni Winther 2015/11/20 13:49:36 Done + Renamed to ImpactUseCase.
+ final String name;
+
+ const ImpactUse(this.name);
+
+ String toString() => 'ImpactUse($name)';
+}
+
+class ImpactStrategy {
sigurdm 2015/11/20 12:13:19 Consider if this can be named more descriptively.
sigurdm 2015/11/20 12:13:19 dartdoc
Johnni Winther 2015/11/20 13:49:36 Acknowledged.
Johnni Winther 2015/11/20 13:49:36 Done.
+ const ImpactStrategy();
+
+ /// Applies [impact] to [visitor] for the [impactUse] of [element].
+ void visitImpact(Element element,
+ WorldImpact impact,
+ WorldImpactVisitor visitor,
+ ImpactUse impactUse) {
+ // Apply unconditionally.
+ impact.apply(visitor);
+ }
+}
+
+abstract class WorldImpactVisitor {
sigurdm 2015/11/20 12:13:19 dartdoc
Johnni Winther 2015/11/20 13:49:36 Done.
+ void visitStaticUse(StaticUse staticUse);
+ void visitDynamicUse(DynamicUse dynamicUse);
+ void visitTypeUse(TypeUse typeUse);
+}
+
+// TODO(johnniwinther): Remove these when we get anonymous local classes.
sigurdm 2015/11/20 12:13:19 Don't hold your breath though ;)
Johnni Winther 2015/11/20 13:49:36 Acknowledged.
+typedef void VisitUse<U>(U use);
+
+class WorldImpactVisitorImpl implements WorldImpactVisitor {
+ final VisitUse<StaticUse> _visitStaticUse;
+ final VisitUse<DynamicUse> _visitDynamicUse;
+ final VisitUse<TypeUse> _visitTypeUse;
+
+ WorldImpactVisitorImpl(
+ {VisitUse<StaticUse> visitStaticUse,
+ VisitUse<DynamicUse> visitDynamicUse,
+ VisitUse<TypeUse> visitTypeUse})
+ : _visitStaticUse = visitStaticUse,
+ _visitDynamicUse = visitDynamicUse,
+ _visitTypeUse = visitTypeUse;
+
+ @override
+ void visitStaticUse(StaticUse use) {
+ if (_visitStaticUse != null) {
+ _visitStaticUse(use);
+ }
+ }
+
+ @override
+ void visitDynamicUse(DynamicUse use) {
+ if (_visitDynamicUse != null) {
+ _visitDynamicUse(use);
+ }
+ }
+
+ @override
+ void visitTypeUse(TypeUse use) {
+ if (_visitTypeUse != null) {
+ _visitTypeUse(use);
+ }
+ }
+}
+

Powered by Google App Engine
This is Rietveld 408576698