4 public class TypeUtil {
5 public static final String StringClass="String";
9 public TypeUtil(State state) {
14 public ClassDescriptor getClass(String classname) {
15 ClassDescriptor cd=(ClassDescriptor)state.getClassSymbolTable().get(classname);
19 private void createTables() {
20 supertable=new Hashtable();
21 Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();
22 while(classit.hasNext()) {
23 ClassDescriptor cd=(ClassDescriptor)classit.next();
24 String superc=cd.getSuper();
26 ClassDescriptor cd_super=getClass(superc);
27 supertable.put(cd,cd_super);
32 public ClassDescriptor getSuper(ClassDescriptor cd) {
33 return (ClassDescriptor)supertable.get(cd);
36 public boolean isSuperorType(TypeDescriptor possiblesuper, TypeDescriptor cd2) {
37 if (possiblesuper.isClass()&&
39 return isSuperorType(possiblesuper.getClassDesc(), cd2.getClassDesc());
40 else if (possiblesuper.isClass()&&
43 else if (possiblesuper.isNull())
44 throw new Error(); //not sure when this case would occur
45 else if (possiblesuper.isPrimitive()&&
47 ///Primitive widenings from 5.1.2
48 if (cd2.isByte()&&(possiblesuper.isByte()||possiblesuper.isShort()||
49 possiblesuper.isInt()||possiblesuper.isLong()||
50 possiblesuper.isFloat()||possiblesuper.isDouble()))
52 if (cd2.isShort()&&(possiblesuper.isShort()||
53 possiblesuper.isInt()||possiblesuper.isLong()||
54 possiblesuper.isFloat()||possiblesuper.isDouble()))
56 if (cd2.isChar()&&(possiblesuper.isChar()||
57 possiblesuper.isInt()||possiblesuper.isLong()||
58 possiblesuper.isFloat()||possiblesuper.isDouble()))
60 if (cd2.isInt()&&(possiblesuper.isInt()||possiblesuper.isLong()||
61 possiblesuper.isFloat()||possiblesuper.isDouble()))
63 if (cd2.isLong()&&(possiblesuper.isLong()||
64 possiblesuper.isFloat()||possiblesuper.isDouble()))
66 if (cd2.isFloat()&&(possiblesuper.isFloat()||possiblesuper.isDouble()))
68 if (cd2.isDouble()&&possiblesuper.isDouble())
71 if (cd2.isBoolean()&&possiblesuper.isBoolean())
75 } else throw new Error();
79 public boolean isSuperorType(ClassDescriptor possiblesuper, ClassDescriptor cd2) {
80 if (possiblesuper==cd2)
83 return isSuper(possiblesuper, cd2);
86 public boolean isSuper(ClassDescriptor possiblesuper, ClassDescriptor cd2) {
89 if (cd2==possiblesuper)