| Index: pkg/compiler/lib/src/cps_ir/type_mask_system.dart | 
| diff --git a/pkg/compiler/lib/src/cps_ir/type_mask_system.dart b/pkg/compiler/lib/src/cps_ir/type_mask_system.dart | 
| index c2d704291545fe865a83285849b38ed31c4afc94..ba44ed1c26068069ff6a6f6fa747d90ff988e5c5 100644 | 
| --- a/pkg/compiler/lib/src/cps_ir/type_mask_system.dart | 
| +++ b/pkg/compiler/lib/src/cps_ir/type_mask_system.dart | 
| @@ -43,6 +43,7 @@ class TypeMaskSystem { | 
| TypeMask get uintType => inferrer.positiveIntType; | 
|  | 
| TypeMask numStringBoolType; | 
| +  TypeMask fixedLengthType; | 
| TypeMask interceptorType; | 
|  | 
| ClassElement get jsNullClass => backend.jsNullClass; | 
| @@ -67,6 +68,11 @@ class TypeMaskSystem { | 
| classWorld); | 
| interceptorType = | 
| new TypeMask.nonNullSubtype(backend.jsInterceptorClass, classWorld); | 
| + | 
| +    TypeMask typedArray = nonNullSubclass(backend.typedArrayClass); | 
| +    fixedLengthType = new TypeMask.unionOf( | 
| +            <TypeMask>[stringType, backend.fixedArrayType, typedArray], | 
| +            classWorld); | 
| } | 
|  | 
| bool methodUsesReceiverArgument(FunctionElement function) { | 
| @@ -198,6 +204,12 @@ class TypeMaskSystem { | 
| return areDisjoint(t, doubleType); | 
| } | 
|  | 
| +  bool isDefinitelyNonNegativeInt(TypeMask t, {bool allowNull: false}) { | 
| +    if (!allowNull && t.isNullable) return false; | 
| +    // The JSPositiveInt class includes zero, despite the name. | 
| +    return t.satisfies(backend.jsPositiveIntClass, classWorld); | 
| +  } | 
| + | 
| bool isDefinitelyInt(TypeMask t, {bool allowNull: false}) { | 
| if (!allowNull && t.isNullable) return false; | 
| return t.satisfies(backend.jsIntClass, classWorld); | 
| @@ -247,6 +259,17 @@ class TypeMaskSystem { | 
| return t.nonNullable().satisfies(backend.jsIndexableClass, classWorld); | 
| } | 
|  | 
| +  bool isDefinitelyMutableIndexable(TypeMask t, {bool allowNull: false}) { | 
| +    if (!allowNull && t.isNullable) return false; | 
| +    return t.nonNullable().satisfies(backend.jsMutableIndexableClass, | 
| +        classWorld); | 
| +  } | 
| + | 
| +  bool isDefinitelyFixedLengthIndexable(TypeMask t, {bool allowNull: false}) { | 
| +    if (!allowNull && t.isNullable) return false; | 
| +    return fixedLengthType.containsMask(t.nonNullable(), classWorld); | 
| +  } | 
| + | 
| bool areDisjoint(TypeMask leftType, TypeMask rightType) { | 
| TypeMask intersection = leftType.intersection(rightType, classWorld); | 
| return intersection.isEmpty && !intersection.isNullable; | 
|  |