Chromium Code Reviews| Index: lib/compiler/implementation/ssa/types.dart |
| diff --git a/lib/compiler/implementation/ssa/types.dart b/lib/compiler/implementation/ssa/types.dart |
| index 3c20c93c612d5df9719854e80e0e93e6e59bb9d9..84c857203375d1c7f53a2f23cb2c780fe80f62b8 100644 |
| --- a/lib/compiler/implementation/ssa/types.dart |
| +++ b/lib/compiler/implementation/ssa/types.dart |
| @@ -41,7 +41,7 @@ abstract class HType { |
| } |
| static final HType CONFLICTING = const HConflictingType(); |
| - static final HType UNKNOWN = const HAnalysisType("unknown"); |
| + static final HType UNKNOWN = const HUnknownType(); |
| static final HType BOOLEAN = const HBooleanType(); |
| static final HType NUMBER = const HNumberType(); |
| static final HType INTEGER = const HIntegerType(); |
| @@ -111,38 +111,39 @@ abstract class HType { |
| * * MUTABLE_ARRAY.union(READABLE_ARRAY) => READABLE_ARRAY. |
| * |
| * When there is no predefined type to represent the union returns |
| - * [CONFLICTING]. |
| + * [UNKNOWN]. |
| * |
| - * A union with [UNKNOWN] returns the non-UNKNOWN type. A union with |
| - * [CONFLICTING] returns [CONFLICTING]. |
| + * A union with [UNKNOWN] returns [UNKNOWN]. |
| + * A union of [CONFLICTING] with any other types returns the other type. |
|
sra1
2012/07/11 20:04:34
I find CONFLICTING to be a confusing name.
The ele
|
| */ |
| abstract HType union(HType other); |
| } |
| /** Used to represent [HType.UNKNOWN] and [HType.CONFLICTING]. */ |
| -class HAnalysisType extends HType { |
| +abstract class HAnalysisType extends HType { |
| final String name; |
| const HAnalysisType(this.name); |
| String toString() => name; |
| - bool canBePrimitive() => true; |
| - bool canBeNull() => true; |
| Type computeType(Compiler compiler) => null; |
| +} |
| - HType combine(HType other) { |
| - if (isUnknown()) return other; |
| - if (other.isUnknown()) return this; |
| - return HType.CONFLICTING; |
| - } |
| +class HUnknownType extends HAnalysisType { |
| + const HUnknownType() : super("unknown"); |
| + bool canBePrimitive() => true; |
| + bool canBeNull() => true; |
| - HType union(HType other) => combine(other); |
| - HType intersection(HType other) => combine(other); |
| + HType union(HType other) => this; |
| + HType intersection(HType other) => other; |
| } |
| class HConflictingType extends HAnalysisType { |
| const HConflictingType() : super("conflicting"); |
| bool canBePrimitive() => false; |
| bool canBeNull() => false; |
| + |
| + HType union(HType other) => other; |
| + HType intersection(HType other) => this; |
| } |
| abstract class HPrimitiveType extends HType { |
| @@ -160,13 +161,14 @@ class HNullType extends HPrimitiveType { |
| Type computeType(Compiler compiler) => null; |
| HType union(HType other) { |
| - if (other.isUnknown()) return HType.NULL; |
| + if (other.isConflicting()) return HType.NULL; |
| + if (other.isUnknown()) return HType.UNKNOWN; |
|
sra1
2012/07/11 20:04:34
Every union method needs to accomplish the bounded
|
| if (other.isString()) return HType.STRING_OR_NULL; |
| if (other.isInteger()) return HType.INTEGER_OR_NULL; |
| if (other.isDouble()) return HType.DOUBLE_OR_NULL; |
| if (other.isNumber()) return HType.NUMBER_OR_NULL; |
| if (other.isBoolean()) return HType.BOOLEAN_OR_NULL; |
| - if (!other.canBeNull()) return HType.CONFLICTING; |
| + if (!other.canBeNull()) return HType.UNKNOWN; |
|
sra1
2012/07/11 20:04:34
This is too pessimistic. HBoundedType should beco
|
| return other; |
| } |
| @@ -194,11 +196,12 @@ class HBooleanOrNullType extends HPrimitiveOrNullType { |
| } |
| HType union(HType other) { |
| - if (other.isUnknown()) return HType.BOOLEAN_OR_NULL; |
| + if (other.isConflicting()) return HType.BOOLEAN_OR_NULL; |
| + if (other.isUnknown()) return HType.UNKNOWN; |
| if (other.isBooleanOrNull()) return HType.BOOLEAN_OR_NULL; |
| if (other.isBoolean()) return HType.BOOLEAN_OR_NULL; |
| if (other.isNull()) return HType.BOOLEAN_OR_NULL; |
| - return HType.CONFLICTING; |
| + return HType.UNKNOWN; |
| } |
| HType intersection(HType other) { |
| @@ -220,11 +223,12 @@ class HBooleanType extends HPrimitiveType { |
| } |
| HType union(HType other) { |
| - if (other.isUnknown()) return HType.BOOLEAN; |
| + if (other.isConflicting()) return HType.BOOLEAN; |
| + if (other.isUnknown()) return HType.UNKNOWN; |
| if (other.isBoolean()) return HType.BOOLEAN; |
| if (other.isBooleanOrNull()) return HType.BOOLEAN_OR_NULL; |
| if (other.isNull()) return HType.BOOLEAN_OR_NULL; |
| - return HType.CONFLICTING; |
| + return HType.UNKNOWN; |
| } |
| HType intersection(HType other) { |
| @@ -245,11 +249,12 @@ class HNumberOrNullType extends HPrimitiveOrNullType { |
| } |
| HType union(HType other) { |
| - if (other.isUnknown()) return HType.NUMBER_OR_NULL; |
| + if (other.isConflicting()) return HType.NUMBER_OR_NULL; |
| + if (other.isUnknown()) return HType.UNKNOWN; |
| if (other.isNumberOrNull()) return HType.NUMBER_OR_NULL; |
| if (other.isNumber()) return HType.NUMBER_OR_NULL; |
| if (other.isNull()) return HType.NUMBER_OR_NULL; |
| - return HType.CONFLICTING; |
| + return HType.UNKNOWN; |
| } |
| HType intersection(HType other) { |
| @@ -275,11 +280,12 @@ class HNumberType extends HPrimitiveType { |
| } |
| HType union(HType other) { |
| + if (other.isConflicting()) return HType.NUMBER; |
| + if (other.isUnknown()) return HType.UNKNOWN; |
| if (other.isNumber()) return HType.NUMBER; |
| - if (other.isUnknown()) return HType.NUMBER; |
| if (other.isNumberOrNull()) return HType.NUMBER_OR_NULL; |
| if (other.isNull()) return HType.NUMBER_OR_NULL; |
| - return HType.CONFLICTING; |
| + return HType.UNKNOWN; |
| } |
| HType intersection(HType other) { |
| @@ -302,13 +308,14 @@ class HIntegerOrNullType extends HNumberOrNullType { |
| } |
| HType union(HType other) { |
| - if (other.isUnknown()) return HType.INTEGER_OR_NULL; |
| + if (other.isConflicting()) return HType.INTEGER_OR_NULL; |
| + if (other.isUnknown()) return HType.UNKNOWN; |
| if (other.isIntegerOrNull()) return HType.INTEGER_OR_NULL; |
| if (other.isInteger()) return HType.INTEGER_OR_NULL; |
| if (other.isNumber()) return HType.NUMBER_OR_NULL; |
| if (other.isNumberOrNull()) return HType.NUMBER_OR_NULL; |
| if (other.isNull()) return HType.INTEGER_OR_NULL; |
| - return HType.CONFLICTING; |
| + return HType.UNKNOWN; |
| } |
| HType intersection(HType other) { |
| @@ -334,13 +341,14 @@ class HIntegerType extends HNumberType { |
| } |
| HType union(HType other) { |
| - if (other.isUnknown()) return HType.INTEGER; |
| + if (other.isConflicting()) return HType.INTEGER; |
| + if (other.isUnknown()) return HType.UNKNOWN; |
| if (other.isInteger()) return HType.INTEGER; |
| if (other.isIntegerOrNull()) return HType.INTEGER_OR_NULL; |
| if (other.isNumber()) return HType.NUMBER; |
| if (other.isNumberOrNull()) return HType.NUMBER_OR_NULL; |
| if (other.isNull()) return HType.INTEGER_OR_NULL; |
| - return HType.CONFLICTING; |
| + return HType.UNKNOWN; |
| } |
| HType intersection(HType other) { |
| @@ -365,13 +373,14 @@ class HDoubleOrNullType extends HNumberOrNullType { |
| } |
| HType union(HType other) { |
| - if (other.isUnknown()) return HType.DOUBLE_OR_NULL; |
| + if (other.isConflicting()) return HType.DOUBLE_OR_NULL; |
| + if (other.isUnknown()) return HType.UNKNOWN; |
| if (other.isDoubleOrNull()) return HType.DOUBLE_OR_NULL; |
| if (other.isDouble()) return HType.DOUBLE_OR_NULL; |
| if (other.isNumber()) return HType.NUMBER_OR_NULL; |
| if (other.isNumberOrNull()) return HType.NUMBER_OR_NULL; |
| if (other.isNull()) return HType.DOUBLE_OR_NULL; |
| - return HType.CONFLICTING; |
| + return HType.UNKNOWN; |
| } |
| HType intersection(HType other) { |
| @@ -397,13 +406,14 @@ class HDoubleType extends HNumberType { |
| } |
| HType union(HType other) { |
| - if (other.isUnknown()) return HType.DOUBLE; |
| + if (other.isConflicting()) return HType.DOUBLE; |
| + if (other.isUnknown()) return HType.UNKNOWN; |
| if (other.isDouble()) return HType.DOUBLE; |
| if (other.isDoubleOrNull()) return HType.DOUBLE_OR_NULL; |
| if (other.isNumber()) return HType.NUMBER; |
| if (other.isNumberOrNull()) return HType.NUMBER_OR_NULL; |
| if (other.isNull()) return HType.DOUBLE_OR_NULL; |
| - return HType.CONFLICTING; |
| + return HType.UNKNOWN; |
| } |
| HType intersection(HType other) { |
| @@ -429,17 +439,18 @@ class HIndexablePrimitiveType extends HPrimitiveType { |
| } |
| HType union(HType other) { |
| - if (other.isUnknown()) return HType.INDEXABLE_PRIMITIVE; |
| + if (other.isConflicting()) return HType.INDEXABLE_PRIMITIVE; |
| + if (other.isUnknown()) return HType.UNKNOWN; |
| if (other.isIndexablePrimitive()) return HType.INDEXABLE_PRIMITIVE; |
| if (other is HBoundedPotentialPrimitiveString) { |
| // TODO(ngeoffray): Represent union types. |
| - return HType.CONFLICTING; |
| + return HType.UNKNOWN; |
| } |
| if (other is HBoundedPotentialPrimitiveArray) { |
| // TODO(ngeoffray): Represent union types. |
| - return HType.CONFLICTING; |
| + return HType.UNKNOWN; |
| } |
| - return HType.CONFLICTING; |
| + return HType.UNKNOWN; |
| } |
| HType intersection(HType other) { |
| @@ -461,13 +472,14 @@ class HStringOrNullType extends HPrimitiveOrNullType { |
| } |
| HType union(HType other) { |
| - if (other.isUnknown()) return HType.STRING_OR_NULL; |
| + if (other.isConflicting()) return HType.STRING_OR_NULL; |
| + if (other.isUnknown()) return HType.UNKNOWN; |
| if (other.isString()) return HType.STRING_OR_NULL; |
| if (other.isStringOrNull()) return HType.STRING_OR_NULL; |
| if (other.isIndexablePrimitive()) { |
| // We don't have a type that represents the nullable indexable |
| // primitive. |
| - return HType.CONFLICTING; |
| + return HType.UNKNOWN; |
| } |
| if (other is HBoundedPotentialPrimitiveString) { |
| if (other.canBeNull()) { |
| @@ -478,7 +490,7 @@ class HStringOrNullType extends HPrimitiveOrNullType { |
| } |
| } |
| if (other.isNull()) return HType.STRING_OR_NULL; |
| - return HType.CONFLICTING; |
| + return HType.UNKNOWN; |
| } |
| HType intersection(HType other) { |
| @@ -505,13 +517,14 @@ class HStringType extends HIndexablePrimitiveType { |
| } |
| HType union(HType other) { |
| - if (other.isUnknown()) return HType.STRING; |
| + if (other.isConflicting()) return HType.STRING; |
| + if (other.isUnknown()) return HType.UNKNOWN; |
| if (other.isString()) return HType.STRING; |
| if (other.isStringOrNull()) return HType.STRING_OR_NULL; |
| if (other.isIndexablePrimitive()) return HType.INDEXABLE_PRIMITIVE; |
| if (other is HBoundedPotentialPrimitiveString) return other; |
| if (other.isNull()) return HType.STRING_OR_NULL; |
| - return HType.CONFLICTING; |
| + return HType.UNKNOWN; |
| } |
| HType intersection(HType other) { |
| @@ -535,11 +548,12 @@ class HReadableArrayType extends HIndexablePrimitiveType { |
| } |
| HType union(HType other) { |
| - if (other.isUnknown()) return HType.READABLE_ARRAY; |
| + if (other.isConflicting()) return HType.READABLE_ARRAY; |
| + if (other.isUnknown()) return HType.UNKNOWN; |
| if (other.isReadableArray()) return HType.READABLE_ARRAY; |
| if (other.isIndexablePrimitive()) return HType.INDEXABLE_PRIMITIVE; |
| if (other is HBoundedPotentialPrimitiveArray) return other; |
| - return HType.CONFLICTING; |
| + return HType.UNKNOWN; |
| } |
| HType intersection(HType other) { |
| @@ -558,12 +572,13 @@ class HMutableArrayType extends HReadableArrayType { |
| String toString() => "mutable array"; |
| HType union(HType other) { |
| - if (other.isUnknown()) return HType.MUTABLE_ARRAY; |
| + if (other.isConflicting()) return HType.MUTABLE_ARRAY; |
| + if (other.isUnknown()) return HType.UNKNOWN; |
| if (other.isMutableArray()) return HType.MUTABLE_ARRAY; |
| if (other.isReadableArray()) return HType.READABLE_ARRAY; |
| if (other.isIndexablePrimitive()) return HType.INDEXABLE_PRIMITIVE; |
| if (other is HBoundedPotentialPrimitiveArray) return other; |
| - return HType.CONFLICTING; |
| + return HType.UNKNOWN; |
| } |
| HType intersection(HType other) { |
| @@ -582,13 +597,14 @@ class HExtendableArrayType extends HMutableArrayType { |
| String toString() => "extendable array"; |
| HType union(HType other) { |
| - if (other.isUnknown()) return HType.EXTENDABLE_ARRAY; |
| + if (other.isConflicting()) return HType.EXTENDABLE_ARRAY; |
| + if (other.isUnknown()) return HType.UNKNOWN; |
| if (other.isExtendableArray()) return HType.EXTENDABLE_ARRAY; |
| if (other.isMutableArray()) return HType.MUTABLE_ARRAY; |
| if (other.isReadableArray()) return HType.READABLE_ARRAY; |
| if (other.isIndexablePrimitive()) return HType.INDEXABLE_PRIMITIVE; |
| if (other is HBoundedPotentialPrimitiveArray) return other; |
| - return HType.CONFLICTING; |
| + return HType.UNKNOWN; |
| } |
| HType intersection(HType other) { |
| @@ -668,13 +684,13 @@ class HBoundedType extends HType { |
| } |
| if (other is HBoundedType) { |
| HBoundedType temp = other; |
| - if (type !== temp.type) return HType.CONFLICTING; |
| + if (type !== temp.type) return HType.UNKNOWN; |
| if (isExact()) return other; |
| if (other.isExact()) return this; |
| return canBeNull() ? this : other; |
| } |
| - if (other.isUnknown()) return this; |
| - return HType.CONFLICTING; |
| + if (other.isConflicting()) return this; |
| + return HType.UNKNOWN; |
| } |
| } |
| @@ -689,10 +705,10 @@ class HBoundedPotentialPrimitiveArray extends HBoundedPotentialPrimitiveType { |
| : super(type, canBeNull); |
| HType union(HType other) { |
| - if (other.isString()) return HType.CONFLICTING; |
| + if (other.isString()) return HType.UNKNOWN; |
| if (other.isReadableArray()) return this; |
| // TODO(ngeoffray): implement union types. |
| - if (other.isIndexablePrimitive()) return HType.CONFLICTING; |
| + if (other.isIndexablePrimitive()) return HType.UNKNOWN; |
| if (other.isNull()) { |
| if (canBeNull()) { |
| return this; |
| @@ -732,7 +748,7 @@ class HBoundedPotentialPrimitiveString extends HBoundedPotentialPrimitiveType { |
| } |
| } |
| // TODO(ngeoffray): implement union types. |
| - if (other.isIndexablePrimitive()) return HType.CONFLICTING; |
| + if (other.isIndexablePrimitive()) return HType.UNKNOWN; |
| return super.union(other); |
| } |