fix bug in locality analysis
authorbdemsky <bdemsky>
Wed, 30 Jan 2008 01:07:57 +0000 (01:07 +0000)
committerbdemsky <bdemsky>
Wed, 30 Jan 2008 01:07:57 +0000 (01:07 +0000)
Robust/src/Analysis/Locality/LocalityAnalysis.java
Robust/src/Analysis/Locality/LocalityBinding.java

index 261d645d7c63bc97f83e3c35603af8ef244aa7e2..ccc288031d95426fbbc2cbb495a8d9d7b22dcbdb 100644 (file)
@@ -437,12 +437,12 @@ public class LocalityAnalysis {
        } else if (type.equals(GLOBAL)) {
            if (!transaction)
                throw new Error("Global access outside of a transaction in context:\n"+lb.getExplanation());
-           if (ffn.getField().getType().isPrimitive())
+           if (ffn.getField().getType().isPrimitive()&&!ffn.getField().getType().isArray())
                currtable.put(dst, LOCAL); // primitives are local
            else
                currtable.put(dst, GLOBAL);
        } else if (type.equals(EITHER)) {
-           if (ffn.getField().getType().isPrimitive())
+           if (ffn.getField().getType().isPrimitive()&&!ffn.getField().getType().isArray())
                currtable.put(dst, LOCAL); // primitives are local
            else if (ffn.getField().isGlobal())
                currtable.put(dst, GLOBAL);
@@ -457,7 +457,7 @@ public class LocalityAnalysis {
     void processSetFieldNode(LocalityBinding lb, FlatSetFieldNode fsfn, boolean transaction, Hashtable<TempDescriptor, Integer> currtable) {
        Integer srctype=currtable.get(fsfn.getSrc());
        Integer dsttype=currtable.get(fsfn.getDst());
-       
+
        if (dsttype.equals(LOCAL)) {
            if (fsfn.getField().isGlobal()) {
                if (!(srctype.equals(GLOBAL)||srctype.equals(EITHER)))
@@ -470,7 +470,7 @@ public class LocalityAnalysis {
            if (!transaction)
                throw new Error("Global access outside of a transaction in context:\n"+lb.getExplanation());
            //okay to store primitives in global object
-           if (srctype.equals(LOCAL) && fsfn.getField().getType().isPrimitive())
+           if (srctype.equals(LOCAL) && fsfn.getField().getType().isPrimitive() && ! fsfn.getField().getType().isArray())
                return;
            if (!(srctype.equals(GLOBAL)||srctype.equals(EITHER)))
                throw new Error("Writing possible local reference to global object in context:\n"+lb.getExplanation()+" for FlatFieldNode "+fsfn);
index a2d4cc70e3a1c91bf9b69ac1b6ead3b52bd521fd..01bbb8f1f281070cae263c74460f3e1ce3676577 100644 (file)
@@ -69,6 +69,18 @@ public class LocalityBinding {
 
     public String toString() {
        String st=md.toString()+" ";
+       if (isglobalthis==null) {
+           st+="[static] ";
+       } else {
+           if (isglobalthis.equals(LocalityAnalysis.LOCAL))
+               st+="[local] ";
+           else if (isglobalthis.equals(LocalityAnalysis.GLOBAL))
+               st+="[global] ";
+           else if (isglobalthis.equals(LocalityAnalysis.EITHER))
+               st+="[either] ";
+           else if (isglobalthis.equals(LocalityAnalysis.CONFLICT))
+               st+="[conflict] ";
+       }
        for(int i=0;i<isglobal.length;i++)
            if (isglobal[i].equals(LocalityAnalysis.LOCAL))
                st+="local ";