600ec9b937b2becdafc093674d1e51ec5df1e5fe
[IRC.git] / Robust / src / IR / TypeUtil.java
1 package IR;
2 import java.util.*;
3
4 public class TypeUtil {
5     public static final String StringClass="String";
6     State state;
7     Hashtable supertable;
8
9     public TypeUtil(State state) {
10         this.state=state;
11         createTables();
12     }
13
14     public ClassDescriptor getClass(String classname) {
15         ClassDescriptor cd=(ClassDescriptor)state.getClassSymbolTable().get(classname);
16         return cd;
17     }
18
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();
25             if (superc!=null) {
26                 ClassDescriptor cd_super=getClass(superc);
27                 supertable.put(cd,cd_super);
28             }
29         }
30     }
31
32     public ClassDescriptor getSuper(ClassDescriptor cd) {
33         return (ClassDescriptor)supertable.get(cd);
34     }
35
36     public boolean isSuperorType(TypeDescriptor possiblesuper, TypeDescriptor cd2) {
37         if (possiblesuper.isClass()&&
38              cd2.isClass())
39             return isSuperorType(possiblesuper.getClassDesc(), cd2.getClassDesc());
40         else if (possiblesuper.isClass()&&
41                  cd2.isNull())
42             return true;
43         else if (possiblesuper.isNull())
44             throw new Error(); //not sure when this case would occur
45         else if (possiblesuper.isPrimitive()&&
46                  cd2.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()))
51                 return true;
52             if (cd2.isShort()&&(possiblesuper.isShort()||
53                                 possiblesuper.isInt()||possiblesuper.isLong()||
54                                 possiblesuper.isFloat()||possiblesuper.isDouble()))
55                 return true;
56             if (cd2.isChar()&&(possiblesuper.isChar()||
57                                possiblesuper.isInt()||possiblesuper.isLong()||
58                                possiblesuper.isFloat()||possiblesuper.isDouble()))
59                 return true;
60             if (cd2.isInt()&&(possiblesuper.isInt()||possiblesuper.isLong()||
61                               possiblesuper.isFloat()||possiblesuper.isDouble()))
62                 return true;
63             if (cd2.isLong()&&(possiblesuper.isLong()||
64                                possiblesuper.isFloat()||possiblesuper.isDouble()))
65                 return true;
66             if (cd2.isFloat()&&(possiblesuper.isFloat()||possiblesuper.isDouble()))
67                 return true;
68             if (cd2.isDouble()&&possiblesuper.isDouble())
69                 
70                 return true;
71             if (cd2.isBoolean()&&possiblesuper.isBoolean())
72                 return true;
73             
74             return false;
75         } else throw new Error();
76     }
77
78
79     public boolean isSuperorType(ClassDescriptor possiblesuper, ClassDescriptor cd2) {
80         if (possiblesuper==cd2)
81             return true;
82         else
83             return isSuper(possiblesuper, cd2);
84     }
85
86     public boolean isSuper(ClassDescriptor possiblesuper, ClassDescriptor cd2) {
87         while(cd2!=null) {
88             cd2=getSuper(cd2);
89             if (cd2==possiblesuper)
90                 return true;
91         }
92         return false;
93     }
94 }