code 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         if (md.getModifiers().isNative())
41             return "";
42         String st="_";
43         if (isatomic) {
44             st+="A";
45         } else
46             st+="N";
47         if (isglobalthis==null)
48             st+="N";
49         else
50             st+=globalToString(isglobalthis);
51         for(int i=0;i<isglobal.length;i++) {
52             st+=globalToString(isglobal[i]);
53         }
54         st+="_";
55         return st;
56     }
57
58     /* Use this for an explanation */
59     public void setParent(LocalityBinding lb) {
60         parent=lb;
61     }
62
63     public String getExplanation() {
64         if (parent==null)
65             return toString();
66         else
67             return parent.getExplanation()+"\n"+toString();
68     }
69
70     public String toString() {
71         String st=md.toString()+" ";
72         for(int i=0;i<isglobal.length;i++)
73             if (isglobal[i].equals(LocalityAnalysis.LOCAL))
74                 st+="local ";
75             else if (isglobal[i].equals(LocalityAnalysis.GLOBAL))
76                 st+="global ";
77             else if (isglobal[i].equals(LocalityAnalysis.EITHER))
78                 st+="either ";
79             else if (isglobal[i].equals(LocalityAnalysis.CONFLICT))
80                 st+="conflict ";
81         return st;
82     }
83
84     public void setGlobal(int i, Integer global) {
85         isglobal[i]=global;
86     }
87
88     public Integer isGlobal(int i) {
89         return isglobal[i];
90     }
91
92     public void setGlobalReturn(Integer global) {
93         isglobalreturn=global;
94     }
95
96     public Integer getGlobalReturn() {
97         return isglobalreturn;
98     }
99
100     public void setGlobalThis(Integer global) {
101         isglobalthis=global;
102     }
103
104     public Integer getGlobalThis() {
105         return isglobalthis;
106     }
107
108     public MethodDescriptor getMethod() {
109         return md;
110     }
111
112     public boolean isAtomic() {
113         return isatomic;
114     }
115
116     public boolean contextMatches(LocalityBinding lb) {
117         if (isglobal.length!=lb.isglobal.length)
118             return false;
119         for(int i=0;i<isglobal.length;i++)
120             if (!isglobal[i].equals(lb.isglobal[i]))
121                 return false;
122         
123         if (isglobalthis==null) {
124             if (lb.isglobalthis!=null)
125                 return false;
126         } else
127             if (!isglobalthis.equals(lb.isglobalthis))
128                 return false;
129         return (isatomic==lb.isatomic);
130     }
131
132     public boolean equals(Object o) {
133         if (o instanceof LocalityBinding) {
134             LocalityBinding lb=(LocalityBinding)o;
135             if (md!=lb.md)
136                 return false;
137
138             for(int i=0;i<isglobal.length;i++)
139                 if (!isglobal[i].equals(lb.isglobal[i]))
140                     return false;
141
142             if (isglobalthis==null) {
143                 if (lb.isglobalthis!=null)
144                     return false;
145             } else
146                 if (!isglobalthis.equals(lb.isglobalthis))
147                     return false;
148             return (isatomic==lb.isatomic);
149         }
150         return false;
151     }
152
153     public int hashCode() {
154         int hashcode=md.hashCode();
155         for(int i=0;i<isglobal.length;i++) {
156             hashcode=hashcode*31+(isglobal[i].intValue());
157         }
158         hashcode=hashcode*31+(isatomic?1:0);
159         return hashcode;
160     }
161 }