From: bdemsky Date: Wed, 18 Jul 2007 19:21:19 +0000 (+0000) Subject: bug fixes X-Git-Tag: preEdgeChange~523 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=7878f13f1e1ef17792a12adf59fc4f89dacc8229;p=IRC.git bug fixes --- diff --git a/Robust/src/Analysis/TaskStateAnalysis/FlagState.java b/Robust/src/Analysis/TaskStateAnalysis/FlagState.java index 6e122435..78233e15 100644 --- a/Robust/src/Analysis/TaskStateAnalysis/FlagState.java +++ b/Robust/src/Analysis/TaskStateAnalysis/FlagState.java @@ -115,27 +115,31 @@ public class FlagState extends GraphNode { return flagstate.iterator(); } - public FlagState setTag(TagDescriptor tag){ - - HashSet newset=(HashSet)flagstate.clone(); - Hashtable newtags=(Hashtable)tags.clone(); + public FlagState[] setTag(TagDescriptor tag){ + HashSet newset1=(HashSet)flagstate.clone(); + Hashtable newtags1=(Hashtable)tags.clone(); - if (newtags.containsKey(tag)){ - switch (newtags.get(tag).intValue()){ - case ONETAG: - newtags.put(tag,new Integer(MULTITAGS)); - break; - case MULTITAGS: - newtags.put(tag,new Integer(MULTITAGS)); - break; - } - } - else{ - newtags.put(tag,new Integer(ONETAG)); - } - - return new FlagState(newset,cd,newtags); - + if (tags.containsKey(tag)){ + //Code could try to remove flag that doesn't exist + + HashSet newset2=(HashSet)flagstate.clone(); + Hashtable newtags2=(Hashtable)tags.clone(); + switch (tags.get(tag).intValue()){ + case ONETAG: + newtags1.put(tag,new Integer(MULTITAGS)); + break; + case MULTITAGS: + newtags1.put(tag,new Integer(MULTITAGS)); + break; + default: + throw new Error(); + } + return new FlagState[] {new FlagState(newset1,cd,newtags1), + new FlagState(newset2,cd,newtags2)}; + } else { + newtags1.put(tag,new Integer(ONETAG)); + return new FlagState[] {new FlagState(newset1,cd,newtags1)}; + } } public int getTagCount(String tagtype){ @@ -149,37 +153,32 @@ public class FlagState extends GraphNode { } public FlagState[] clearTag(TagDescriptor tag){ - FlagState[] retstates; - - if (tags.containsKey(tag)){ + if (tags.containsKey(tag)){ switch(tags.get(tag).intValue()){ - case ONETAG: - HashSet newset=(HashSet)flagstate.clone(); - Hashtable newtags=(Hashtable)tags.clone(); - newtags.remove(tag); - 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 newtags1=(Hashtable)tags.clone(); - retstates[1]=new FlagState(newset1,cd,newtags1); - //when tagcount is 2, COUNT changes to ONETAG - HashSet newset2=(HashSet)flagstate.clone(); - Hashtable newtags2=(Hashtable)tags.clone(); - newtags1.put(tag,new Integer(ONETAG)); - retstates[1]=new FlagState(newset2,cd,newtags2); - return retstates; - default: - return null; - } - }else{ - throw new Error("Invalid Operation: Can not clear a tag that doesn't exist."); - - } + case ONETAG: + HashSet newset=(HashSet)flagstate.clone(); + Hashtable newtags=(Hashtable)tags.clone(); + newtags.remove(tag); + return new FlagState[]{new FlagState(newset,cd,newtags)}; + case MULTITAGS: + //two possibilities - count remains 2 or becomes 1 + //2 case + HashSet newset1=(HashSet)flagstate.clone(); + Hashtable newtags1=(Hashtable)tags.clone(); + + //1 case + HashSet newset2=(HashSet)flagstate.clone(); + Hashtable newtags2=(Hashtable)tags.clone(); + newtags1.put(tag,new Integer(ONETAG)); + return new FlagState[] {new FlagState(newset1, cd, newtags2), + new FlagState(newset2, cd, newtags2)}; + default: + throw new Error(); + } + } else { + throw new Error("Invalid Operation: Can not clear a tag that doesn't exist."); + } } /** Creates a string description of the flagstate diff --git a/Robust/src/Analysis/TaskStateAnalysis/TagAnalysis.java b/Robust/src/Analysis/TaskStateAnalysis/TagAnalysis.java index 24b7417a..93840a16 100644 --- a/Robust/src/Analysis/TaskStateAnalysis/TagAnalysis.java +++ b/Robust/src/Analysis/TaskStateAnalysis/TagAnalysis.java @@ -5,6 +5,7 @@ import java.util.Stack; import java.util.Set; import java.util.HashSet; import java.util.Iterator; +import java.util.Arrays; import Util.Edge; import Analysis.CallGraph.CallGraph; import IR.SymbolTable; @@ -144,22 +145,36 @@ private void computeCallsFlags(FlatMethod fm, Hashtable parammap, Set tagbinding else fs=fs.setFlag(tfp.getFlag(), false); } + + HashSet fsset=new HashSet(); + fsset.add(fs); + for(Iterator it=ffan.getTempTagPairs();it.hasNext();) { + HashSet oldfsset=fsset; + fsset=new HashSet(); + TempTagPair ttp=(TempTagPair)it.next(); if (ffan.getTagChange(ttp)) { TagDescriptor tag=ttp.getTag(); if (tag==null&¶mmap!=null&¶mmap.containsKey(ttp.getTagTemp())) { tag=(TagDescriptor)parammap.get(ttp.getTagTemp()); } - fs=fs.setTag(tag); + for(Iterator setit=oldfsset.iterator();setit.hasNext();) { + FlagState fs2=(FlagState)setit.next(); + fsset.addAll(Arrays.asList(fs2.setTag(tag))); + } } else throw new Error("Don't clear tag in new object allocation"); } - if (!flagmap.containsKey(fs)) - flagmap.put(fs,fs); - else - fs=(FlagState) flagmap.get(fs); - newflags.add(fs); + + for(Iterator setit=fsset.iterator();setit.hasNext();) { + FlagState fs2=(FlagState)setit.next(); + if (!flagmap.containsKey(fs2)) + flagmap.put(fs2,fs2); + else + fs2=(FlagState) flagmap.get(fs2); + newflags.add(fs2); + } } } } diff --git a/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java b/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java index 59251024..cb8cf702 100644 --- a/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java +++ b/Robust/src/Analysis/TaskStateAnalysis/TaskAnalysis.java @@ -252,7 +252,6 @@ private void analyseTasks(FlagState fs) { for(Enumeration en=fsv_taskexit.elements();en.hasMoreElements();){ FlagState fs_taskexit=(FlagState)en.nextElement(); - if (fs_taskexit == null ) System.out.println("Bug to fix : fs_taskexit == null");//continue; if (!sourcenodes.containsKey(fs_taskexit)) { toprocess.add(fs_taskexit); @@ -333,83 +332,37 @@ private boolean isTaskTrigger_tag(TagExpressionList tel, FlagState fs){ return ctr; } */ -/** Evaluates a NewObject Node and returns the newly created - * flagstate to add to the process queue. - * @param nn FlatNode - * @return FlagState - * @see FlatNode - * @see FlagState - */ - -private FlagState evalNewObjNode(FlatNode nn){ - - ClassDescriptor cd_new=((FlatNew)nn.getPrev(0)).getType().getClassDesc(); - - - //TempDescriptor[] tdArray = ((FlatFlagActionNode)nn).readsTemps(); - - //if (tdArray.length==0) - // return null; - - //Under the safe assumption that all the temps in FFAN.NewObject node are of the same type(class) - //ClassDescriptor cd_new=tdArray[0].getType().getClassDesc(); - - FlagState fstemp=new FlagState(cd_new); - - for(Iterator it_tfp=((FlatFlagActionNode)nn).getTempFlagPairs();it_tfp.hasNext();) { - TempFlagPair tfp=(TempFlagPair)it_tfp.next(); - if (! (tfp.getFlag()==null))// condition checks if the new object was created without any flag setting - { - fstemp=fstemp.setFlag(tfp.getFlag(),((FlatFlagActionNode)nn).getFlagChange(tfp)); - } - - else - break; - } - for(Iterator it_ttp=((FlatFlagActionNode)nn).getTempTagPairs();it_ttp.hasNext();) { - TempTagPair ttp=(TempTagPair)it_ttp.next(); - if (! (ttp.getTag()==null)){ - fstemp=fstemp.setTag(ttp.getTag()); - } - else - break; - - } - return fstemp; -} - - private Vector evalTaskExitNode(FlatNode nn,ClassDescriptor cd,FlagState fs, TempDescriptor temp){ + private Vector evalTaskExitNode(FlatFlagActionNode ffan,ClassDescriptor cd,FlagState fs, TempDescriptor temp){ FlagState fstemp=fs; - //FlagState[] fstemparray=new FlagState[3]; - Vector inprocess=new Vector(); Vector processed=new Vector(); + + //Process the flag changes - for(Iterator it_tfp=((FlatFlagActionNode)nn).getTempFlagPairs();it_tfp.hasNext();) { + for(Iterator it_tfp=ffan.getTempFlagPairs();it_tfp.hasNext();) { TempFlagPair tfp=(TempFlagPair)it_tfp.next(); if (temp==tfp.getTemp()) - fstemp=fstemp.setFlag(tfp.getFlag(),((FlatFlagActionNode)nn).getFlagChange(tfp)); + fstemp=fstemp.setFlag(tfp.getFlag(),ffan.getFlagChange(tfp)); } - inprocess.add(fstemp); + //Process the tag changes + processed.add(fstemp); - for(Iterator it_ttp=((FlatFlagActionNode)nn).getTempTagPairs();it_ttp.hasNext();) { + for(Iterator it_ttp=ffan.getTempTagPairs();it_ttp.hasNext();) { TempTagPair ttp=(TempTagPair)it_ttp.next(); - if (temp==ttp.getTemp()){ - processed=new Vector(); - for (Enumeration en=inprocess.elements();en.hasMoreElements();){ + if (temp==ttp.getTemp()) { + Vector oldprocess=processed; + processed=new Vector(); + + for (Enumeration en=oldprocess.elements();en.hasMoreElements();){ FlagState fsworking=(FlagState)en.nextElement(); - if (((FlatFlagActionNode)nn).getTagChange(ttp)){ - fsworking=fsworking.setTag(ttp.getTag()); - processed.add(fsworking); + if (ffan.getTagChange(ttp)){ + processed.addAll(Arrays.asList(fsworking.setTag(ttp.getTag()))); + } else { + processed.addAll(Arrays.asList(fsworking.clearTag(ttp.getTag()))); } - else - { - processed.addAll(Arrays.asList(fsworking.clearTag(ttp.getTag()))); - } } - inprocess=processed; } } return processed;