Adding functionality for printing sets.
[repair.git] / Repair / RepairCompiler / MCC / IR / StructureTypeDescriptor.java
index 7b6e5148c8c88ca8a4b565a26925fe23942376e7..f7e19dcb49663b79c18bb89117044cc7232ada8a 100755 (executable)
@@ -15,16 +15,10 @@ public class StructureTypeDescriptor extends TypeDescriptor {
     Hashtable fields = new Hashtable(); /* fast lookups */
     Vector fieldlist = new Vector(); /* ordering information */
     Hashtable labels = new Hashtable();
     Hashtable fields = new Hashtable(); /* fast lookups */
     Vector fieldlist = new Vector(); /* ordering information */
     Hashtable labels = new Hashtable();
-    int idnum;
-    static int counter=0;
 
 
-    public int getId() {
-       return idnum;
-    }
 
     public StructureTypeDescriptor(String name) {
         super(name);
 
     public StructureTypeDescriptor(String name) {
         super(name);
-       idnum=counter++;
     }
 
     public TypeDescriptor getGenerateType() {
     }
 
     public TypeDescriptor getGenerateType() {
@@ -55,7 +49,6 @@ public class StructureTypeDescriptor extends TypeDescriptor {
             boolean ptr = fd.getPtr();
             Expr basesize; 
             if (ptr) { /* ptrs are 32bits */
             boolean ptr = fd.getPtr();
             Expr basesize; 
             if (ptr) { /* ptrs are 32bits */
-               
                basesize = new IntegerLiteralExpr(32);
             } else {
                basesize = td.getSizeExpr();
                basesize = new IntegerLiteralExpr(32);
             } else {
                basesize = td.getSizeExpr();
@@ -85,7 +78,7 @@ public class StructureTypeDescriptor extends TypeDescriptor {
            }
 
             if (fd == field) { /* stop, reached target field */
            }
 
             if (fd == field) { /* stop, reached target field */
-                break; 
+                break;
             }
 
             size = new OpExpr(Opcode.ADD, fieldsize, size);
             }
 
             size = new OpExpr(Opcode.ADD, fieldsize, size);
@@ -139,8 +132,30 @@ public class StructureTypeDescriptor extends TypeDescriptor {
         if (td == this) {
             return true;
         } else {
         if (td == this) {
             return true;
         } else {
+           if (subtype==null)
+               return false;
             return subtype.isSubtypeOf(td);
         }
     }
 
             return subtype.isSubtypeOf(td);
         }
     }
 
+    public void generate_printout(CodeWriter cr, VarDescriptor vd) {
+       // #TBD#: does not support printing out fields that have variable size, substructures, etc
+
+       cr.outputline("printf(\"" + getSymbol() + " %p: \", " + vd.getSafeSymbol() + ");");     
+       for (int i = 0; i < fieldlist.size(); i++) {
+           FieldDescriptor fd = (FieldDescriptor) fieldlist.elementAt(i);                                                      
+           cr.outputline("printf(\"\\n\\t" + fd.getSymbol() + " = \");");
+           if (fd.getPtr()) { 
+               cr.outputline("printf(\"(" + fd.getType().getSymbol() + ") %p \", ((int *)" + vd.getSafeSymbol() + ")[" + i + "]);");
+           } else if ( fd.getType() instanceof ReservedTypeDescriptor) {
+               cr.outputline("printf(\"%d \", ((int *)" + vd.getSafeSymbol() + ")[" + i + "]);");              
+           } else {
+               cr.outputline("printf(\"unsupported, breaking\");");
+               break;
+           }
+       }
+       
+       cr.outputline("printf(\"\\n\");");
+    }
+
 }
 }