Support cast nodes
authorjjenista <jjenista>
Fri, 6 Mar 2009 18:41:05 +0000 (18:41 +0000)
committerjjenista <jjenista>
Fri, 6 Mar 2009 18:41:05 +0000 (18:41 +0000)
Robust/src/Analysis/OwnershipAnalysis/OwnershipAnalysis.java
Robust/src/Analysis/OwnershipAnalysis/OwnershipGraph.java

index 2e093ef59823594183ffa95353729bd8f29c1f88..ac17f9bfd0237825b880627d3a34294d0aff0161 100644 (file)
@@ -274,6 +274,9 @@ public class OwnershipAnalysis {
   // special field descriptors for array elements
   private Hashtable<TypeDescriptor, FieldDescriptor> mapTypeToArrayField;
 
+  // special field descriptors for variables with type, no field name
+  private Hashtable<TypeDescriptor, FieldDescriptor> mapTypeToVarField;
+
 
   // a special temp descriptor for setting more than one parameter label
   // to the all-aliased-parameters heap region node
@@ -325,6 +328,9 @@ public class OwnershipAnalysis {
     mapTypeToArrayField =
       new Hashtable<TypeDescriptor, FieldDescriptor>();
 
+    mapTypeToVarField =
+      new Hashtable<TypeDescriptor, FieldDescriptor>();
+
     if( writeAllDOTs ) {
       mapMethodContextToNumUpdates = new Hashtable<MethodContext, Integer>();
     }
@@ -675,6 +681,26 @@ public class OwnershipAnalysis {
       }
       break;
 
+    case FKind.FlatCastNode:
+      FlatCastNode fcn = (FlatCastNode) fn;
+      lhs = fcn.getDst();
+      rhs = fcn.getSrc();
+      TypeDescriptor td = fcn.getType();
+      assert td != null;
+
+      FieldDescriptor fd = mapTypeToVarField.get( td );
+      if( fd == null ) {
+       fd = new FieldDescriptor(new Modifiers(Modifiers.PUBLIC),
+                                td,
+                                "",
+                                null,
+                                false);
+       mapTypeToVarField.put( td, fd );
+      }
+      
+      og.assignTypedTempXEqualToTempY(lhs, rhs, fd);
+      break;
+
     case FKind.FlatFieldNode:
       FlatFieldNode ffn = (FlatFieldNode) fn;
       lhs = ffn.getDst();
@@ -729,10 +755,6 @@ public class OwnershipAnalysis {
        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),
index 5aafa3ac3d8075499854aa610a5968fcd02b35b7..13abf6f79d73cfb51eb96eb763793b76fc25be03 100644 (file)
@@ -407,6 +407,28 @@ public class OwnershipGraph {
   }
 
 
+  public void assignTypedTempXEqualToTempY(TempDescriptor x,
+                                          TempDescriptor y,
+                                          FieldDescriptor f) {
+
+    LabelNode lnX = getLabelNodeFromTemp(x);
+    LabelNode lnY = getLabelNodeFromTemp(y);
+    
+    clearReferenceEdgesFrom(lnX, null, true);
+
+    Iterator<ReferenceEdge> itrYhrn = lnY.iteratorToReferencees();
+    while( itrYhrn.hasNext() ) {
+      ReferenceEdge edgeY       = itrYhrn.next();
+      HeapRegionNode referencee = edgeY.getDst();
+      ReferenceEdge edgeNew    = edgeY.copy();
+      edgeNew.setSrc(lnX);
+      edgeNew.setFieldDesc(f);
+
+      addReferenceEdge(lnX, referencee, edgeNew);
+    }
+  }
+
+
   public void assignTempXEqualToTempYFieldF(TempDescriptor x,
                                             TempDescriptor y,
                                             FieldDescriptor f) {
@@ -1800,7 +1822,7 @@ public class OwnershipGraph {
     // if the type is not a class don't match because
     // primitives are copied, no memory aliases
     ClassDescriptor cdDst = tdDst.getClassDesc();
-    if( cdDst == null ) {
+    if( cdDst == null && !tdDst.isArray() ) {
       return false;
     }