| 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 712ff298bf4671b42b0350325a08196fcdd62538..bbd214ca1335fc5531b5ad1449ca6538dd58a834 100644
|
| --- a/pkg/compiler/lib/src/ssa/nodes.dart
|
| +++ b/pkg/compiler/lib/src/ssa/nodes.dart
|
| @@ -4,6 +4,7 @@
|
|
|
| import '../closure.dart';
|
| import '../common.dart';
|
| +import '../common/backend_api.dart' show BackendClasses;
|
| import '../compiler.dart' show Compiler;
|
| import '../constants/constant_system.dart';
|
| import '../constants/values.dart';
|
| @@ -949,203 +950,168 @@ abstract class HInstruction implements Spannable {
|
| typeMask.satisfies(cls, closedWorld);
|
| }
|
|
|
| - bool canBePrimitive(Compiler compiler) {
|
| - return canBePrimitiveNumber(compiler) ||
|
| - canBePrimitiveArray(compiler) ||
|
| - canBePrimitiveBoolean(compiler) ||
|
| - canBePrimitiveString(compiler) ||
|
| + bool canBePrimitive(ClosedWorld closedWorld) {
|
| + return canBePrimitiveNumber(closedWorld) ||
|
| + canBePrimitiveArray(closedWorld) ||
|
| + canBePrimitiveBoolean(closedWorld) ||
|
| + canBePrimitiveString(closedWorld) ||
|
| isNull();
|
| }
|
|
|
| - bool canBePrimitiveNumber(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| - JavaScriptBackend backend = compiler.backend;
|
| - BackendHelpers helpers = backend.helpers;
|
| + bool canBePrimitiveNumber(ClosedWorld closedWorld) {
|
| + BackendClasses backendClasses = closedWorld.backendClasses;
|
| // TODO(sra): It should be possible to test only jsDoubleClass and
|
| // jsUInt31Class, since all others are superclasses of these two.
|
| - return containsType(instructionType, helpers.jsNumberClass, closedWorld) ||
|
| - containsType(instructionType, helpers.jsIntClass, closedWorld) ||
|
| + return containsType(
|
| + instructionType, backendClasses.numImplementation, closedWorld) ||
|
| + containsType(
|
| + instructionType, backendClasses.intImplementation, closedWorld) ||
|
| + containsType(instructionType, backendClasses.positiveIntImplementation,
|
| + closedWorld) ||
|
| + containsType(instructionType, backendClasses.uint32Implementation,
|
| + closedWorld) ||
|
| + containsType(instructionType, backendClasses.uint31Implementation,
|
| + closedWorld) ||
|
| containsType(
|
| - instructionType, helpers.jsPositiveIntClass, closedWorld) ||
|
| - containsType(instructionType, helpers.jsUInt32Class, closedWorld) ||
|
| - containsType(instructionType, helpers.jsUInt31Class, closedWorld) ||
|
| - containsType(instructionType, helpers.jsDoubleClass, closedWorld);
|
| + instructionType, backendClasses.doubleImplementation, closedWorld);
|
| }
|
|
|
| - bool canBePrimitiveBoolean(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| - JavaScriptBackend backend = compiler.backend;
|
| - BackendHelpers helpers = backend.helpers;
|
| - return containsType(instructionType, helpers.jsBoolClass, closedWorld);
|
| + bool canBePrimitiveBoolean(ClosedWorld closedWorld) {
|
| + return containsType(instructionType,
|
| + closedWorld.backendClasses.boolImplementation, closedWorld);
|
| }
|
|
|
| - bool canBePrimitiveArray(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| - JavaScriptBackend backend = compiler.backend;
|
| - BackendHelpers helpers = backend.helpers;
|
| - return containsType(instructionType, helpers.jsArrayClass, closedWorld) ||
|
| - containsType(instructionType, helpers.jsFixedArrayClass, closedWorld) ||
|
| - containsType(
|
| - instructionType, helpers.jsExtendableArrayClass, closedWorld) ||
|
| - containsType(
|
| - instructionType, helpers.jsUnmodifiableArrayClass, closedWorld);
|
| + bool canBePrimitiveArray(ClosedWorld closedWorld) {
|
| + BackendClasses backendClasses = closedWorld.backendClasses;
|
| + return containsType(
|
| + instructionType, backendClasses.listImplementation, closedWorld) ||
|
| + containsType(instructionType, backendClasses.fixedListImplementation,
|
| + closedWorld) ||
|
| + containsType(instructionType, backendClasses.growableListImplementation,
|
| + closedWorld) ||
|
| + containsType(instructionType, backendClasses.constListImplementation,
|
| + closedWorld);
|
| }
|
|
|
| - bool isIndexablePrimitive(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| - JavaScriptBackend backend = compiler.backend;
|
| - BackendHelpers helpers = backend.helpers;
|
| + bool isIndexablePrimitive(ClosedWorld closedWorld) {
|
| return instructionType.containsOnlyString(closedWorld) ||
|
| - isInstanceOf(instructionType, helpers.jsIndexableClass, closedWorld);
|
| + isInstanceOf(instructionType,
|
| + closedWorld.backendClasses.indexableImplementation, closedWorld);
|
| }
|
|
|
| - bool isFixedArray(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| - JavaScriptBackend backend = compiler.backend;
|
| - BackendHelpers helpers = backend.helpers;
|
| + bool isFixedArray(ClosedWorld closedWorld) {
|
| + BackendClasses backendClasses = closedWorld.backendClasses;
|
| // TODO(sra): Recognize the union of these types as well.
|
| - return containsOnlyType(
|
| - instructionType, helpers.jsFixedArrayClass, closedWorld) ||
|
| - containsOnlyType(
|
| - instructionType, helpers.jsUnmodifiableArrayClass, closedWorld);
|
| + return containsOnlyType(instructionType,
|
| + backendClasses.fixedListImplementation, closedWorld) ||
|
| + containsOnlyType(instructionType,
|
| + backendClasses.constListImplementation, closedWorld);
|
| }
|
|
|
| - bool isExtendableArray(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| - JavaScriptBackend backend = compiler.backend;
|
| - BackendHelpers helpers = backend.helpers;
|
| - return containsOnlyType(
|
| - instructionType, helpers.jsExtendableArrayClass, closedWorld);
|
| + bool isExtendableArray(ClosedWorld closedWorld) {
|
| + return containsOnlyType(instructionType,
|
| + closedWorld.backendClasses.growableListImplementation, closedWorld);
|
| }
|
|
|
| - bool isMutableArray(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| - JavaScriptBackend backend = compiler.backend;
|
| - BackendHelpers helpers = backend.helpers;
|
| - return isInstanceOf(
|
| - instructionType, helpers.jsMutableArrayClass, closedWorld);
|
| + bool isMutableArray(ClosedWorld closedWorld) {
|
| + return isInstanceOf(instructionType,
|
| + closedWorld.backendClasses.mutableListImplementation, closedWorld);
|
| }
|
|
|
| - bool isReadableArray(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| - JavaScriptBackend backend = compiler.backend;
|
| - BackendHelpers helpers = backend.helpers;
|
| - return isInstanceOf(instructionType, helpers.jsArrayClass, closedWorld);
|
| + bool isReadableArray(ClosedWorld closedWorld) {
|
| + return isInstanceOf(instructionType,
|
| + closedWorld.backendClasses.listImplementation, closedWorld);
|
| }
|
|
|
| - bool isMutableIndexable(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| - JavaScriptBackend backend = compiler.backend;
|
| - BackendHelpers helpers = backend.helpers;
|
| - return isInstanceOf(
|
| - instructionType, helpers.jsMutableIndexableClass, closedWorld);
|
| + bool isMutableIndexable(ClosedWorld closedWorld) {
|
| + return isInstanceOf(instructionType,
|
| + closedWorld.backendClasses.mutableIndexableImplementation, closedWorld);
|
| }
|
|
|
| - bool isArray(Compiler compiler) => isReadableArray(compiler);
|
| + bool isArray(ClosedWorld closedWorld) => isReadableArray(closedWorld);
|
|
|
| - bool canBePrimitiveString(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| - JavaScriptBackend backend = compiler.backend;
|
| - BackendHelpers helpers = backend.helpers;
|
| - return containsType(instructionType, helpers.jsStringClass, closedWorld);
|
| + bool canBePrimitiveString(ClosedWorld closedWorld) {
|
| + return containsType(instructionType,
|
| + closedWorld.backendClasses.stringImplementation, closedWorld);
|
| }
|
|
|
| - bool isInteger(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| + bool isInteger(ClosedWorld closedWorld) {
|
| return instructionType.containsOnlyInt(closedWorld) &&
|
| !instructionType.isNullable;
|
| }
|
|
|
| - bool isUInt32(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| - JavaScriptBackend backend = compiler.backend;
|
| - BackendHelpers helpers = backend.helpers;
|
| + bool isUInt32(ClosedWorld closedWorld) {
|
| return !instructionType.isNullable &&
|
| - isInstanceOf(instructionType, helpers.jsUInt32Class, closedWorld);
|
| + isInstanceOf(instructionType,
|
| + closedWorld.backendClasses.uint32Implementation, closedWorld);
|
| }
|
|
|
| - bool isUInt31(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| - JavaScriptBackend backend = compiler.backend;
|
| - BackendHelpers helpers = backend.helpers;
|
| + bool isUInt31(ClosedWorld closedWorld) {
|
| return !instructionType.isNullable &&
|
| - isInstanceOf(instructionType, helpers.jsUInt31Class, closedWorld);
|
| + isInstanceOf(instructionType,
|
| + closedWorld.backendClasses.uint31Implementation, closedWorld);
|
| }
|
|
|
| - bool isPositiveInteger(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| - JavaScriptBackend backend = compiler.backend;
|
| - BackendHelpers helpers = backend.helpers;
|
| + bool isPositiveInteger(ClosedWorld closedWorld) {
|
| return !instructionType.isNullable &&
|
| - isInstanceOf(instructionType, helpers.jsPositiveIntClass, closedWorld);
|
| + isInstanceOf(instructionType,
|
| + closedWorld.backendClasses.positiveIntImplementation, closedWorld);
|
| }
|
|
|
| - bool isPositiveIntegerOrNull(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| - JavaScriptBackend backend = compiler.backend;
|
| - BackendHelpers helpers = backend.helpers;
|
| - return isInstanceOf(
|
| - instructionType, helpers.jsPositiveIntClass, closedWorld);
|
| + bool isPositiveIntegerOrNull(ClosedWorld closedWorld) {
|
| + return isInstanceOf(instructionType,
|
| + closedWorld.backendClasses.positiveIntImplementation, closedWorld);
|
| }
|
|
|
| - bool isIntegerOrNull(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| + bool isIntegerOrNull(ClosedWorld closedWorld) {
|
| return instructionType.containsOnlyInt(closedWorld);
|
| }
|
|
|
| - bool isNumber(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| + bool isNumber(ClosedWorld closedWorld) {
|
| return instructionType.containsOnlyNum(closedWorld) &&
|
| !instructionType.isNullable;
|
| }
|
|
|
| - bool isNumberOrNull(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| + bool isNumberOrNull(ClosedWorld closedWorld) {
|
| return instructionType.containsOnlyNum(closedWorld);
|
| }
|
|
|
| - bool isDouble(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| + bool isDouble(ClosedWorld closedWorld) {
|
| return instructionType.containsOnlyDouble(closedWorld) &&
|
| !instructionType.isNullable;
|
| }
|
|
|
| - bool isDoubleOrNull(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| + bool isDoubleOrNull(ClosedWorld closedWorld) {
|
| return instructionType.containsOnlyDouble(closedWorld);
|
| }
|
|
|
| - bool isBoolean(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| + bool isBoolean(ClosedWorld closedWorld) {
|
| return instructionType.containsOnlyBool(closedWorld) &&
|
| !instructionType.isNullable;
|
| }
|
|
|
| - bool isBooleanOrNull(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| + bool isBooleanOrNull(ClosedWorld closedWorld) {
|
| return instructionType.containsOnlyBool(closedWorld);
|
| }
|
|
|
| - bool isString(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| + bool isString(ClosedWorld closedWorld) {
|
| return instructionType.containsOnlyString(closedWorld) &&
|
| !instructionType.isNullable;
|
| }
|
|
|
| - bool isStringOrNull(Compiler compiler) {
|
| - ClosedWorld closedWorld = compiler.closedWorld;
|
| + bool isStringOrNull(ClosedWorld closedWorld) {
|
| return instructionType.containsOnlyString(closedWorld);
|
| }
|
|
|
| - bool isPrimitive(Compiler compiler) {
|
| - return (isPrimitiveOrNull(compiler) && !instructionType.isNullable) ||
|
| + bool isPrimitive(ClosedWorld closedWorld) {
|
| + return (isPrimitiveOrNull(closedWorld) && !instructionType.isNullable) ||
|
| isNull();
|
| }
|
|
|
| - bool isPrimitiveOrNull(Compiler compiler) {
|
| - return isIndexablePrimitive(compiler) ||
|
| - isNumberOrNull(compiler) ||
|
| - isBooleanOrNull(compiler) ||
|
| + bool isPrimitiveOrNull(ClosedWorld closedWorld) {
|
| + return isIndexablePrimitive(closedWorld) ||
|
| + isNumberOrNull(closedWorld) ||
|
| + isBooleanOrNull(closedWorld) ||
|
| isNull();
|
| }
|
|
|
| @@ -1364,7 +1330,7 @@ abstract class HInstruction implements Spannable {
|
| return false;
|
| }
|
|
|
| - HInstruction convertType(Compiler compiler, DartType type, int kind) {
|
| + HInstruction convertType(ClosedWorld closedWorld, DartType type, int kind) {
|
| if (type == null) return this;
|
| type = type.unaliased;
|
| // Only the builder knows how to create [HTypeConversion]
|
| @@ -1374,19 +1340,20 @@ abstract class HInstruction implements Spannable {
|
| assert(type.treatAsRaw || type.isFunctionType);
|
| if (type.isDynamic) return this;
|
| if (type.isObject) return this;
|
| - JavaScriptBackend backend = compiler.backend;
|
| if (type.isVoid || type.isFunctionType || type.isMalformed) {
|
| - return new HTypeConversion(type, kind, backend.dynamicType, this);
|
| + return new HTypeConversion(
|
| + type, kind, closedWorld.commonMasks.dynamicType, this);
|
| }
|
| assert(type.isInterfaceType);
|
| if (kind == HTypeConversion.BOOLEAN_CONVERSION_CHECK) {
|
| // Boolean conversion checks work on non-nullable booleans.
|
| - return new HTypeConversion(type, kind, backend.boolType, this);
|
| + return new HTypeConversion(
|
| + type, kind, closedWorld.commonMasks.boolType, this);
|
| } else if (kind == HTypeConversion.CHECKED_MODE_CHECK && !type.treatAsRaw) {
|
| throw 'creating compound check to $type (this = ${this})';
|
| } else {
|
| Entity cls = type.element;
|
| - TypeMask subtype = new TypeMask.subtype(cls, compiler.closedWorld);
|
| + TypeMask subtype = new TypeMask.subtype(cls, closedWorld);
|
| return new HTypeConversion(type, kind, subtype, this);
|
| }
|
| }
|
| @@ -1412,8 +1379,8 @@ class HRef extends HInstruction {
|
| HInstruction get value => inputs[0];
|
|
|
| @override
|
| - HInstruction convertType(Compiler compiler, DartType type, int kind) {
|
| - HInstruction converted = value.convertType(compiler, type, kind);
|
| + HInstruction convertType(ClosedWorld closedWorld, DartType type, int kind) {
|
| + HInstruction converted = value.convertType(closedWorld, type, kind);
|
| if (converted == value) return this;
|
| HTypeConversion conversion = converted;
|
| conversion.inputs[0] = this;
|
| @@ -2862,7 +2829,7 @@ class HTypeConversion extends HCheck {
|
| HInstruction get checkedInput =>
|
| usesMethodOnType ? inputs[1] : super.checkedInput;
|
|
|
| - HInstruction convertType(Compiler compiler, DartType type, int kind) {
|
| + HInstruction convertType(ClosedWorld closedWorld, DartType type, int kind) {
|
| if (typeExpression == type) {
|
| // Don't omit a boolean conversion (which doesn't allow `null`) unless
|
| // this type conversion is already a boolean conversion.
|
| @@ -2870,7 +2837,7 @@ class HTypeConversion extends HCheck {
|
| return this;
|
| }
|
| }
|
| - return super.convertType(compiler, type, kind);
|
| + return super.convertType(closedWorld, type, kind);
|
| }
|
|
|
| bool get isCheckedModeCheck {
|
|
|