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

Unified Diff: pkg/compiler/lib/src/types/union_type_mask.dart

Issue 2363773005: Move closed world reasoning methods from ClassWorld to ClosedWorld. (Closed)
Patch Set: Created 4 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 side-by-side diff with in-line comments
Download patch
Index: pkg/compiler/lib/src/types/union_type_mask.dart
diff --git a/pkg/compiler/lib/src/types/union_type_mask.dart b/pkg/compiler/lib/src/types/union_type_mask.dart
index b01aa7e35ec360103dcece38541d1751e0e14157..8e4aa394c861653c438261542928a83902cba4b3 100644
--- a/pkg/compiler/lib/src/types/union_type_mask.dart
+++ b/pkg/compiler/lib/src/types/union_type_mask.dart
@@ -19,30 +19,30 @@ class UnionTypeMask implements TypeMask {
assert(disjointMasks.every((TypeMask mask) => !mask.isUnion));
}
- static TypeMask unionOf(Iterable<TypeMask> masks, ClassWorld classWorld) {
+ static TypeMask unionOf(Iterable<TypeMask> masks, ClosedWorld closedWorld) {
assert(
- masks.every((mask) => TypeMask.assertIsNormalized(mask, classWorld)));
+ masks.every((mask) => TypeMask.assertIsNormalized(mask, closedWorld)));
List<FlatTypeMask> disjoint = <FlatTypeMask>[];
- unionOfHelper(masks, disjoint, classWorld);
+ unionOfHelper(masks, disjoint, closedWorld);
if (disjoint.isEmpty) return new TypeMask.nonNullEmpty();
if (disjoint.length > MAX_UNION_LENGTH) {
- return flatten(disjoint, classWorld);
+ return flatten(disjoint, closedWorld);
}
if (disjoint.length == 1) return disjoint[0];
UnionTypeMask union = new UnionTypeMask._internal(disjoint);
- assert(TypeMask.assertIsNormalized(union, classWorld));
+ assert(TypeMask.assertIsNormalized(union, closedWorld));
return union;
}
static void unionOfHelper(Iterable<TypeMask> masks,
- List<FlatTypeMask> disjoint, ClassWorld classWorld) {
+ List<FlatTypeMask> disjoint, ClosedWorld closedWorld) {
// TODO(johnniwinther): Impose an order on the mask to ensure subclass masks
// are preferred to subtype masks.
for (TypeMask mask in masks) {
mask = TypeMask.nonForwardingMask(mask);
if (mask.isUnion) {
UnionTypeMask union = mask;
- unionOfHelper(union.disjointMasks, disjoint, classWorld);
+ unionOfHelper(union.disjointMasks, disjoint, closedWorld);
} else if (mask.isEmpty) {
continue;
} else {
@@ -55,7 +55,7 @@ class UnionTypeMask implements TypeMask {
for (int i = 0; i < disjoint.length; i++) {
FlatTypeMask current = disjoint[i];
if (current == null) continue;
- TypeMask newMask = flatMask.union(current, classWorld);
+ TypeMask newMask = flatMask.union(current, closedWorld);
// If we have found a disjoint union, continue iterating.
if (newMask.isUnion) continue;
covered = true;
@@ -87,7 +87,7 @@ class UnionTypeMask implements TypeMask {
}
}
- static TypeMask flatten(List<FlatTypeMask> masks, ClassWorld classWorld) {
+ static TypeMask flatten(List<FlatTypeMask> masks, ClosedWorld closedWorld) {
assert(masks.length > 1);
// If either type mask is a subtype type mask, we cannot use a
// subclass type mask to represent their union.
@@ -96,7 +96,7 @@ class UnionTypeMask implements TypeMask {
List<ClassElement> masksBases = masks.map((mask) => mask.base).toList();
Iterable<ClassElement> candidates =
- classWorld.commonSupertypesOf(masksBases);
+ closedWorld.commonSupertypesOf(masksBases);
// Compute the best candidate and its kind.
ClassElement bestElement;
@@ -105,8 +105,8 @@ class UnionTypeMask implements TypeMask {
for (ClassElement candidate in candidates) {
bool isInstantiatedStrictSubclass(cls) =>
cls != candidate &&
- classWorld.isDirectlyInstantiated(cls) &&
- classWorld.isSubclassOf(cls, candidate);
+ closedWorld.isDirectlyInstantiated(cls) &&
+ closedWorld.isSubclassOf(cls, candidate);
int size;
int kind;
@@ -119,11 +119,11 @@ class UnionTypeMask implements TypeMask {
// TODO(sigmund, johnniwinther): computing length here (and below) is
// expensive. If we can't prevent `flatten` from being called a lot, it
// might be worth caching results.
- size = classWorld.strictSubclassCount(candidate);
- assert(size <= classWorld.strictSubtypeCount(candidate));
+ size = closedWorld.strictSubclassCount(candidate);
+ assert(size <= closedWorld.strictSubtypeCount(candidate));
} else {
kind = FlatTypeMask.SUBTYPE;
- size = classWorld.strictSubtypeCount(candidate);
+ size = closedWorld.strictSubtypeCount(candidate);
}
// Update the best candidate if the new one is better.
if (bestElement == null || size < bestSize) {
@@ -132,10 +132,10 @@ class UnionTypeMask implements TypeMask {
bestKind = kind;
}
}
- return new TypeMask(bestElement, bestKind, isNullable, classWorld);
+ return new TypeMask(bestElement, bestKind, isNullable, closedWorld);
}
- TypeMask union(var other, ClassWorld classWorld) {
+ TypeMask union(var other, ClosedWorld closedWorld) {
other = TypeMask.nonForwardingMask(other);
if (!other.isUnion && disjointMasks.contains(other)) return this;
@@ -146,10 +146,10 @@ class UnionTypeMask implements TypeMask {
assert(other is UnionTypeMask);
newList.addAll(other.disjointMasks);
}
- return new TypeMask.unionOf(newList, classWorld);
+ return new TypeMask.unionOf(newList, closedWorld);
}
- TypeMask intersection(var other, ClassWorld classWorld) {
+ TypeMask intersection(var other, ClosedWorld closedWorld) {
other = TypeMask.nonForwardingMask(other);
if (!other.isUnion && disjointMasks.contains(other)) return other;
if (other.isUnion && this == other) return this;
@@ -161,19 +161,19 @@ class UnionTypeMask implements TypeMask {
intersections.add(current);
} else {
for (FlatTypeMask flatOther in other.disjointMasks) {
- intersections.add(current.intersection(flatOther, classWorld));
+ intersections.add(current.intersection(flatOther, closedWorld));
}
}
} else {
- intersections.add(current.intersection(other, classWorld));
+ intersections.add(current.intersection(other, closedWorld));
}
}
- return new TypeMask.unionOf(intersections, classWorld);
+ return new TypeMask.unionOf(intersections, closedWorld);
}
- bool isDisjoint(TypeMask other, ClassWorld classWorld) {
+ bool isDisjoint(TypeMask other, ClosedWorld closedWorld) {
for (var current in disjointMasks) {
- if (!current.isDisjoint(other, classWorld)) return false;
+ if (!current.isDisjoint(other, closedWorld)) return false;
}
return true;
}
@@ -212,36 +212,36 @@ class UnionTypeMask implements TypeMask {
* - the cheap test matching against individual members of [disjointMasks]
* must have failed.
*/
- bool slowContainsCheck(TypeMask other, ClassWorld classWorld) {
+ bool slowContainsCheck(TypeMask other, ClosedWorld closedWorld) {
// Unions should never make it here.
assert(!other.isUnion);
// Ensure the cheap test fails.
- assert(!disjointMasks.any((mask) => mask.containsMask(other, classWorld)));
+ assert(!disjointMasks.any((mask) => mask.containsMask(other, closedWorld)));
// If we cover object, we should never get here.
- assert(!contains(classWorld.coreClasses.objectClass, classWorld));
+ assert(!contains(closedWorld.coreClasses.objectClass, closedWorld));
// Likewise, nullness should be covered.
assert(isNullable || !other.isNullable);
// The fast test is precise for exact types.
if (other.isExact) return false;
// We cannot contain object.
- if (other.contains(classWorld.coreClasses.objectClass, classWorld)) {
+ if (other.contains(closedWorld.coreClasses.objectClass, closedWorld)) {
return false;
}
FlatTypeMask flat = TypeMask.nonForwardingMask(other);
// Check we cover the base class.
- if (!contains(flat.base, classWorld)) return false;
+ if (!contains(flat.base, closedWorld)) return false;
// Check for other members.
Iterable<ClassElement> members;
if (flat.isSubclass) {
- members = classWorld.strictSubclassesOf(flat.base);
+ members = closedWorld.strictSubclassesOf(flat.base);
} else {
assert(flat.isSubtype);
- members = classWorld.strictSubtypesOf(flat.base);
+ members = closedWorld.strictSubtypesOf(flat.base);
}
- return members.every((ClassElement cls) => this.contains(cls, classWorld));
+ return members.every((ClassElement cls) => this.contains(cls, closedWorld));
}
- bool isInMask(TypeMask other, ClassWorld classWorld) {
+ bool isInMask(TypeMask other, ClosedWorld closedWorld) {
other = TypeMask.nonForwardingMask(other);
if (isNullable && !other.isNullable) return false;
if (other.isUnion) {
@@ -252,7 +252,7 @@ class UnionTypeMask implements TypeMask {
// context, so we can safely ignore it here.
FlatTypeMask maskDisregardNull = mask.nonNullable();
return masks.any((FlatTypeMask other) {
- return other.containsMask(maskDisregardNull, classWorld);
+ return other.containsMask(maskDisregardNull, closedWorld);
});
}
@@ -260,77 +260,77 @@ class UnionTypeMask implements TypeMask {
bool contained = containedInAnyOf(disjointMask, union.disjointMasks);
if (PERFORM_EXTRA_CONTAINS_CHECK &&
!contained &&
- union.slowContainsCheck(disjointMask, classWorld)) {
+ union.slowContainsCheck(disjointMask, closedWorld)) {
throw "TypeMask based containment check failed for $this and $other.";
}
return contained;
});
}
- return disjointMasks.every((mask) => mask.isInMask(other, classWorld));
+ return disjointMasks.every((mask) => mask.isInMask(other, closedWorld));
}
- bool containsMask(TypeMask other, ClassWorld classWorld) {
+ bool containsMask(TypeMask other, ClosedWorld closedWorld) {
other = TypeMask.nonForwardingMask(other);
if (other.isNullable && !isNullable) return false;
- if (other.isUnion) return other.isInMask(this, classWorld);
+ if (other.isUnion) return other.isInMask(this, closedWorld);
other = other.nonNullable(); // nullable is not canonicalized, so drop it.
bool contained =
- disjointMasks.any((mask) => mask.containsMask(other, classWorld));
+ disjointMasks.any((mask) => mask.containsMask(other, closedWorld));
if (PERFORM_EXTRA_CONTAINS_CHECK &&
!contained &&
- slowContainsCheck(other, classWorld)) {
+ slowContainsCheck(other, closedWorld)) {
throw "TypeMask based containment check failed for $this and $other.";
}
return contained;
}
- bool containsOnlyInt(ClassWorld classWorld) {
- return disjointMasks.every((mask) => mask.containsOnlyInt(classWorld));
+ bool containsOnlyInt(ClosedWorld closedWorld) {
+ return disjointMasks.every((mask) => mask.containsOnlyInt(closedWorld));
}
- bool containsOnlyDouble(ClassWorld classWorld) {
- return disjointMasks.every((mask) => mask.containsOnlyDouble(classWorld));
+ bool containsOnlyDouble(ClosedWorld closedWorld) {
+ return disjointMasks.every((mask) => mask.containsOnlyDouble(closedWorld));
}
- bool containsOnlyNum(ClassWorld classWorld) {
+ bool containsOnlyNum(ClosedWorld closedWorld) {
return disjointMasks.every((mask) {
- return mask.containsOnlyNum(classWorld);
+ return mask.containsOnlyNum(closedWorld);
});
}
- bool containsOnlyBool(ClassWorld classWorld) {
- return disjointMasks.every((mask) => mask.containsOnlyBool(classWorld));
+ bool containsOnlyBool(ClosedWorld closedWorld) {
+ return disjointMasks.every((mask) => mask.containsOnlyBool(closedWorld));
}
- bool containsOnlyString(ClassWorld classWorld) {
- return disjointMasks.every((mask) => mask.containsOnlyString(classWorld));
+ bool containsOnlyString(ClosedWorld closedWorld) {
+ return disjointMasks.every((mask) => mask.containsOnlyString(closedWorld));
}
bool containsOnly(ClassElement element) {
return disjointMasks.every((mask) => mask.containsOnly(element));
}
- bool satisfies(ClassElement cls, ClassWorld classWorld) {
- return disjointMasks.every((mask) => mask.satisfies(cls, classWorld));
+ bool satisfies(ClassElement cls, ClosedWorld closedWorld) {
+ return disjointMasks.every((mask) => mask.satisfies(cls, closedWorld));
}
- bool contains(ClassElement type, ClassWorld classWorld) {
- return disjointMasks.any((e) => e.contains(type, classWorld));
+ bool contains(ClassElement type, ClosedWorld closedWorld) {
+ return disjointMasks.any((e) => e.contains(type, closedWorld));
}
- bool containsAll(ClassWorld classWorld) {
- return disjointMasks.any((mask) => mask.containsAll(classWorld));
+ bool containsAll(ClosedWorld closedWorld) {
+ return disjointMasks.any((mask) => mask.containsAll(closedWorld));
}
- ClassElement singleClass(ClassWorld classWorld) => null;
+ ClassElement singleClass(ClosedWorld closedWorld) => null;
- bool needsNoSuchMethodHandling(Selector selector, ClassWorld classWorld) {
+ bool needsNoSuchMethodHandling(Selector selector, ClosedWorld closedWorld) {
return disjointMasks
- .any((e) => e.needsNoSuchMethodHandling(selector, classWorld));
+ .any((e) => e.needsNoSuchMethodHandling(selector, closedWorld));
}
- bool canHit(Element element, Selector selector, ClassWorld classWorld) {
- return disjointMasks.any((e) => e.canHit(element, selector, classWorld));
+ bool canHit(Element element, Selector selector, ClosedWorld closedWorld) {
+ return disjointMasks.any((e) => e.canHit(element, selector, closedWorld));
}
Element locateSingleElement(Selector selector, Compiler compiler) {

Powered by Google App Engine
This is Rietveld 408576698