1 package Analysis.Disjoint;
8 // all edges should have a non-null
10 protected TypeDescriptor type;
12 // the field name may be null if this
13 // edge models a variable reference
14 protected String field;
16 // clean means that the reference existed
17 // before the current analysis context
18 protected boolean isClean;
20 protected ReachSet beta;
21 protected ReachSet betaNew;
23 protected RefSrcNode src;
24 protected HeapRegionNode dst;
26 // existence predicates must be true in a caller
27 // context for this edge to transfer from this
28 // callee to that context--NOTE, existence predicates
29 // do not factor into edge comparisons
30 protected ExistPredSet preds;
33 public RefEdge( RefSrcNode src,
39 ExistPredSet preds ) {
46 this.isClean = isClean;
51 // TODO: do this right?
52 this.preds = new ExistPredSet().makeCanonical();
58 this.beta = new ReachSet().makeCanonical();
61 // when edges are not undergoing an operation that
62 // is changing beta info, betaNew is always empty
63 betaNew = new ReachSet().makeCanonical();
67 public RefEdge copy() {
68 RefEdge copy = new RefEdge( src,
79 public boolean equals( Object o ) {
84 if( !(o instanceof RefEdge) ) {
88 RefEdge edge = (RefEdge) o;
90 if( !typeEquals( edge.type ) ) {
94 if( !fieldEquals( edge.field ) ) {
98 // Equality of edges is only valid within a graph, so
99 // compare src and dst by reference
100 if( !(src == edge.src) ||
101 !(dst == edge.dst) ) {
105 assert isClean == edge.isClean;
111 // beta and preds contribute towards reaching the
112 // fixed point, so use this method to determine if
113 // an edge is "equal" to some previous visit, basically
114 public boolean equalsIncludingBetaAndPreds( RefEdge edge ) {
115 return equals( edge ) &&
116 beta.equals( edge.beta ) &&
117 preds.equals( edge.preds );
120 public boolean equalsPreds( RefEdge edge ) {
121 return preds.equals( edge.preds );
125 public int hashCode() {
128 hash += type.hashCode()*17;
130 if( field != null ) {
131 hash += field.hashCode()*7;
134 hash += src.hashCode()*11;
135 hash += dst.hashCode();
141 public RefSrcNode getSrc() {
145 public void setSrc( RefSrcNode rsn ) {
150 public HeapRegionNode getDst() {
154 public void setDst( HeapRegionNode hrn ) {
160 public TypeDescriptor getType() {
164 public void setType( TypeDescriptor td ) {
169 public String getField() {
173 public void setField( String s ) {
178 public boolean typeEquals( TypeDescriptor td ) {
179 return type.equals( td );
182 public boolean fieldEquals( String s ) {
183 if( field == null && s == null ) {
186 if( field == null ) {
189 return field.equals( s );
192 public boolean typeAndFieldEquals( RefEdge e ) {
193 return typeEquals ( e.getType() ) &&
194 fieldEquals( e.getField() );
198 public boolean isClean() {
202 public void setIsClean( boolean isClean ) {
203 this.isClean = isClean;
207 public ReachSet getBeta() {
211 public void setBeta( ReachSet beta ) {
216 public ReachSet getBetaNew() {
220 public void setBetaNew( ReachSet beta ) {
225 public void applyBetaNew() {
226 assert betaNew != null;
229 betaNew = new ReachSet().makeCanonical();
233 public String toGraphEdgeString( boolean hideSubsetReachability ) {
234 String edgeLabel = "";
237 edgeLabel += type.toPrettyString() + "\\n";
240 if( field != null ) {
241 edgeLabel += field + "\\n";
245 edgeLabel += "*clean*\\n";
248 edgeLabel += beta.toStringEscapeNewline( hideSubsetReachability ) +
249 "\\n" + preds.toString();
254 public String toString() {
256 return new String( "("+src+
257 "->"+type.toPrettyString()+