Fix bug where element access fields have wrong type, and printing of array types
authorjjenista <jjenista>
Fri, 6 Mar 2009 00:38:16 +0000 (00:38 +0000)
committerjjenista <jjenista>
Fri, 6 Mar 2009 00:38:16 +0000 (00:38 +0000)
Robust/src/Analysis/OwnershipAnalysis/AllocationSite.java
Robust/src/Analysis/OwnershipAnalysis/OwnershipAnalysis.java
Robust/src/Analysis/OwnershipAnalysis/ReferenceEdge.java
Robust/src/IR/FieldDescriptor.java
Robust/src/IR/TypeDescriptor.java

index 5867a992259125af542546455a31fe84f3e333f8..96aa73eb0bfd2aa14fdea476ed7695f274b2d3bc 100644 (file)
@@ -191,9 +191,9 @@ public class AllocationSite {
 
   public String toStringForDOT() {
     if( disjointId != null ) {
-      return "disjoint "+disjointId+"\\n"+toString()+"\\n"+getType();
+      return "disjoint "+disjointId+"\\n"+toString()+"\\n"+getType().toPrettyString();
     } else {
-      return                              toString()+"\\n"+getType();
+      return                              toString()+"\\n"+getType().toPrettyString();
     }
   }
 }
index 650f29b41961e74c43b84a13b0bfce77d1f8eec1..2e093ef59823594183ffa95353729bd8f29c1f88 100644 (file)
@@ -271,12 +271,9 @@ public class OwnershipAnalysis {
   private LinkedList<MethodContext> sortedMethodContextsToVisit;
 
 
-  // a special field descriptor for all array elements
-  private static FieldDescriptor fdElement = new FieldDescriptor(new Modifiers(Modifiers.PUBLIC),
-                                                                 new TypeDescriptor("Array[]"),
-                                                                 "elements",
-                                                                 null,
-                                                                 false);
+  // special field descriptors for array elements
+  private Hashtable<TypeDescriptor, FieldDescriptor> mapTypeToArrayField;
+
 
   // a special temp descriptor for setting more than one parameter label
   // to the all-aliased-parameters heap region node
@@ -325,6 +322,8 @@ public class OwnershipAnalysis {
     mapDescriptorToAllMethodContexts = 
       new Hashtable<Descriptor, HashSet<MethodContext> >();
 
+    mapTypeToArrayField =
+      new Hashtable<TypeDescriptor, FieldDescriptor>();
 
     if( writeAllDOTs ) {
       mapMethodContextToNumUpdates = new Hashtable<MethodContext, Integer>();
@@ -701,6 +700,21 @@ public class OwnershipAnalysis {
       lhs = fen.getDst();
       rhs = fen.getSrc();
       if( !lhs.getType().isImmutable() || lhs.getType().isArray() ) {
+
+       assert rhs.getType() != null;
+       assert rhs.getType().isArray();
+       
+       TypeDescriptor  tdElement = rhs.getType().dereference();
+       FieldDescriptor fdElement = mapTypeToArrayField.get( tdElement );
+       if( fdElement == null ) {
+         fdElement = new FieldDescriptor(new Modifiers(Modifiers.PUBLIC),
+                                         tdElement,
+                                         "_element",
+                                         null,
+                                         false);
+         mapTypeToArrayField.put( tdElement, fdElement );
+       }
+  
        og.assignTempXEqualToTempYFieldF(lhs, rhs, fdElement);
       }
       break;
@@ -710,6 +724,25 @@ public class OwnershipAnalysis {
       lhs = fsen.getDst();
       rhs = fsen.getSrc();
       if( !rhs.getType().isImmutable() || rhs.getType().isArray() ) {
+
+       assert lhs.getType() != null;
+       assert lhs.getType().isArray();
+       
+       TypeDescriptor  tdElement = lhs.getType().dereference();
+
+       System.out.println( "lhs.Type  = "+lhs.getType().toPrettyString() );
+       System.out.println( "tdElement = "+tdElement.toPrettyString() );
+
+       FieldDescriptor fdElement = mapTypeToArrayField.get( tdElement );
+       if( fdElement == null ) {
+         fdElement = new FieldDescriptor(new Modifiers(Modifiers.PUBLIC),
+                                         tdElement,
+                                         "_element",
+                                         null,
+                                         false);
+         mapTypeToArrayField.put( tdElement, fdElement );
+       }
+
        og.assignTempXFieldFEqualToTempY(lhs, fdElement, rhs);
       }
       break;
index e47e85c02579d9cae4c3db55745537a9a5ec6238..58c8d9e30e18db43fcfaf954826bf22f2d85ff93 100644 (file)
@@ -162,7 +162,7 @@ public class ReferenceEdge {
     String edgeLabel = "";
 
     if( fieldDesc != null ) {
-      edgeLabel += fieldDesc.toStringBrief() + "\\n";
+      edgeLabel += fieldDesc.toPrettyStringBrief() + "\\n";
     }
 
     if( isInitialParamReflexive ) {
index edfb8959db0276f9c780451ea6f7f350dba58c81..324d0c46360dbede40298366df05c13d3a9e8971 100644 (file)
@@ -47,4 +47,8 @@ public class FieldDescriptor extends Descriptor {
   public String toStringBrief() {
     return td.toString()+" "+getSymbol();
   }
+
+  public String toPrettyStringBrief() {
+    return td.toPrettyString()+" "+getSymbol();
+  }
 }
index 014f584f4ff516c22f0fdc2abad28d81fc2795e2..fd95881f8b3d023ee5ed1862a380abde9f269aac 100644 (file)
@@ -278,13 +278,13 @@ public class TypeDescriptor extends Descriptor {
   }
 
   public String toPrettyString() {
-    if (type==CLASS) {
-      String str=name;
-      for(int i=0; i<arraycount; i++)
-       str+="[]";
-      return str;
-    } else
-      return decodeInt(type);
+    String str=name;
+    if (type!=CLASS) {
+      str=decodeInt(type);
+    }
+    for(int i=0; i<arraycount; i++)
+      str+="[]";
+    return str;    
   }
 
   private static String decodeInt(int type) {