1 salcianu 1.1.2.1 // PALoad.java, created Mon Feb  7 15:24:14 2000 by salcianu
 2 cananian 1.1.2.7 // Copyright (C) 2000 Alexandru SALCIANU <salcianu@retezat.lcs.mit.edu>
 3 salcianu 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 salcianu 1.1.2.1 package harpoon.Analysis.PointerAnalysis;
 5 salcianu 1.1.2.1 
 6 salcianu 1.1.2.2 import java.util.Set;
 7 salcianu 1.1.2.5 import java.util.Map;
 8 salcianu 1.1.2.5 
 9 salcianu 1.1.2.2 
10 salcianu 1.1.2.1 /**
11 salcianu 1.1.2.1  * <code>PALoad</code> models a LD action.
12 salcianu 1.1.2.1  * A <code>PALoad</code> object represents the loading of the 
13 salcianu 1.1.2.1  * outside reference <code>n1--f-->n2</code>.
14 salcianu 1.1.2.1  * 
15 cananian 1.1.2.7  * @author  Alexandru SALCIANU <salcianu@retezat.lcs.mit.edu>
16 cananian 1.2      * @version $Id: PALoad.java,v 1.2 2002/02/25 20:58:40 cananian Exp $
17 salcianu 1.1.2.1  */
18 salcianu 1.1.2.6 class PALoad implements java.io.Serializable {
19 salcianu 1.1.2.1     
20 salcianu 1.1.2.1     /** The start node of the outside edges. */
21 salcianu 1.1.2.1     PANode n1;
22 salcianu 1.1.2.1     /** The field that is read. */
23 salcianu 1.1.2.1     String f;
24 salcianu 1.1.2.1     /** The end node of the outside edge. */
25 salcianu 1.1.2.1     PANode n2;
26 salcianu 1.1.2.1     /** The thread that did it. */
27 salcianu 1.1.2.1     PANode nt;
28 salcianu 1.1.2.1 
29 salcianu 1.1.2.1     /** Creates a <code>PALoad</code>. */
30 salcianu 1.1.2.1     public PALoad(PANode n1, String f, PANode n2, PANode nt){
31 salcianu 1.1.2.1         this.n1 = n1;
32 salcianu 1.1.2.1         this.f  = f;
33 salcianu 1.1.2.1         this.n2 = n2;
34 salcianu 1.1.2.1         this.nt = nt;
35 salcianu 1.1.2.1     }    
36 salcianu 1.1.2.5 
37 salcianu 1.1.2.5     /* Specializes <code>this</code> <code>PALoad</code> according
38 salcianu 1.1.2.5        to <code>map</code>, a mapping from <code>PANode<code> to
39 salcianu 1.1.2.5        <code>PANode</code>. Each node which is not explicitly mapped is
40 salcianu 1.1.2.5        considered to be mapped to itself. */
41 salcianu 1.1.2.5     public final PALoad specialize(Map map){
42 salcianu 1.1.2.5         PANode n1p = PANode.translate(n1, map);
43 salcianu 1.1.2.5         PANode n2p = PANode.translate(n2, map);
44 salcianu 1.1.2.5         PANode ntp = PANode.translate(nt, map);
45 salcianu 1.1.2.5         if((n1p == n1) && (n2p == n2) && (ntp == nt)) return this;
46 salcianu 1.1.2.5         return new PALoad(n1p, f, n2p, ntp);
47 salcianu 1.1.2.5     }
48 salcianu 1.1.2.1 
49 salcianu 1.1.2.1     /** Checks the equality of two <code>PALoad</code> objects. */
50 salcianu 1.1.2.1     public boolean equals(Object o){
51 salcianu 1.1.2.1         PALoad load2 = (PALoad) o;
52 salcianu 1.1.2.1         return
53 salcianu 1.1.2.1             (n1 == load2.n1)   && (n2 == load2.n2) &&
54 salcianu 1.1.2.1             f.equals(load2.f)  && (nt == load2.nt);
55 salcianu 1.1.2.1     }
56 salcianu 1.1.2.1 
57 salcianu 1.1.2.1     public int hashCode(){
58 salcianu 1.1.2.1         return n2.hashCode();
59 salcianu 1.1.2.1     }
60 salcianu 1.1.2.1 
61 salcianu 1.1.2.1     /** Pretty-printer for debug purposes. */
62 salcianu 1.1.2.1     public String toString(){
63 salcianu 1.1.2.1         return "< ld , " + n1 + " , " + f + " , " + n2 + 
64 salcianu 1.1.2.1             ((nt!=ActionRepository.THIS_THREAD)? (" , " + nt) : "") +
65 salcianu 1.1.2.1             " >";
66 salcianu 1.1.2.2     }
67 salcianu 1.1.2.2 
68 salcianu 1.1.2.3     /** Checks whether <code>this</code> load contains only remaining nodes.
69 salcianu 1.1.2.3         This method is designed to be used by <code>keepTheEssential</code>.
70 salcianu 1.1.2.3         Warning: <code>isGood</code> is NOT the negation of
71 salcianu 1.1.2.4         <code>isBad</code>. */
72 salcianu 1.1.2.3     boolean isGood(Set remaining_nodes){
73 salcianu 1.1.2.3         return
74 salcianu 1.1.2.3             remaining_nodes.contains(n1) && remaining_nodes.contains(n2) &&
75 salcianu 1.1.2.3             remaining_nodes.contains(nt);
76 salcianu 1.1.2.3     }
77 salcianu 1.1.2.3 
78 salcianu 1.1.2.2     /** Checks whether <code>this</code> load contains at least one 
79 salcianu 1.1.2.2         <i>bad node</i>. This method is designed to help us identifying
80 salcianu 1.1.2.2         the loads that are eliminated when some nodes are removed. */
81 salcianu 1.1.2.3     boolean isBad(Set bad_nodes){
82 salcianu 1.1.2.2         return
83 salcianu 1.1.2.2             bad_nodes.contains(n1) || bad_nodes.contains(n2) ||
84 salcianu 1.1.2.2             bad_nodes.contains(nt);
85 salcianu 1.1.2.1     }
86 salcianu 1.1.2.1 
87 salcianu 1.1.2.1 }
88 cananian 1.2