| Index: pkg/compiler/lib/src/ssa/nodes.dart
|
| diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
|
| index dfcc4d367582ad41324d5bee88c4b651fb8e5c41..fdaef0179507644c4b9fdd3a92cd9c95fdf48bcd 100644
|
| --- a/pkg/compiler/lib/src/ssa/nodes.dart
|
| +++ b/pkg/compiler/lib/src/ssa/nodes.dart
|
| @@ -882,6 +882,32 @@ abstract class HInstruction implements Spannable {
|
| return instructionType.isEmpty && !instructionType.isNullable;
|
| }
|
|
|
| + /// Returns `true` if [typeMask] contains [cls].
|
| + static bool containsType(
|
| + TypeMask typeMask,
|
| + ClassElement cls,
|
| + ClassWorld classWorld) {
|
| + return classWorld.isInstantiated(cls) && typeMask.contains(cls, classWorld);
|
| + }
|
| +
|
| + /// Returns `true` if [typeMask] contains only [cls].
|
| + static bool containsOnlyType(
|
| + TypeMask typeMask,
|
| + ClassElement cls,
|
| + ClassWorld classWorld) {
|
| + return classWorld.isInstantiated(cls) &&
|
| + typeMask.containsOnly(cls);
|
| + }
|
| +
|
| + /// Returns `true` if [typeMask] is an instance of [cls].
|
| + static bool isInstanceOf(
|
| + TypeMask typeMask,
|
| + ClassElement cls,
|
| + ClassWorld classWorld) {
|
| + return classWorld.isInstantiated(cls) &&
|
| + typeMask.satisfies(cls, classWorld);
|
| + }
|
| +
|
| bool canBePrimitive(Compiler compiler) {
|
| return canBePrimitiveNumber(compiler)
|
| || canBePrimitiveArray(compiler)
|
| @@ -895,27 +921,28 @@ abstract class HInstruction implements Spannable {
|
| JavaScriptBackend backend = compiler.backend;
|
| // TODO(sra): It should be possible to test only jsDoubleClass and
|
| // jsUInt31Class, since all others are superclasses of these two.
|
| - return instructionType.contains(backend.jsNumberClass, classWorld)
|
| - || instructionType.contains(backend.jsIntClass, classWorld)
|
| - || instructionType.contains(backend.jsPositiveIntClass, classWorld)
|
| - || instructionType.contains(backend.jsUInt32Class, classWorld)
|
| - || instructionType.contains(backend.jsUInt31Class, classWorld)
|
| - || instructionType.contains(backend.jsDoubleClass, classWorld);
|
| + return containsType(instructionType, backend.jsNumberClass, classWorld)
|
| + || containsType(instructionType, backend.jsIntClass, classWorld)
|
| + || containsType(instructionType, backend.jsPositiveIntClass, classWorld)
|
| + || containsType(instructionType, backend.jsUInt32Class, classWorld)
|
| + || containsType(instructionType, backend.jsUInt31Class, classWorld)
|
| + || containsType(instructionType, backend.jsDoubleClass, classWorld);
|
| }
|
|
|
| bool canBePrimitiveBoolean(Compiler compiler) {
|
| ClassWorld classWorld = compiler.world;
|
| JavaScriptBackend backend = compiler.backend;
|
| - return instructionType.contains(backend.jsBoolClass, classWorld);
|
| + return containsType(instructionType, backend.jsBoolClass, classWorld);
|
| }
|
|
|
| bool canBePrimitiveArray(Compiler compiler) {
|
| ClassWorld classWorld = compiler.world;
|
| JavaScriptBackend backend = compiler.backend;
|
| - return instructionType.contains(backend.jsArrayClass, classWorld)
|
| - || instructionType.contains(backend.jsFixedArrayClass, classWorld)
|
| - || instructionType.contains(backend.jsExtendableArrayClass, classWorld)
|
| - || instructionType.contains(
|
| + return containsType(instructionType, backend.jsArrayClass, classWorld)
|
| + || containsType(instructionType, backend.jsFixedArrayClass, classWorld)
|
| + || containsType(
|
| + instructionType, backend.jsExtendableArrayClass, classWorld)
|
| + || containsType(instructionType,
|
| backend.jsUnmodifiableArrayClass, classWorld);
|
| }
|
|
|
| @@ -923,37 +950,43 @@ abstract class HInstruction implements Spannable {
|
| ClassWorld classWorld = compiler.world;
|
| JavaScriptBackend backend = compiler.backend;
|
| return instructionType.containsOnlyString(classWorld)
|
| - || instructionType.satisfies(backend.jsIndexableClass, classWorld);
|
| + || isInstanceOf(instructionType, backend.jsIndexableClass, classWorld);
|
| }
|
|
|
| bool isFixedArray(Compiler compiler) {
|
| + ClassWorld classWorld = compiler.world;
|
| JavaScriptBackend backend = compiler.backend;
|
| // TODO(sra): Recognize the union of these types as well.
|
| - return instructionType.containsOnly(backend.jsFixedArrayClass)
|
| - || instructionType.containsOnly(backend.jsUnmodifiableArrayClass);
|
| + return containsOnlyType(
|
| + instructionType, backend.jsFixedArrayClass, classWorld)
|
| + || containsOnlyType(
|
| + instructionType, backend.jsUnmodifiableArrayClass, classWorld);
|
| }
|
|
|
| bool isExtendableArray(Compiler compiler) {
|
| + ClassWorld classWorld = compiler.world;
|
| JavaScriptBackend backend = compiler.backend;
|
| - return instructionType.containsOnly(backend.jsExtendableArrayClass);
|
| + return containsOnlyType(
|
| + instructionType, backend.jsExtendableArrayClass, classWorld);
|
| }
|
|
|
| bool isMutableArray(Compiler compiler) {
|
| ClassWorld classWorld = compiler.world;
|
| JavaScriptBackend backend = compiler.backend;
|
| - return instructionType.satisfies(backend.jsMutableArrayClass, classWorld);
|
| + return isInstanceOf(
|
| + instructionType, backend.jsMutableArrayClass, classWorld);
|
| }
|
|
|
| bool isReadableArray(Compiler compiler) {
|
| ClassWorld classWorld = compiler.world;
|
| JavaScriptBackend backend = compiler.backend;
|
| - return instructionType.satisfies(backend.jsArrayClass, classWorld);
|
| + return isInstanceOf(instructionType, backend.jsArrayClass, classWorld);
|
| }
|
|
|
| bool isMutableIndexable(Compiler compiler) {
|
| ClassWorld classWorld = compiler.world;
|
| JavaScriptBackend backend = compiler.backend;
|
| - return instructionType.satisfies(
|
| + return isInstanceOf(instructionType,
|
| backend.jsMutableIndexableClass, classWorld);
|
| }
|
|
|
| @@ -962,7 +995,7 @@ abstract class HInstruction implements Spannable {
|
| bool canBePrimitiveString(Compiler compiler) {
|
| ClassWorld classWorld = compiler.world;
|
| JavaScriptBackend backend = compiler.backend;
|
| - return instructionType.contains(backend.jsStringClass, classWorld);
|
| + return containsType(instructionType, backend.jsStringClass, classWorld);
|
| }
|
|
|
| bool isInteger(Compiler compiler) {
|
| @@ -975,27 +1008,28 @@ abstract class HInstruction implements Spannable {
|
| ClassWorld classWorld = compiler.world;
|
| JavaScriptBackend backend = compiler.backend;
|
| return !instructionType.isNullable
|
| - && instructionType.satisfies(backend.jsUInt32Class, classWorld);
|
| + && isInstanceOf(instructionType, backend.jsUInt32Class, classWorld);
|
| }
|
|
|
| bool isUInt31(Compiler compiler) {
|
| ClassWorld classWorld = compiler.world;
|
| JavaScriptBackend backend = compiler.backend;
|
| return !instructionType.isNullable
|
| - && instructionType.satisfies(backend.jsUInt31Class, classWorld);
|
| + && isInstanceOf(instructionType, backend.jsUInt31Class, classWorld);
|
| }
|
|
|
| bool isPositiveInteger(Compiler compiler) {
|
| ClassWorld classWorld = compiler.world;
|
| JavaScriptBackend backend = compiler.backend;
|
| - return !instructionType.isNullable
|
| - && instructionType.satisfies(backend.jsPositiveIntClass, classWorld);
|
| + return !instructionType.isNullable &&
|
| + isInstanceOf(instructionType, backend.jsPositiveIntClass, classWorld);
|
| }
|
|
|
| bool isPositiveIntegerOrNull(Compiler compiler) {
|
| ClassWorld classWorld = compiler.world;
|
| JavaScriptBackend backend = compiler.backend;
|
| - return instructionType.satisfies(backend.jsPositiveIntClass, classWorld);
|
| + return isInstanceOf(
|
| + instructionType, backend.jsPositiveIntClass, classWorld);
|
| }
|
|
|
| bool isIntegerOrNull(Compiler compiler) {
|
|
|