Fixed lots of bugs with increment operations and +=/etc...
[IRC.git] / Robust / src / IR / TypeDescriptor.java
index 4a880e2ac13e37bf5c7c0c966db80e5fadd15717..78270a0b2af4be737a1b405f6495a3ae2e80c33e 100644 (file)
@@ -20,12 +20,62 @@ public class TypeDescriptor extends Descriptor {
     public static final int CLASS=11;
 
 
-
+    int arraycount;
     int type;
     ClassDescriptor class_desc;
 
+    public boolean equals(Object o) {
+       if (o instanceof TypeDescriptor) {
+           TypeDescriptor t=(TypeDescriptor)o;
+           if (t.type!=type)
+               return false;
+           if ((type==CLASS)&&(t.class_desc!=class_desc))
+               return false;
+           if (t.arraycount!=arraycount)
+               return false;
+           return true;
+       }
+       return false;
+    }
+
+    public int hashCode() {
+       int hashcode=type^arraycount;
+       if (type==CLASS)
+           hashcode^=class_desc.hashCode();
+       return hashcode;
+    }
+
+    public TypeDescriptor makeArray(State state) {
+       TypeDescriptor td=new TypeDescriptor(getSymbol());
+       td.arraycount=arraycount+1;
+       td.type=type;
+       td.class_desc=class_desc;
+       state.addArrayType(td);
+       return td;
+    }
+
+    public boolean isArray() {
+       return (arraycount>0);
+    }
+
+    public int getArrayCount() {
+       return arraycount;
+    }
+
+    public TypeDescriptor dereference() {
+       TypeDescriptor td=new TypeDescriptor(getSymbol());
+       if (arraycount==0)
+           throw new Error();
+       td.arraycount=arraycount-1;
+       td.type=type;
+       td.class_desc=class_desc;
+       return td;
+    }
+
     public String getSafeSymbol() {
-       if (isClass())
+       if (isArray()) 
+           return IR.Flat.BuildCode.arraytype;
+       else if (isClass())
            return class_desc.getSafeSymbol();
        else if (isByte())
            return "char";
@@ -129,6 +179,11 @@ public class TypeDescriptor extends Descriptor {
        super(name.toString());
        this.type=CLASS;
        this.class_desc=null;
+       this.arraycount=0;
+    }
+
+    private TypeDescriptor(String st) {
+       super(st);
     }
 
     public ClassDescriptor getClassDesc() {
@@ -139,11 +194,13 @@ public class TypeDescriptor extends Descriptor {
        super(cd.getSymbol());
        this.type=CLASS;
        this.class_desc=cd;
+       this.arraycount=0;
     }
 
     public TypeDescriptor(int t) {
        super(decodeInt(t));
        this.type=t;
+       this.arraycount=0;
     }
 
     public String toString() {