Chromium Code Reviews| 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]. |
|
Johnni Winther
2015/09/11 11:48:40
The need for these is triggered because we now enq
|
| + 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) { |