--- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Tue Oct 23 13:58:56 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Thu Oct 25 11:09:36 2012 -0700
@@ -40,7 +40,7 @@
import static com.sun.tools.javac.code.Scope.*;
import static com.sun.tools.javac.code.Symbol.*;
import static com.sun.tools.javac.code.Type.*;
-import static com.sun.tools.javac.code.TypeTags.*;
+import static com.sun.tools.javac.code.TypeTag.*;
import static com.sun.tools.javac.util.ListBuffer.lb;
/**
@@ -605,8 +605,8 @@
}
//where
private boolean isSubtypeUncheckedInternal(Type t, Type s, Warner warn) {
- if (t.tag == ARRAY && s.tag == ARRAY) {
- if (((ArrayType)t).elemtype.tag <= lastBaseTag) {
+ if (t.hasTag(ARRAY) && s.hasTag(ARRAY)) {
+ if (((ArrayType)t).elemtype.isPrimitive()) {
return isSameType(elemtype(t), elemtype(s));
} else {
return isSubtypeUnchecked(elemtype(t), elemtype(s), warn);
@@ -664,7 +664,7 @@
if (t == s)
return true;
- if (s.tag >= firstPartialTag)
+ if (s.isPartial())
return isSuperType(s, t);
if (s.isCompound()) {
@@ -686,25 +686,27 @@
{
public Boolean visitType(Type t, Type s) {
switch (t.tag) {
- case BYTE: case CHAR:
- return (t.tag == s.tag ||
- t.tag + 2 <= s.tag && s.tag <= DOUBLE);
- case SHORT: case INT: case LONG: case FLOAT: case DOUBLE:
- return t.tag <= s.tag && s.tag <= DOUBLE;
- case BOOLEAN: case VOID:
- return t.tag == s.tag;
- case TYPEVAR:
- return isSubtypeNoCapture(t.getUpperBound(), s);
- case BOT:
- return
- s.tag == BOT || s.tag == CLASS ||
- s.tag == ARRAY || s.tag == TYPEVAR;
- case WILDCARD: //we shouldn't be here - avoids crash (see 7034495)
- case NONE:
- return false;
- default:
- throw new AssertionError("isSubtype " + t.tag);
- }
+ case BYTE:
+ return (!s.hasTag(CHAR) && t.getTag().isSubRangeOf(s.getTag()));
+ case CHAR:
+ return (!s.hasTag(SHORT) && t.getTag().isSubRangeOf(s.getTag()));
+ case SHORT: case INT: case LONG:
+ case FLOAT: case DOUBLE:
+ return t.getTag().isSubRangeOf(s.getTag());
+ case BOOLEAN: case VOID:
+ return t.hasTag(s.getTag());
+ case TYPEVAR:
+ return isSubtypeNoCapture(t.getUpperBound(), s);
+ case BOT:
+ return
+ s.hasTag(BOT) || s.hasTag(CLASS) ||
+ s.hasTag(ARRAY) || s.hasTag(TYPEVAR);
+ case WILDCARD: //we shouldn't be here - avoids crash (see 7034495)
+ case NONE:
+ return false;
+ default:
+ throw new AssertionError("isSubtype " + t.tag);
+ }
}
private Set<TypePair> cache = new HashSet<TypePair>();
@@ -774,7 +776,7 @@
@Override
public Boolean visitArrayType(ArrayType t, Type s) {
if (s.tag == ARRAY) {
- if (t.elemtype.tag <= lastBaseTag)
+ if (t.elemtype.isPrimitive())
return isSameType(t.elemtype, elemtype(s));
else
return isSubtypeNoCapture(t.elemtype, elemtype(s));
@@ -907,7 +909,7 @@
if (t == s)
return true;
- if (s.tag >= firstPartialTag)
+ if (s.isPartial())
return visit(s, t);
switch (t.tag) {
@@ -936,7 +938,7 @@
@Override
public Boolean visitWildcardType(WildcardType t, Type s) {
- if (s.tag >= firstPartialTag)
+ if (s.isPartial())
return visit(s, t);
else
return false;
@@ -947,7 +949,7 @@
if (t == s)
return true;
- if (s.tag >= firstPartialTag)
+ if (s.isPartial())
return visit(s, t);
if (s.isSuperBound() && !s.isExtendsBound())
@@ -976,10 +978,10 @@
if (t == s)
return true;
- if (s.tag >= firstPartialTag)
+ if (s.isPartial())
return visit(s, t);
- return s.tag == ARRAY
+ return s.hasTag(ARRAY)
&& containsTypeEquivalent(t.elemtype, elemtype(s));
}
@@ -1120,7 +1122,7 @@
}
public Boolean visitType(Type t, Type s) {
- if (s.tag >= firstPartialTag)
+ if (s.isPartial())
return containedBy(s, t);
else
return isSameType(t, s);
@@ -1142,7 +1144,7 @@
@Override
public Boolean visitWildcardType(WildcardType t, Type s) {
- if (s.tag >= firstPartialTag)
+ if (s.isPartial())
return containedBy(s, t);
else {
// debugContainsType(t, s);
@@ -1232,7 +1234,7 @@
switch (t.tag) {
case BYTE: case CHAR: case SHORT: case INT: case LONG: case FLOAT:
case DOUBLE:
- return s.tag <= DOUBLE;
+ return s.isNumeric();
case BOOLEAN:
return s.tag == BOOLEAN;
case VOID:
@@ -1373,8 +1375,7 @@
case CLASS:
return isSubtype(t, s);
case ARRAY:
- if (elemtype(t).tag <= lastBaseTag ||
- elemtype(s).tag <= lastBaseTag) {
+ if (elemtype(t).isPrimitive() || elemtype(s).isPrimitive()) {
return elemtype(t).tag == elemtype(s).tag;
} else {
return visit(elemtype(t), elemtype(s));
@@ -1648,8 +1649,8 @@
*/
public ArrayType makeArrayType(Type t) {
if (t.tag == VOID ||
- t.tag >= PACKAGE) {
- Assert.error("Type t must not be a a VOID or PACKAGE type, " + t.toString());
+ t.tag == PACKAGE) {
+ Assert.error("Type t must not be a VOID or PACKAGE type, " + t.toString());
}
return new ArrayType(t, syms.arrayClass);
}
@@ -1847,7 +1848,7 @@
public boolean isAssignable(Type t, Type s, Warner warn) {
if (t.tag == ERROR)
return true;
- if (t.tag <= INT && t.constValue() != null) {
+ if (t.tag.isSubRangeOf(INT) && t.constValue() != null) {
int value = ((Number)t.constValue()).intValue();
switch (s.tag) {
case BYTE:
@@ -1891,11 +1892,11 @@
// We don't want to erase primitive types and String type as that
// operation is idempotent. Also, erasing these could result in loss
// of information such as constant values attached to such types.
- return (t.tag <= lastBaseTag) || (syms.stringType.tsym == t.tsym);
+ return (t.isPrimitive()) || (syms.stringType.tsym == t.tsym);
}
private Type erasure(Type t, boolean recurse) {
- if (t.tag <= lastBaseTag)
+ if (t.isPrimitive())
return t; /* fast special case */
else
return erasure.visit(t, recurse);
@@ -1903,7 +1904,7 @@
// where
private SimpleVisitor<Type, Boolean> erasure = new SimpleVisitor<Type, Boolean>() {
public Type visitType(Type t, Boolean recurse) {
- if (t.tag <= lastBaseTag)
+ if (t.isPrimitive())
return t; /*fast special case*/
else
return t.map(recurse ? erasureRecFun : erasureFun);
@@ -3314,7 +3315,7 @@
private static final UnaryVisitor<Integer> hashCode = new UnaryVisitor<Integer>() {
public Integer visitType(Type t, Void ignored) {
- return t.tag;
+ return t.tag.ordinal();
}
@Override
@@ -3430,7 +3431,7 @@
* Return the class that boxes the given primitive.
*/
public ClassSymbol boxedClass(Type t) {
- return reader.enterClass(syms.boxedName[t.tag]);
+ return reader.enterClass(syms.boxedName[t.tag.ordinal()]);
}
/**