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;
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;
+ }
}
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);
}
}
TokenTuple ttThis = ttsOut.containsToken(ttIn.getToken() );
if( ttThis == null ) {
- ttsOut.tokenTuples.add(ttIn);
+ ttsOut.tokenTuples.add(ttIn);
}
}
public TokenTupleSet add(TokenTuple tt) {
assert tt != null;
- TokenTupleSet ttsOut = new TokenTupleSet(tt);
- return ttsOut.union(this);
+ return this.union(tt);
}
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;
}
while( itr.hasNext() ) {
TokenTuple tt = (TokenTuple) itr.next();
if( token.equals(tt.getToken() ) ) {
- return tt;
+ return tt;
}
}
return null;
// 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);
}
}
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);
}
}
// 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) ));
}
}
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);
+ }
}
}