| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 part of masks; | 5 part of masks; |
| 6 | 6 |
| 7 class UnionTypeMask implements TypeMask { | 7 class UnionTypeMask implements TypeMask { |
| 8 final Iterable<FlatTypeMask> disjointMasks; | 8 final Iterable<FlatTypeMask> disjointMasks; |
| 9 | 9 |
| 10 static const int MAX_UNION_LENGTH = 4; | 10 static const int MAX_UNION_LENGTH = 4; |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 * - [other] may not be a [UnionTypeMask] itself | 211 * - [other] may not be a [UnionTypeMask] itself |
| 212 * - the cheap test matching against individual members of [disjointMasks] | 212 * - the cheap test matching against individual members of [disjointMasks] |
| 213 * must have failed. | 213 * must have failed. |
| 214 */ | 214 */ |
| 215 bool slowContainsCheck(TypeMask other, ClassWorld classWorld) { | 215 bool slowContainsCheck(TypeMask other, ClassWorld classWorld) { |
| 216 // Unions should never make it here. | 216 // Unions should never make it here. |
| 217 assert(!other.isUnion); | 217 assert(!other.isUnion); |
| 218 // Ensure the cheap test fails. | 218 // Ensure the cheap test fails. |
| 219 assert(!disjointMasks.any((mask) => mask.containsMask(other, classWorld))); | 219 assert(!disjointMasks.any((mask) => mask.containsMask(other, classWorld))); |
| 220 // If we cover object, we should never get here. | 220 // If we cover object, we should never get here. |
| 221 assert(!contains(classWorld.objectClass, classWorld)); | 221 assert(!contains(classWorld.coreClasses.objectClass, classWorld)); |
| 222 // Likewise, nullness should be covered. | 222 // Likewise, nullness should be covered. |
| 223 assert(isNullable || !other.isNullable); | 223 assert(isNullable || !other.isNullable); |
| 224 // The fast test is precise for exact types. | 224 // The fast test is precise for exact types. |
| 225 if (other.isExact) return false; | 225 if (other.isExact) return false; |
| 226 // We cannot contain object. | 226 // We cannot contain object. |
| 227 if (other.contains(classWorld.objectClass, classWorld)) return false; | 227 if (other.contains(classWorld.coreClasses.objectClass, classWorld)) { |
| 228 return false; |
| 229 } |
| 228 FlatTypeMask flat = TypeMask.nonForwardingMask(other); | 230 FlatTypeMask flat = TypeMask.nonForwardingMask(other); |
| 229 // Check we cover the base class. | 231 // Check we cover the base class. |
| 230 if (!contains(flat.base, classWorld)) return false; | 232 if (!contains(flat.base, classWorld)) return false; |
| 231 // Check for other members. | 233 // Check for other members. |
| 232 Iterable<ClassElement> members; | 234 Iterable<ClassElement> members; |
| 233 if (flat.isSubclass) { | 235 if (flat.isSubclass) { |
| 234 members = classWorld.strictSubclassesOf(flat.base); | 236 members = classWorld.strictSubclassesOf(flat.base); |
| 235 } else { | 237 } else { |
| 236 assert(flat.isSubtype); | 238 assert(flat.isSubtype); |
| 237 members = classWorld.strictSubtypesOf(flat.base); | 239 members = classWorld.strictSubtypesOf(flat.base); |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 372 int get hashCode { | 374 int get hashCode { |
| 373 int hashCode = isNullable ? 86 : 43; | 375 int hashCode = isNullable ? 86 : 43; |
| 374 // The order of the masks in [disjointMasks] must not affect the | 376 // The order of the masks in [disjointMasks] must not affect the |
| 375 // hashCode. | 377 // hashCode. |
| 376 for (var mask in disjointMasks) { | 378 for (var mask in disjointMasks) { |
| 377 hashCode = (hashCode ^ mask.nonNullable().hashCode) & 0x3fffffff; | 379 hashCode = (hashCode ^ mask.nonNullable().hashCode) & 0x3fffffff; |
| 378 } | 380 } |
| 379 return hashCode; | 381 return hashCode; |
| 380 } | 382 } |
| 381 } | 383 } |
| OLD | NEW |