Index: sdk/lib/_internal/compiler/implementation/ssa/types.dart |
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/types.dart b/sdk/lib/_internal/compiler/implementation/ssa/types.dart |
index 46e11eb8e6e3dce0d1252ede78e9b27fe153e12b..974539aff6c28dcfd0fe47fd59a961ae3718aabe 100644 |
--- a/sdk/lib/_internal/compiler/implementation/ssa/types.dart |
+++ b/sdk/lib/_internal/compiler/implementation/ssa/types.dart |
@@ -47,8 +47,6 @@ abstract class HType { |
} else if (mask.isSubtype) { |
if (Elements.isNumberOrStringSupertype(element, compiler)) { |
return new HBoundedPotentialPrimitiveNumberOrString(mask); |
- } else if (Elements.isStringOnlySupertype(element, compiler)) { |
- return new HBoundedPotentialPrimitiveString(mask); |
} |
} |
if (!mask.isExact && (element == compiler.objectClass || |
@@ -722,8 +720,7 @@ class HStringOrNullType extends HPrimitiveOrNullType { |
return other; |
} else { |
HBoundedType boundedType = other; |
- return new HBoundedPotentialPrimitiveString( |
- boundedType.mask.nullable()); |
+ return new HBoundedType(boundedType.mask.nullable()); |
} |
} |
if (other.isNull()) return HType.STRING_OR_NULL; |
@@ -915,8 +912,8 @@ class HBoundedType extends HType { |
bool canBeNull() => mask.isNullable; |
bool canBePrimitive(Compiler compiler) { |
- // TODO(kasperl): Check for string, etc. |
- return canBePrimitiveArray(compiler); |
+ return canBePrimitiveArray(compiler) |
+ || canBePrimitiveString(compiler); |
} |
bool canBePrimitiveArray(Compiler compiler) { |
@@ -925,6 +922,12 @@ class HBoundedType extends HType { |
return mask.contains(jsArrayType, compiler); |
} |
+ bool canBePrimitiveString(Compiler compiler) { |
+ JavaScriptBackend backend = compiler.backend; |
+ DartType jsStringType = backend.jsStringClass.computeType(compiler); |
+ return mask.contains(jsStringType, compiler); |
+ } |
+ |
DartType computeType(Compiler compiler) => mask.base; |
TypeMask computeMask(Compiler compiler) => mask; |
@@ -947,6 +950,15 @@ class HBoundedType extends HType { |
if (other.isIndexablePrimitive()) return HType.READABLE_ARRAY; |
} |
+ if (canBePrimitiveString(compiler)) { |
+ if (other.isArray()) return HType.CONFLICTING; |
+ if (other.isString()) return HType.STRING; |
+ if (other.isStringOrNull()) { |
+ return canBeNull() ? HType.STRING_OR_NULL : HType.STRING; |
+ } |
+ if (other.isIndexablePrimitive()) return HType.STRING; |
+ } |
+ |
TypeMask otherMask = other.computeMask(compiler); |
if (otherMask != null) { |
TypeMask intersection = mask.intersection(otherMask, compiler.types); |
@@ -1065,44 +1077,3 @@ class HBoundedPotentialPrimitiveNumberOrString |
return super.intersection(other, compiler); |
} |
} |
- |
-class HBoundedPotentialPrimitiveString extends HBoundedPotentialPrimitiveType { |
- const HBoundedPotentialPrimitiveString(TypeMask mask) |
- : super(mask, false); |
- |
- bool isPrimitiveOrNull() => true; |
- |
- bool canBePrimitiveString(Compiler compiler) => true; |
- |
- HType union(HType other, Compiler compiler) { |
- if (other.isString()) return this; |
- if (other.isStringOrNull()) { |
- if (canBeNull()) { |
- return this; |
- } else { |
- return new HBoundedPotentialPrimitiveString(mask.nullable()); |
- } |
- } |
- if (other.isNull()) { |
- if (canBeNull()) { |
- return this; |
- } else { |
- return new HBoundedPotentialPrimitiveString(mask.nullable()); |
- } |
- } |
- // TODO(ngeoffray): implement union types. |
- if (other.isIndexablePrimitive()) return HType.UNKNOWN; |
- return super.union(other, compiler); |
- } |
- |
- HType intersection(HType other, Compiler compiler) { |
- if (other.isConflicting()) return HType.CONFLICTING; |
- if (other.isString()) return HType.STRING; |
- if (other.isStringOrNull()) { |
- return canBeNull() ? HType.STRING_OR_NULL : HType.STRING; |
- } |
- if (other.isReadableArray()) return HType.CONFLICTING; |
- if (other.isIndexablePrimitive()) return HType.STRING; |
- return super.intersection(other, compiler); |
- } |
-} |