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

Unified Diff: pkg/compiler/lib/src/cps_ir/type_mask_system.dart

Issue 1413613010: Normalize type masks to use the least upper instantiated subclass/type. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Fix try/poi 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
« no previous file with comments | « pkg/compiler/lib/src/closure.dart ('k') | pkg/compiler/lib/src/enqueue.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
« no previous file with comments | « pkg/compiler/lib/src/closure.dart ('k') | pkg/compiler/lib/src/enqueue.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698