changes.
[IRC.git] / Robust / src / Analysis / OwnershipAnalysis / TokenTupleSet.java
index 5b60afea4bc743f696a39661c58f3b8d54589b97..1a84635e3c5bb9031e5093d5b16e4e0261ee3eb2 100644 (file)
@@ -65,22 +65,22 @@ public class TokenTupleSet extends Canonical {
       TokenTuple ttThis = this.containsToken(ttIn.getToken() );
 
       if( ttThis == null ) {
-       return false;
+        return false;
       }
-    }    
-    
+    }
+
     // then establish that anything in this set that is
-    // not in tts is a zero-arity token tuple, which is okay    
+    // not in tts is a zero-arity token tuple, which is okay
     Iterator<TokenTuple> ttItrThis = this.iterator();
     while( ttItrThis.hasNext() ) {
       TokenTuple ttThis = ttItrThis.next();
       TokenTuple ttIn   = tts.containsToken(ttThis.getToken() );
 
-      if( ttIn == null && 
-         ttThis.getArity() != TokenTuple.ARITY_ZEROORMORE ) {
-       return false;
+      if( ttIn == null &&
+          ttThis.getArity() != TokenTuple.ARITY_ZEROORMORE ) {
+        return false;
       }
-    }    
+    }
 
     // if so this set contains tts with zeroes
     return true;
