1 package Analysis.Locality;
2 import IR.MethodDescriptor;
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;
13 public LocalityBinding(MethodDescriptor md, boolean atomic) {
15 isglobal=new Integer[md.numParameters()];
19 public void setHasAtomic() {
23 public boolean getHasAtomic() {
27 private static String globalToString(Integer g) {
28 if (g==LocalityAnalysis.GLOBAL)
30 else if (g==LocalityAnalysis.LOCAL)
32 else if (g==LocalityAnalysis.EITHER)
34 else if (g==LocalityAnalysis.CONFLICT)
36 else throw new Error();
39 public String getSignature() {
40 if (md.getModifiers().isNative())
47 if (isglobalthis==null)
50 st+=globalToString(isglobalthis);
51 for(int i=0;i<isglobal.length;i++) {
52 st+=globalToString(isglobal[i]);
58 /* Use this for an explanation */
59 public void setParent(LocalityBinding lb) {
63 public String getExplanation() {
67 return parent.getExplanation()+"\n"+toString();
70 public String toString() {
71 String st=md.toString()+" ";
72 if (isglobalthis==null) {
75 if (isglobalthis.equals(LocalityAnalysis.LOCAL))
77 else if (isglobalthis.equals(LocalityAnalysis.GLOBAL))
79 else if (isglobalthis.equals(LocalityAnalysis.EITHER))
81 else if (isglobalthis.equals(LocalityAnalysis.CONFLICT))
84 for(int i=0;i<isglobal.length;i++)
85 if (isglobal[i].equals(LocalityAnalysis.LOCAL))
87 else if (isglobal[i].equals(LocalityAnalysis.GLOBAL))
89 else if (isglobal[i].equals(LocalityAnalysis.EITHER))
91 else if (isglobal[i].equals(LocalityAnalysis.CONFLICT))
96 public void setGlobal(int i, Integer global) {
100 public Integer isGlobal(int i) {
104 public void setGlobalReturn(Integer global) {
105 isglobalreturn=global;
108 public Integer getGlobalReturn() {
109 return isglobalreturn;
112 public void setGlobalThis(Integer global) {
116 public Integer getGlobalThis() {
120 public MethodDescriptor getMethod() {
124 public boolean isAtomic() {
128 public boolean contextMatches(LocalityBinding lb) {
129 if (isglobal.length!=lb.isglobal.length)
131 for(int i=0;i<isglobal.length;i++)
132 if (!isglobal[i].equals(lb.isglobal[i]))
135 if (isglobalthis==null) {
136 if (lb.isglobalthis!=null)
139 if (!isglobalthis.equals(lb.isglobalthis))
141 return (isatomic==lb.isatomic);
144 public boolean equals(Object o) {
145 if (o instanceof LocalityBinding) {
146 LocalityBinding lb=(LocalityBinding)o;
150 for(int i=0;i<isglobal.length;i++)
151 if (!isglobal[i].equals(lb.isglobal[i]))
154 if (isglobalthis==null) {
155 if (lb.isglobalthis!=null)
158 if (!isglobalthis.equals(lb.isglobalthis))
160 return (isatomic==lb.isatomic);
165 public int hashCode() {
166 int hashcode=md.hashCode();
167 for(int i=0;i<isglobal.length;i++) {
168 hashcode=hashcode*31+(isglobal[i].intValue());
170 hashcode=hashcode*31+(isatomic?1:0);