extends the grammar to have a way to define a new type of location that is allowed...
authoryeom <yeom>
Thu, 14 Apr 2011 21:20:14 +0000 (21:20 +0000)
committeryeom <yeom>
Thu, 14 Apr 2011 21:20:14 +0000 (21:20 +0000)
Robust/src/Analysis/SSJava/FlowDownCheck.java
Robust/src/IR/State.java
Robust/src/IR/Tree/BuildIR.java
Robust/src/Parse/java14.cup

index f596794a7611edefa5a867ff16b5ac9b8ada514b..ac4899c533104e337a7f9453b00be4bc58bc58f2 100644 (file)
@@ -201,6 +201,9 @@ public class FlowDownCheck {
         checkDeclarationInBlockStatementNode(md, nametable, bsn);
       }
     }
+
+    // check loop body
+    checkDeclarationInBlockNode(md, nametable, ln.getBody());
   }
 
   private void checkMethodBody(ClassDescriptor cd, MethodDescriptor md) {
@@ -925,7 +928,7 @@ public class FlowDownCheck {
 
     public static boolean isGreaterThan(Location loc1, Location loc2, ClassDescriptor priorityCD) {
 
-      //System.out.println("isGreaterThan=" + loc1 + " ? " + loc2);
+      // System.out.println("isGreaterThan=" + loc1 + " ? " + loc2);
       CompositeLocation compLoc1;
       CompositeLocation compLoc2;
 
@@ -946,7 +949,8 @@ public class FlowDownCheck {
       }
 
       // comparing two composite locations
-      // System.out.println("compare base location=" + compLoc1 + " ? " + compLoc2);
+      // System.out.println("compare base location=" + compLoc1 + " ? " +
+      // compLoc2);
 
       int baseCompareResult = compareBaseLocationSet(compLoc1, compLoc2, priorityCD);
       if (baseCompareResult == ComparisonResult.EQUAL) {
@@ -991,8 +995,8 @@ public class FlowDownCheck {
 
       if (priorityLoc1.getLocIdentifier().equals(priorityLoc2.getLocIdentifier())) {
         // have the same level of local hierarchy
-      } else if (locationOrder.isGreaterThan(priorityLoc1.getLocIdentifier(), priorityLoc2
-          .getLocIdentifier())) {
+      } else if (locationOrder.isGreaterThan(priorityLoc1.getLocIdentifier(),
+          priorityLoc2.getLocIdentifier())) {
         // if priority loc of compLoc1 is higher than compLoc2
         // then, compLoc 1 is higher than compLoc2
         return ComparisonResult.GREATER;
index dc488eab0a2f7aaee30c7b1afb917b794b00c133..22f31a272201a8ea7de20c015f07a4087fd98773 100644 (file)
@@ -40,6 +40,7 @@ public class State {
     this.excprefetch=new HashSet();
     this.classpath=new Vector();
     this.cd2locationOrderMap=new Hashtable();
+    this.cd2locationPropertyMap=new Hashtable();
     this.lines=0;
   }
 
@@ -206,6 +207,7 @@ public class State {
   private int numstaticblocks=0;
   private int arraycount=0;
   public Hashtable cd2locationOrderMap;
+  public Hashtable cd2locationPropertyMap;
   public boolean OPTIMIZE=false;
   public boolean LINENUM=false;
 
@@ -357,4 +359,12 @@ public class State {
     return cd2locationOrderMap;
   }
   
+  public void addLocationPropertySet(ClassDescriptor cd, Set<String> set){
+    cd2locationPropertyMap.put(cd,set);
+  }
+  
+  public Hashtable getCd2LocationPropertyMap(){
+    return cd2locationOrderMap;
+  }
+  
 }
index 04ba43b1f4c7dc7299828c37d29f487e5f6c1fe3..2f0277a1f0a4752fb76e2a752a4af225908802d0 100644 (file)
@@ -504,17 +504,26 @@ public void parseInitializers(ClassDescriptor cn){
   private void parseLocationOrder(ClassDescriptor cd, ParseNode pn) {
     ParseNodeVector pnv = pn.getChildren();
     Lattice<String> locOrder =
-        new Lattice<String>("_top_","_bottom_");
+        new Lattice<String>("_top_","_bottom_");            
+    Set<String> spinLocSet=new HashSet<String>();
     for (int i = 0; i < pnv.size(); i++) {
       ParseNode loc = pnv.elementAt(i);
-      String lowerLoc=loc.getChildren().elementAt(0).getLabel();
-      String higherLoc= loc.getChildren().elementAt(1).getLabel();
-      locOrder.put(higherLoc, lowerLoc);
-      if (locOrder.isIntroducingCycle(higherLoc)) {
-        throw new Error("Error: the order relation " + lowerLoc + " < " + higherLoc
-            + " introduces a cycle.");
+      if(isNode(loc,"location_property")){
+        String spinLoc=loc.getChildren().elementAt(0).getLabel();
+        spinLocSet.add(spinLoc);
+      }else{
+        String lowerLoc=loc.getChildren().elementAt(0).getLabel();
+        String higherLoc= loc.getChildren().elementAt(1).getLabel();
+        locOrder.put(higherLoc, lowerLoc);
+        if (locOrder.isIntroducingCycle(higherLoc)) {
+          throw new Error("Error: the order relation " + lowerLoc + " < " + higherLoc
+              + " introduces a cycle.");
+        }
       }
     }
+    if(spinLocSet.size()>0){
+      state.addLocationPropertySet(cd, spinLocSet);
+    }
     state.addLocationOrder(cd, locOrder);
   }
   
index 65ccd7a4a3f65cd3b72bfe10510d5e46d472fe32..e72d7c9db8c827bd5c4963556f13cc0ef0024a95 100644 (file)
@@ -1309,6 +1309,11 @@ location_order ::=
                pn.addChild(loc2);
                RESULT=pn;         
         :}
+       |       IDENTIFIER:loc MULT{:
+               ParseNode pn=new ParseNode("location_property",parser.lexer.line_num);          
+               pn.addChild(loc);
+               RESULT=pn;
+       :}
         ;
 
 // 19.9) Interfaces