@@ -88,16 +88,30 @@ public class TokenTupleSet extends Canonical {
 
   public TokenTupleSet union(TokenTuple ttIn) {
     assert ttIn != null;
-    TokenTupleSet ttsOut = new TokenTupleSet(this);
-    ttsOut.tokenTuples.add(ttIn);
-    return ttsOut.makeCanonical();
+    ReachOperation ro=new ReachOperation(this, ttIn);
+    if (unionhash.containsKey(ro))
+      return (TokenTupleSet) unionhash.get(ro).c;
+    else {
+      TokenTupleSet ttsOut = new TokenTupleSet(this);
+      ttsOut.tokenTuples.add(ttIn);
+      ro.c=ttsOut=ttsOut.makeCanonical();
+      unionhash.put(ro,ro);
+      return ttsOut;
+    }
   }
 
   public TokenTupleSet union(TokenTupleSet ttsIn) {
     assert ttsIn != null;
-    TokenTupleSet ttsOut = new TokenTupleSet(this);
-    ttsOut.tokenTuples.addAll(ttsIn.tokenTuples);
-    return ttsOut.makeCanonical();
+    ReachOperation ro=new ReachOperation(this, ttsIn);
+    if (unionhash.containsKey(ro)) {
+      return (TokenTupleSet) unionhash.get(ro).c;
+    } else {
+      TokenTupleSet ttsOut = new TokenTupleSet(this);
+      ttsOut.tokenTuples.addAll(ttsIn.tokenTuples);
+      ro.c=ttsOut=ttsOut.makeCanonical();
+      unionhash.put(ro,ro);
+      return ttsOut;
+    }
   }
 
 
@@ -111,9 +125,9 @@ public class TokenTupleSet extends Canonical {
       TokenTuple ttIn   = ttsIn.containsToken(ttThis.getToken() );
 
       if( ttIn != null ) {
-       ttsOut.tokenTuples.add(ttThis.unionArity(ttIn) );
+        ttsOut.tokenTuples.add(ttThis.unionArity(ttIn) );
       } else {
-       ttsOut.tokenTuples.add(ttThis);
+        ttsOut.tokenTuples.add(ttThis);
       }
     }
 
@@ -123,7 +137,7 @@ public class TokenTupleSet extends Canonical {
       TokenTuple ttThis = ttsOut.containsToken(ttIn.getToken() );
 
       if( ttThis == null ) {
-       ttsOut.tokenTuples.add(ttIn);
+        ttsOut.tokenTuples.add(ttIn);
       }
     }
 
@@ -133,8 +147,7 @@ public class TokenTupleSet extends Canonical {
 
   public TokenTupleSet add(TokenTuple tt) {
     assert tt != null;
-    TokenTupleSet ttsOut = new TokenTupleSet(tt);
-    return ttsOut.union(this);
+    return this.union(tt);
   }
 
 
@@ -159,25 +172,18 @@ public class TokenTupleSet extends Canonical {
     return tokenTuples.equals(tts.tokenTuples);
   }
 
+  boolean hashcodecomputed=false;
+  int ourhashcode=0;
 
 
-  private boolean oldHashSet = false;
-  private int oldHash    = 0;
   public int hashCode() {
-    int currentHash = tokenTuples.hashCode();
-
-    if( oldHashSet == false ) {
-      oldHash = currentHash;
-      oldHashSet = true;
-    } else {
-      if( oldHash != currentHash ) {
-       System.out.println("IF YOU SEE THIS A CANONICAL TokenTupleSet CHANGED");
-       Integer x = null;
-       x.toString();
-      }
+    if (hashcodecomputed)
+      return ourhashcode;
+    else {
+      ourhashcode=tokenTuples.hashCode();
+      hashcodecomputed=true;
+      return ourhashcode;
     }
-
-    return currentHash;
   }
 
 
@@ -189,7 +195,7 @@ public class TokenTupleSet extends Canonical {
     while( itr.hasNext() ) {
       TokenTuple tt = (TokenTuple) itr.next();
       if( token.equals(tt.getToken() ) ) {
-       return tt;
+        return tt;
       }
     }
     return null;
@@ -214,29 +220,29 @@ public class TokenTupleSet extends Canonical {
       // tokens not associated with
       // the site should be left alone
       if( age == AllocationSite.AGE_notInThisSite ) {
-       ttsOut.tokenTuples.add(tt);
+        ttsOut.tokenTuples.add(tt);
 
       } else if( age == AllocationSite.AGE_summary ) {
-       // remember the summary tuple, but don't add it
-       // we may combine it with the oldest tuple
-       ttSummary = tt;
+        // remember the summary tuple, but don't add it
+        // we may combine it with the oldest tuple
+        ttSummary = tt;
 
       } else if( age == AllocationSite.AGE_oldest ) {
-       // found an oldest token, again just remember
-       // for later
-       ttOldest = tt;
+        // found an oldest token, again just remember
+        // for later
+        ttOldest = tt;
 
       } else {
-       assert age == AllocationSite.AGE_in_I;
+        assert age == AllocationSite.AGE_in_I;
 
-       Integer I = as.getAge(token);
-       assert I != null;
+        Integer I = as.getAge(token);
+        assert I != null;
 
-       // otherwise, we change this token to the
-       // next older token
-       Integer tokenToChangeTo = as.getIthOldest(I + 1);
-       TokenTuple ttAged       = tt.changeTokenTo(tokenToChangeTo);
-       ttsOut.tokenTuples.add(ttAged);
+        // otherwise, we change this token to the
+        // next older token
+        Integer tokenToChangeTo = as.getIthOldest(I + 1);
+        TokenTuple ttAged       = tt.changeTokenTo(tokenToChangeTo);
+        ttsOut.tokenTuples.add(ttAged);
       }
     }
 
@@ -287,32 +293,32 @@ public class TokenTupleSet extends Canonical {
       int shadowAge = as.getShadowAgeCategory(token);
 
       if( shadowAge == AllocationSite.AGE_summary ) {
-       // remember the summary tuple, but don't add it
-       // we may combine it with the oldest tuple
-       ttSummary = tt;
+        // remember the summary tuple, but don't add it
+        // we may combine it with the oldest tuple
+        ttSummary = tt;
 
       } else if( shadowAge == AllocationSite.SHADOWAGE_notInThisSite ) {
-       ttsOut.tokenTuples.add(tt);
+        ttsOut.tokenTuples.add(tt);
 
       } else if( shadowAge == AllocationSite.SHADOWAGE_summary ) {
-       // found the shadow summary token, again just remember
-       // for later
-       ttShadowSummary = tt;
+        // found the shadow summary token, again just remember
+        // for later
+        ttShadowSummary = tt;
 
       } else if( shadowAge == AllocationSite.SHADOWAGE_oldest ) {
-       Integer tokenToChangeTo = as.getOldest();
-       TokenTuple ttNormal = tt.changeTokenTo(tokenToChangeTo);
-       ttsOut.tokenTuples.add(ttNormal);
+        Integer tokenToChangeTo = as.getOldest();
+        TokenTuple ttNormal = tt.changeTokenTo(tokenToChangeTo);
+        ttsOut.tokenTuples.add(ttNormal);
 
       } else {
-       assert shadowAge == AllocationSite.SHADOWAGE_in_I;
+        assert shadowAge == AllocationSite.SHADOWAGE_in_I;
 
-       Integer I = as.getShadowAge(token);
-       assert I != null;
+        Integer I = as.getShadowAge(token);
+        assert I != null;
 
-       Integer tokenToChangeTo = as.getIthOldest(-I);
-       TokenTuple ttNormal = tt.changeTokenTo(tokenToChangeTo);
-       ttsOut.tokenTuples.add(ttNormal);
+        Integer tokenToChangeTo = as.getIthOldest(-I);
+        TokenTuple ttNormal = tt.changeTokenTo(tokenToChangeTo);
+        ttsOut.tokenTuples.add(ttNormal);
       }
     }
 
@@ -354,21 +360,21 @@ public class TokenTupleSet extends Canonical {
       // summary tokens and tokens not associated with
       // the site should be left alone
       if( age == AllocationSite.AGE_notInThisSite ) {
-       ttsOut = ttsOut.union(tt);
+        ttsOut = ttsOut.union(tt);
 
       } else if( age == AllocationSite.AGE_summary ) {
-       ttsOut = ttsOut.union(tt.changeTokenTo(as.getSummaryShadow() ));
+        ttsOut = ttsOut.union(tt.changeTokenTo(as.getSummaryShadow() ));
 
       } else if( age == AllocationSite.AGE_oldest ) {
-       ttsOut = ttsOut.union(tt.changeTokenTo(as.getOldestShadow() ));
+        ttsOut = ttsOut.union(tt.changeTokenTo(as.getOldestShadow() ));
 
       } else {
-       assert age == AllocationSite.AGE_in_I;
+        assert age == AllocationSite.AGE_in_I;
 
-       Integer I = as.getAge(token);
-       assert I != null;
+        Integer I = as.getAge(token);
+        assert I != null;
 
-       ttsOut = ttsOut.union(tt.changeTokenTo(as.getIthOldestShadow(I) ));
+        ttsOut = ttsOut.union(tt.changeTokenTo(as.getIthOldestShadow(I) ));
       }
     }
 
@@ -392,20 +398,20 @@ public class TokenTupleSet extends Canonical {
 
       Iterator<TokenTupleSet> replaceItr = replacements.iterator();
       while( replaceItr.hasNext() ) {
-       TokenTupleSet replacement = replaceItr.next();
-       TokenTupleSet replaced = new TokenTupleSet(ttsMinusToken).makeCanonical();
-       replaced = replaced.unionUpArity(replacement);
-       rsOut = rsOut.add(replaced);
+        TokenTupleSet replacement = replaceItr.next();
+        TokenTupleSet replaced = new TokenTupleSet(ttsMinusToken).makeCanonical();
+        replaced = replaced.unionUpArity(replacement);
+        rsOut = rsOut.add(replaced);
 
-       if( makeChangeSet ) {
-         assert forChangeSet != null;
+        if( makeChangeSet ) {
+          assert forChangeSet != null;
 
-         if( forChangeSet.get(this) == null ) {
-           forChangeSet.put(this, new HashSet<TokenTupleSet>() );
-         }
+          if( forChangeSet.get(this) == null ) {
+            forChangeSet.put(this, new HashSet<TokenTupleSet>() );
+          }
 
-         forChangeSet.get(this).add(replaced);
-       }
+          forChangeSet.get(this).add(replaced);
+        }
       }
     }