Simplify BuildCode more...
[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
12     public LocalityBinding(MethodDescriptor md, boolean atomic) {
13         this.md=md;
14         isglobal=new Integer[md.numParameters()];
15         isatomic=atomic;
16     }
17
18     private static String globalToString(Integer g) {
19         if (g==LocalityAnalysis.GLOBAL)
20             return "G";
21         else if (g==LocalityAnalysis.LOCAL)
22             return "L";
23         else if (g==LocalityAnalysis.EITHER)
24             return "E";
25         else if (g==LocalityAnalysis.CONFLICT)
26             return "C";
27         else throw new Error();
28     }
29     
30     public String getSignature() {
31         String st="_";
32         if (isatomic) {
33             st+="A";
34         } else
35             st+="N";
36         st+=globalToString(isglobalthis);
37         for(int i=0;i<isglobal.length;i++) {
38             st+=globalToString(isglobal[i]);
39         }
40         st+="_";
41         return st;
42     }
43
44     /* Use this for an explanation */
45     public void setParent(LocalityBinding lb) {
46         parent=lb;
47     }
48
49     public String getExplanation() {
50         if (parent==null)
51             return toString();
52         else
53             return parent.getExplanation()+"\n"+toString();
54     }
55
56     public String toString() {
57         String st=md.toString()+" ";
58         for(int i=0;i<isglobal.length;i++)
59             if (isglobal[i].equals(LocalityAnalysis.LOCAL))
60                 st+="local ";
61             else if (isglobal[i].equals(LocalityAnalysis.GLOBAL))
62                 st+="global ";
63             else if (isglobal[i].equals(LocalityAnalysis.EITHER))
64                 st+="either ";
65             else if (isglobal[i].equals(LocalityAnalysis.CONFLICT))
66                 st+="conflict ";
67         return st;
68     }
69
70     public void setGlobal(int i, Integer global) {
71         isglobal[i]=global;
72     }
73
74     public Integer isGlobal(int i) {
75         return isglobal[i];
76     }
77
78     public void setGlobalReturn(Integer global) {
79         isglobalreturn=global;
80     }
81
82     public Integer getGlobalReturn() {
83         return isglobalreturn;
84     }
85
86     public void setGlobalThis(Integer global) {
87         isglobalthis=global;
88     }
89
90     public Integer getGlobalThis() {
91         return isglobalthis;
92     }
93
94     public MethodDescriptor getMethod() {
95         return md;
96     }
97
98     public boolean isAtomic() {
99         return isatomic;
100     }
101
102     public boolean equals(Object o) {
103         if (o instanceof LocalityBinding) {
104             LocalityBinding lb=(LocalityBinding)o;
105             if (md!=lb.md)
106                 return false;
107             for(int i=0;i<isglobal.length;i++)
108                 if (!isglobal[i].equals(lb.isglobal[i]))
109                     return false;
110             if (!isglobalthis.equals(lb.isglobalthis))
111                 return false;
112             return (isatomic==lb.isatomic);
113         }
114         return false;
115     }
116
117     public int hashCode() {
118         int hashcode=md.hashCode();
119         for(int i=0;i<isglobal.length;i++) {
120             hashcode=hashcode*31+(isglobal[i].intValue());
121         }
122         hashcode=hashcode*31+(isatomic?1:0);
123         return hashcode;
124     }
125 }