| 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 f8f562cad7faf425e6c9e1b38006a8016baed12e..c1230bfd1282c173a9d37afad3135aad49ba4119 100644
|
| --- a/pkg/compiler/lib/src/cps_ir/type_mask_system.dart
|
| +++ b/pkg/compiler/lib/src/cps_ir/type_mask_system.dart
|
| @@ -25,6 +25,13 @@ class TypeMaskSystem {
|
| final World classWorld;
|
| final JavaScriptBackend backend;
|
|
|
| + TypeMask _numStringBoolType;
|
| + TypeMask _fixedLengthType;
|
| + TypeMask _interceptorType;
|
| + TypeMask _interceptedTypes; // Does not include null.
|
| +
|
| + TypeMask __indexableTypeTest;
|
| +
|
| TypeMask get dynamicType => inferrer.dynamicType;
|
| TypeMask get typeType => inferrer.typeType;
|
| TypeMask get functionType => inferrer.functionType;
|
| @@ -43,12 +50,70 @@ class TypeMaskSystem {
|
| TypeMask get uint32Type => inferrer.uint32Type;
|
| TypeMask get uintType => inferrer.positiveIntType;
|
|
|
| - TypeMask numStringBoolType;
|
| - TypeMask fixedLengthType;
|
| - TypeMask interceptorType;
|
| - TypeMask interceptedTypes; // Does not include null.
|
| + TypeMask get numStringBoolType {
|
| + if (_numStringBoolType == null) {
|
| + // Build the number+string+bool type. To make containment tests more
|
| + // inclusive, we use the num, String, bool types for this, not
|
| + // the JSNumber, JSString, JSBool subclasses.
|
| + TypeMask anyNum =
|
| + new TypeMask.nonNullSubtype(classWorld.numClass, classWorld);
|
| + TypeMask anyString =
|
| + new TypeMask.nonNullSubtype(classWorld.stringClass, classWorld);
|
| + TypeMask anyBool =
|
| + new TypeMask.nonNullSubtype(classWorld.boolClass, classWorld);
|
| + _numStringBoolType =
|
| + new TypeMask.unionOf(<TypeMask>[anyNum, anyString, anyBool],
|
| + classWorld);
|
| + }
|
| + return _numStringBoolType;
|
| + }
|
| +
|
| + TypeMask get fixedLengthType {
|
| + if (_fixedLengthType == null) {
|
| + List<TypeMask> fixedLengthTypes =
|
| + <TypeMask>[stringType, backend.fixedArrayType];
|
| + if (classWorld.isInstantiated(helpers.typedArrayClass)) {
|
| + fixedLengthTypes.add(nonNullSubclass(helpers.typedArrayClass));
|
| + }
|
| + _fixedLengthType = new TypeMask.unionOf(fixedLengthTypes, classWorld);
|
| + }
|
| + return _fixedLengthType;
|
| + }
|
| +
|
| + TypeMask get interceptorType {
|
| + if (_interceptorType == null) {
|
| + _interceptorType =
|
| + new TypeMask.nonNullSubtype(helpers.jsInterceptorClass, classWorld);
|
| + }
|
| + return _interceptorType;
|
| + }
|
|
|
| - TypeMask _indexableTypeTest;
|
| + TypeMask get interceptedTypes { // Does not include null.
|
| + if (_interceptedTypes == null) {
|
| + // We redundantly include subtypes of num/string/bool as intercepted
|
| + // types, because the type system does not infer that their
|
| + // implementations are all subclasses of Interceptor.
|
| + _interceptedTypes = new TypeMask.unionOf(
|
| + <TypeMask>[interceptorType, numStringBoolType], classWorld);
|
| + }
|
| + return _interceptedTypes;
|
| + }
|
| +
|
| + TypeMask get _indexableTypeTest {
|
| + if (__indexableTypeTest == null) {
|
| + // Make a TypeMask containing Indexable and (redundantly) subtypes of
|
| + // string because the type inference does not infer that all strings are
|
| + // indexables.
|
| + TypeMask indexable =
|
| + new TypeMask.nonNullSubtype(helpers.jsIndexableClass, classWorld);
|
| + TypeMask anyString =
|
| + new TypeMask.nonNullSubtype(classWorld.stringClass, classWorld);
|
| + __indexableTypeTest = new TypeMask.unionOf(
|
| + <TypeMask>[indexable, anyString],
|
| + classWorld);
|
| + }
|
| + return __indexableTypeTest;
|
| + }
|
|
|
| ClassElement get jsNullClass => helpers.jsNullClass;
|
|
|
| @@ -59,41 +124,6 @@ class TypeMaskSystem {
|
| : inferrer = compiler.typesTask,
|
| classWorld = compiler.world,
|
| backend = compiler.backend {
|
| -
|
| - // Build the number+string+bool type. To make containment tests more
|
| - // inclusive, we use the num, String, bool types for this, not
|
| - // the JSNumber, JSString, JSBool subclasses.
|
| - TypeMask anyNum =
|
| - new TypeMask.nonNullSubtype(classWorld.numClass, classWorld);
|
| - TypeMask anyString =
|
| - new TypeMask.nonNullSubtype(classWorld.stringClass, classWorld);
|
| - TypeMask anyBool =
|
| - new TypeMask.nonNullSubtype(classWorld.boolClass, classWorld);
|
| - numStringBoolType =
|
| - new TypeMask.unionOf(<TypeMask>[anyNum, anyString, anyBool],
|
| - classWorld);
|
| - interceptorType =
|
| - new TypeMask.nonNullSubtype(helpers.jsInterceptorClass, classWorld);
|
| -
|
| - // We redundantly include subtypes of num/string/bool as intercepted types,
|
| - // because the type system does not infer that their implementations are
|
| - // all subclasses of Interceptor.
|
| - interceptedTypes = new TypeMask.unionOf(
|
| - <TypeMask>[interceptorType, numStringBoolType], classWorld);
|
| -
|
| - TypeMask typedArray = nonNullSubclass(helpers.typedArrayClass);
|
| - fixedLengthType = new TypeMask.unionOf(
|
| - <TypeMask>[stringType, backend.fixedArrayType, typedArray],
|
| - classWorld);
|
| -
|
| - // Make a TypeMask containing Indexable and (redundantly) subtypes of
|
| - // string because the type inference does not infer that all strings are
|
| - // indexables.
|
| - TypeMask indexable =
|
| - new TypeMask.nonNullSubtype(helpers.jsIndexableClass, classWorld);
|
| - _indexableTypeTest = new TypeMask.unionOf(
|
| - <TypeMask>[indexable, anyString],
|
| - classWorld);
|
| }
|
|
|
| bool methodUsesReceiverArgument(FunctionElement function) {
|
|
|