Updated FlagState and TaskAnalysis with tagsupport.
authorsivaji <sivaji>
Fri, 18 May 2007 03:56:20 +0000 (03:56 +0000)
committersivaji <sivaji>
Fri, 18 May 2007 03:56:20 +0000 (03:56 +0000)
Robust/src/Analysis/TaskStateAnalysis/FlagState.java
Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java

index 44c82747c3e9cb7a373968f48eea7b137daacdeb..bc07cade4bbbd034ff78596b13f5fd872e999508 100644 (file)
@@ -32,7 +32,7 @@ public class FlagState {
     int discoverytime = -1;
     int finishingtime = -1; /* used for searches */
 
-    //Hashtable<String,Integer> tags=new Hashtable<String,Integer>();
+    //Hashtable<TagDescriptor,Integer> tags=new Hashtable<TagDescriptor,Integer>();
     Vector edges = new Vector();
     Vector inedges = new Vector();
     NodeStatus status = UNVISITED;
@@ -44,7 +44,7 @@ public class FlagState {
 
     private final HashSet flagstate;
     private final ClassDescriptor cd;
-    private final Hashtable<String,Integer> tags;
+    private final Hashtable<TagDescriptor,Integer> tags;
 
     public void setOption(String option) {
        this.nodeoption=","+option;
@@ -60,7 +60,7 @@ public class FlagState {
     public FlagState(ClassDescriptor cd) {
        this.flagstate=new HashSet();
        this.cd=cd;
-       this.tags=new Hashtable<String,Integer>();
+       this.tags=new Hashtable<TagDescriptor,Integer>();
        this.uid=FlagState.nodeid++;
     }
 
@@ -70,7 +70,7 @@ public class FlagState {
      * @param cd ClassDescriptor
      *  @param flagstate a <CODE>HashSet</CODE> containing FlagDescriptors
      */
-    private FlagState(HashSet flagstate, ClassDescriptor cd,Hashtable<String,Integer> tags) {
+    private FlagState(HashSet flagstate, ClassDescriptor cd,Hashtable<TagDescriptor,Integer> tags) {
        this.flagstate=flagstate;
        this.cd=cd;
        this.tags=tags;
@@ -100,16 +100,16 @@ public class FlagState {
     
     public FlagState setTag(TagDescriptor tag){
           
-           HashSet newset=flagstate.clone();
-           Hashtable<String,Integer> newtags=tags.clone();
+           HashSet newset=(HashSet)flagstate.clone();
+           Hashtable<TagDescriptor,Integer> newtags=(Hashtable<TagDescriptor,Integer>)tags.clone();
            
            if (newtags.containsKey(tag)){
                   switch (newtags.get(tag).intValue()){
                           case ONETAG:
-                                       newtags.put(tag,new Integer(MULTITAG));
+                                       newtags.put(tag,new Integer(MULTITAGS));
                                        break;
-                          case MULTITAG:
-                                       newtags.put(tag,new Integer(MULTITAG));
+                          case MULTITAGS:
+                                       newtags.put(tag,new Integer(MULTITAGS));
                                        break;
                        }
                }
@@ -126,38 +126,42 @@ public class FlagState {
                        if (tagtype.equals(td.getSymbol()))
                                return tags.get(td).intValue();   //returns either ONETAG or MULTITAG
                }
-               return NOTAG;
+               return NOTAGS;
                
     }
     
    
     
     public FlagState[] clearTag(TagDescriptor tag){
+           FlagState[] retstates;
            
            if (tags.containsKey(tag)){
            switch(tags.get(tag).intValue()){
                    case ONETAG:
-                       HashSet newset=flagstate.clone();
-                       Hashtable<String,Integer> newtags=tags.clone();
+                       HashSet newset=(HashSet)flagstate.clone();
+                       Hashtable<TagDescriptor,Integer> newtags=(Hashtable<TagDescriptor,Integer>)tags.clone();
                        newtags.remove(tag);
-                       return new FlagState(newset,cd,newtags);
-                       break;
-                   case MULTITAG:
-                       //when tagcount is more than 2, COUNT stays at MULTITAG
-                       FlagState[] retstates=new FlagState[2];
-                       HashSet newset1=flagstate.clone();
-                       Hashtable<String,Integer> newtags1=tags.clone();
+                       retstates=new FlagState[]{new FlagState(newset,cd,newtags)};
+                       return retstates;
+                       
+                   case MULTITAGS:
+                       //when tagcount is more than 2, COUNT stays at MULTITAGS
+                       retstates=new FlagState[2];
+                       HashSet newset1=(HashSet)flagstate.clone();
+                       Hashtable<TagDescriptor,Integer> newtags1=(Hashtable<TagDescriptor,Integer>)tags.clone();
                        retstates[1]=new FlagState(newset1,cd,newtags1);
                        //when tagcount is 2, COUNT changes to ONETAG
-                       HashSet newset2=flagstate.clone();
-                       Hashtable<String,Integer> newtags2=tags.clone();
+                       HashSet newset2=(HashSet)flagstate.clone();
+                       Hashtable<TagDescriptor,Integer> newtags2=(Hashtable<TagDescriptor,Integer>)tags.clone();
                        newtags1.put(tag,new Integer(ONETAG));
                        retstates[1]=new FlagState(newset2,cd,newtags2);
                        return retstates;
-                       break;
+               default:
+                       return null;                    
        }
                }else{
                        throw new Error("Invalid Operation: Can not clear a tag that doesn't exist.");
+                       
                }
                
     }
@@ -197,12 +201,14 @@ public class FlagState {
         
     public FlagState setFlag(FlagDescriptor fd, boolean status) {
        HashSet newset=(HashSet) flagstate.clone();
+       Hashtable<TagDescriptor,Integer> newtags=(Hashtable<TagDescriptor,Integer>)tags.clone();
        if (status)
            newset.add(fd);
        else if (newset.contains(fd)){
            newset.remove(fd);
        }
-       return new FlagState(newset, cd);
+       
+       return new FlagState(newset, cd,newtags);
     }
     
     /** Tests for equality of two flagstate objects.
@@ -302,7 +308,7 @@ public class FlagState {
                        case ONETAG:
                                label+=", "+td.toString()+"(1)";
                                break;
-                       case MULTITAG:
+                       case MULTITAGS:
                                label+=", "+td.toString()+"(n)";
                                break;
                        default:
index 441de09e076474e845dbc7adb2e04b9637fad90f..4e78681628f3edd093b77963e63fffa424a0ffcc 100644 (file)
@@ -219,14 +219,18 @@ public class TaskAnalysis {
                        toprocess.add(fsnew);
                    }
                } else if (ffan.getTaskType() == FlatFlagActionNode.TASKEXIT) {
-                   FlagState fs_taskexit=evalTaskExitNode(ffan,cd,fs,temp);
-                   if (!sourcenodes.containsKey(fs_taskexit)) {
-                       toprocess.add(fs_taskexit);
-                   }
-                   //seen this node already
-                   fs_taskexit=canonicalizeFlagState(sourcenodes,fs_taskexit);
-                   Edge newedge=new Edge(fs_taskexit,taskname);
-                   fs.addEdge(newedge);
+                   Vector<FlagState> fsv_taskexit=evalTaskExitNode(ffan,cd,fs,temp);
+                   
+                   for(Enumeration en=fsv_taskexit.elements();en.hasMoreElements();){
+                           FlagState fs_taskexit=(FlagState)en.nextElement();
+                       if (!sourcenodes.containsKey(fs_taskexit)) {
+                                       toprocess.add(fs_taskexit);
+                       }
+                       //seen this node already
+                       fs_taskexit=canonicalizeFlagState(sourcenodes,fs_taskexit);
+                       Edge newedge=new Edge(fs_taskexit,taskname);
+                       fs.addEdge(newedge);
+               }
                }
            }
        }
@@ -250,11 +254,11 @@ private boolean isTaskTrigger_flag(FlagExpressionNode fen,FlagState fs) {
     else
        switch (((FlagOpNode)fen).getOp().getOp()) {
        case Operation.LOGIC_AND:
-           return ((isTaskTrigger(((FlagOpNode)fen).getLeft(),fs)) && (isTaskTrigger(((FlagOpNode)fen).getRight(),fs)));
+           return ((isTaskTrigger_flag(((FlagOpNode)fen).getLeft(),fs)) && (isTaskTrigger_flag(((FlagOpNode)fen).getRight(),fs)));
        case Operation.LOGIC_OR:
-           return ((isTaskTrigger(((FlagOpNode)fen).getLeft(),fs)) || (isTaskTrigger(((FlagOpNode)fen).getRight(),fs)));
+           return ((isTaskTrigger_flag(((FlagOpNode)fen).getLeft(),fs)) || (isTaskTrigger_flag(((FlagOpNode)fen).getRight(),fs)));
        case Operation.LOGIC_NOT:
-           return !(isTaskTrigger(((FlagOpNode)fen).getLeft(),fs));
+           return !(isTaskTrigger_flag(((FlagOpNode)fen).getLeft(),fs));
        default:
            return false;
        }
@@ -266,15 +270,14 @@ private boolean isTaskTrigger_tag(TagExpressionList tel, FlagState fs){
        for (int i=0;i<tel.numTags() ; i++){
                switch (fs.getTagCount(tel.getType(i))){
                        case FlagState.ONETAG:
-                       case FlagState.MULTITAG:
-                               retval=true;
+                       case FlagState.MULTITAGS:
                                break;
-                       case FlagState.NOTAG:
+                       case FlagState.NOTAGS:
                                return false;
-                               break;          
                }
-               return true;
+               
        }
+       return true;
 }
 
 /*private int tagTypeCount(TagExpressionList tel, String tagtype){
@@ -319,33 +322,48 @@ private boolean isTaskTrigger_tag(TagExpressionList tel, FlagState fs){
                        }
                        else
                                break;  
+               
+               }
                return fstemp;
-       }
+}
        
        private Vector<FlagState> evalTaskExitNode(FlatNode nn,ClassDescriptor cd,FlagState fs, TempDescriptor temp){
                FlagState fstemp=fs;
                //FlagState[] fstemparray=new FlagState[3];
-               Vector<FlagState> fsv=new Vector<FlagState>();
-               
-                                   
+               Vector<FlagState> inprocess=new Vector<FlagState>();
+               Vector<FlagState> processed=new Vector<FlagState>();
+                           
                for(Iterator it_tfp=((FlatFlagActionNode)nn).getTempFlagPairs();it_tfp.hasNext();) {
                        TempFlagPair tfp=(TempFlagPair)it_tfp.next();
                        if (temp==tfp.getTemp())
                            fstemp=fstemp.setFlag(tfp.getFlag(),((FlatFlagActionNode)nn).getFlagChange(tfp));
                }
                
+               inprocess.add(fstemp);
+               processed.add(fstemp);
+               
                for(Iterator it_ttp=((FlatFlagActionNode)nn).getTempTagPairs();it_ttp.hasNext();) {
                        TempTagPair ttp=(TempTagPair)it_ttp.next();
-                       if (temp==ttp.getTemp()){
-                               if (((FlatFlagActionNode)nn).getTagChange(ttp)){
-                                       fstemp=fstemp.setTag(ttp.getTag());
-                                       fstemp
-                               else
-                                       fstemparray     
+                       
+                       if (temp==ttp.getTemp()){       
+                               processed=new Vector<FlagState>();                      
+                               for (Enumeration en=inprocess.elements();en.hasMoreElements();){
+                                       FlagState fsworking=(FlagState)en.nextElement();
+                                       if (((FlatFlagActionNode)nn).getTagChange(ttp)){
+                                               fsworking=fsworking.setTag(ttp.getTag());
+                                               processed.add(fsworking);
+                                       }
+                                       else
+                                       {       
+                                               processed.addAll(Arrays.asList(fsworking.clearTag(ttp.getTag())));
+                                       }
+                               }
+                               inprocess=processed;
                }
-               
-               return fstemp;
-       }               
+               }
+               return processed;
+       
+}              
            
 
     private FlagState canonicalizeFlagState(Hashtable sourcenodes, FlagState fs){
@@ -408,5 +426,6 @@ private boolean isTaskTrigger_tag(TagExpressionList tel, FlagState fs){
        fstemp=canonicalizeFlagState(sourcenodes,fstemp);
        fs.addEdge(new Edge(fstemp,"Runtime"));
     }
+       }
 } 
-}
+