lots of changes for dsm now that william's stuff is checked in
[IRC.git] / Robust / src / Analysis / Locality / LocalityBinding.java
1 package Analysis.Locality;
2 import IR.MethodDescriptor;
3
4 public class LocalityBinding {
5     private MethodDescriptor md;
6     private Integer[] isglobal;
7     private boolean isatomic;
8     private Integer isglobalreturn;
9     private Integer isglobalthis;
10     private LocalityBinding parent;
11     private boolean hasatomic;
12
13     public LocalityBinding(MethodDescriptor md, boolean atomic) {
14         this.md=md;
15         isglobal=new Integer[md.numParameters()];
16         isatomic=atomic;
17     }
18
19     public void setHasAtomic() {
20         hasatomic=true;
21     }
22
23     public boolean getHasAtomic() {
24         return hasatomic;
25     }
26
27     private static String globalToString(Integer g) {
28         if (g==LocalityAnalysis.GLOBAL)
29             return "G";
30         else if (g==LocalityAnalysis.LOCAL)
31             return "L";
32         else if (g==LocalityAnalysis.EITHER)
33             return "E";
34         else if (g==LocalityAnalysis.CONFLICT)
35             return "C";
36         else throw new Error();
37     }
38     
39     public String getSignature() {
40         String st="_";
41         if (isatomic) {
42             st+="A";
43         } else
44             st+="N";
45         if (isglobalthis==null)
46             st+="N";
47         else
48             st+=globalToString(isglobalthis);
49         for(int i=0;i<isglobal.length;i++) {
50             st+=globalToString(isglobal[i]);
51         }
52         st+="_";
53         return st;
54     }
55
56     /* Use this for an explanation */
57     public void setParent(LocalityBinding lb) {
58         parent=lb;
59     }
60
61     public String getExplanation() {
62         if (parent==null)
63             return toString();
64         else
65             return parent.getExplanation()+"\n"+toString();
66     }
67
68     public String toString() {
69         String st=md.toString()+" ";
70         for(int i=0;i<isglobal.length;i++)
71             if (isglobal[i].equals(LocalityAnalysis.LOCAL))
72                 st+="local ";
73             else if (isglobal[i].equals(LocalityAnalysis.GLOBAL))
74                 st+="global ";
75             else if (isglobal[i].equals(LocalityAnalysis.EITHER))
76                 st+="either ";
77             else if (isglobal[i].equals(LocalityAnalysis.CONFLICT))
78                 st+="conflict ";
79         return st;
80     }
81
82     public void setGlobal(int i, Integer global) {
83         isglobal[i]=global;
84     }
85
86     public Integer isGlobal(int i) {
87         return isglobal[i];
88     }
89
90     public void setGlobalReturn(Integer global) {
91         isglobalreturn=global;
92     }
93
94     public Integer getGlobalReturn() {
95         return isglobalreturn;
96     }
97
98     public void setGlobalThis(Integer global) {
99         isglobalthis=global;
100     }
101
102     public Integer getGlobalThis() {
103         return isglobalthis;
104     }
105
106     public MethodDescriptor getMethod() {
107         return md;
108     }
109
110     public boolean isAtomic() {
111         return isatomic;
112     }
113
114     public boolean contextMatches(LocalityBinding lb) {
115         if (isglobal.length!=lb.isglobal.length)
116             return false;
117         for(int i=0;i<isglobal.length;i++)
118             if (!isglobal[i].equals(lb.isglobal[i]))
119                 return false;
120         
121         if (isglobalthis==null) {
122             if (lb.isglobalthis!=null)
123                 return false;
124         } else
125             if (!isglobalthis.equals(lb.isglobalthis))
126                 return false;
127         return (isatomic==lb.isatomic);
128     }
129
130     public boolean equals(Object o) {
131         if (o instanceof LocalityBinding) {
132             LocalityBinding lb=(LocalityBinding)o;
133             if (md!=lb.md)
134                 return false;
135             for(int i=0;i<isglobal.length;i++)
136                 if (!isglobal[i].equals(lb.isglobal[i]))
137                     return false;
138
139             if (isglobalthis==null) {
140                 if (lb.isglobalthis!=null)
141                     return false;
142             } else
143                 if (!isglobalthis.equals(lb.isglobalthis))
144                     return false;
145             return (isatomic==lb.isatomic);
146         }
147         return false;
148     }
149
150     public int hashCode() {
151         int hashcode=md.hashCode();
152         for(int i=0;i<isglobal.length;i++) {
153             hashcode=hashcode*31+(isglobal[i].intValue());
154         }
155         hashcode=hashcode*31+(isatomic?1:0);
156         return hashcode;
157     }
158 }