Added some extra logic for rehashing all effects by allocsite and (incomplete) logic...
authorstephey <stephey>
Fri, 3 Sep 2010 01:54:09 +0000 (01:54 +0000)
committerstephey <stephey>
Fri, 3 Sep 2010 01:54:09 +0000 (01:54 +0000)
Robust/src/IR/Flat/RuntimeConflictResolver.java

index 2cee5694ee63c48d1cbb09ac6ed353b9ba9bb1a2..87182353b0b7c92bbe3a1118575b7b07b4caa532 100644 (file)
@@ -25,7 +25,7 @@ import IR.TypeDescriptor;
  * 3) Call void close()
  */
 public class RuntimeConflictResolver {
-  private static final boolean javaDebug = false;
+  public static final boolean javaDebug = true;
   public static final boolean cSideDebug = true;
   
   private PrintWriter cFile;
@@ -761,4 +761,73 @@ public class RuntimeConflictResolver {
               " NumOfConParents=" + getNumOfReachableParents() + " ObjectChildren=" + objectRefs.size();
     }
   }
+  
+  //TODO integrate this code into the generateEffectsLookupTable method and 
+  //others that may use this table. 
+  private class EffectsTable {
+    private Hashtable<AllocSite, BucketOfEffects> table;
+    // hashtable provides fast access to heaproot # lookups
+    private Hashtable<Taint, Integer> WeaklyConnetedHeapRootNums;
+    private boolean analysisComplete;
+
+    public EffectsTable(Hashtable<Taint, Set<Effect>> effects,
+        Hashtable<Taint, Set<Effect>> conflicts) {
+      table = new Hashtable<AllocSite, BucketOfEffects>();
+      analysisComplete = false;
+
+      // rehash all effects (as a 5-tuple) by their affected allocation site
+      for (Taint t : effects.keySet()) {
+        Set<Effect> localConflicts = conflicts.get(t);
+
+        for (Effect e : effects.get(t)) {
+          BucketOfEffects bucket;
+          if ((bucket = table.get(e.getAffectedAllocSite())) == null) {
+            bucket = new BucketOfEffects();
+            table.put(e.getAffectedAllocSite(), bucket);
+          }
+          bucket.add(t, e, localConflicts.contains(e));
+        }
+      }
+    }
+
+    // Run Analysis will walk the data structure and figure out the weakly
+    // connected heap roots #'s
+    public void runAnaylsis() {
+      if (analysisComplete) {
+        if (RuntimeConflictResolver.javaDebug) {
+          System.out.println("Err: runAnaylsis was called twice in EffectsTable");
+        }
+        return;
+      }
+
+      // TODO finish this.
+    }
+  }
+
+  private class BucketOfEffects {
+    // This table is used for lookup while creating the traversal.
+    Hashtable<Taint, EffectsGroup> effects;
+
+    public BucketOfEffects() {
+      effects = new Hashtable<Taint, EffectsGroup>();
+    }
+
+    public void add(Taint t, Effect e, boolean conflict) {
+      EffectsGroup effectsForGivenTaint;
+
+      if ((effectsForGivenTaint = effects.get(t)) == null) {
+        effectsForGivenTaint = new EffectsGroup();
+        effects.put(t, effectsForGivenTaint);
+      }
+
+      if (e.getField().getType().isPrimitive()) {
+        if (conflict) {
+          effectsForGivenTaint.addPrimative(e);
+        }
+      } else {
+        effectsForGivenTaint.addObjEffect(e, conflict);
+      }
+
+    }
+  }
 }