1 package Analysis.OwnershipAnalysis;
9 // a token touple is a pair that indicates a
10 // heap region node and an arity
12 // THIS CLASS IS IMMUTABLE!
14 public class TokenTuple extends Canonical {
16 private Integer token;
17 private boolean isMultiObject;
19 public static final int ARITY_ZEROORMORE = 0;
20 public static final int ARITY_ONE = 1;
21 public static final int ARITY_ONEORMORE = 2;
25 public TokenTuple(HeapRegionNode hrn) {
29 isMultiObject = !hrn.isSingleObject();
33 public TokenTuple(Integer token,
34 boolean isMultiObject,
39 this.isMultiObject = isMultiObject;
44 public TokenTuple makeCanonical() {
45 return (TokenTuple) Canonical.makeCanonical(this);
49 public Integer getToken() {
53 public boolean isMultiObject() {
57 public int getArity() {
62 public TokenTuple unionArity( TokenTuple tt ) {
64 assert token == tt.token;
65 assert isMultiObject == tt.isMultiObject;
68 // for multiple objects only zero-or-mores combined are still zero-or-more
69 // when two tokens are present (absence of a token is arity=zero and is
70 // handled outside of this method)
71 if( arity == ARITY_ZEROORMORE && tt.arity == ARITY_ZEROORMORE ) {
72 return new TokenTuple( token, true, ARITY_ZEROORMORE ).makeCanonical();
74 return new TokenTuple( token, true, ARITY_ONEORMORE ).makeCanonical();
78 // a single object region's token can only have ZEROORMORE or ONE
79 if( arity == ARITY_ZEROORMORE && tt.arity == ARITY_ZEROORMORE ) {
80 return new TokenTuple( token, false, ARITY_ZEROORMORE ).makeCanonical();
82 return new TokenTuple( token, false, ARITY_ONE ).makeCanonical();
88 public TokenTuple changeTokenTo(Integer tokenToChangeTo) {
89 assert tokenToChangeTo != null;
91 return new TokenTuple(tokenToChangeTo,
93 arity).makeCanonical();
97 public boolean equals(Object o) {
102 if( !(o instanceof TokenTuple) ) {
106 TokenTuple tt = (TokenTuple) o;
108 return token.equals(tt.getToken() ) &&
109 arity == tt.getArity();
112 private boolean oldHashSet = false;
113 private int oldHash = 0;
114 public int hashCode() {
115 int currentHash = token.intValue()*31 + arity;
117 if( oldHashSet == false ) {
118 oldHash = currentHash;
121 if( oldHash != currentHash ) {
122 System.out.println( "IF YOU SEE THIS A CANONICAL TokenTuple CHANGED" );
132 public String toString() {
133 String s = token.toString();
135 if( isMultiObject ) {
139 if( arity == ARITY_ZEROORMORE ) {
141 } else if( arity == ARITY_ONEORMORE ) {