package Analysis.TaskStateAnalysis;
-import Analysis.TaskStateAnalysis.*;
import IR.*;
import IR.Tree.*;
import IR.Flat.*;
import java.util.*;
import java.io.File;
import java.io.FileWriter;
+import java.io.FileOutputStream;
+
+public class TaskAnalysis {
+ State state;
+ Hashtable flagstates;
+ Hashtable flags;
+ Hashtable extern_flags;
+ Queue<FlagState> toprocess;
+ TagAnalysis taganalysis;
+ Hashtable cdtorootnodes;
+
+ TypeUtil typeutil;
+
+ /**
+ * Class Constructor
+ *
+ * @param state a flattened State object
+ * @see State
+ */
+ public TaskAnalysis(State state, TagAnalysis taganalysis)
+ {
+ this.state=state;
+ this.typeutil=new TypeUtil(state);
+ this.taganalysis=taganalysis;
+
+ }
+
+ /** Builds a table of flags for each class in the Bristlecone program.
+ * It creates two hashtables: one which holds the ClassDescriptors and arrays of
+ * FlagDescriptors as key-value pairs; the other holds the ClassDescriptor and the
+ * number of external flags for that specific class.
+ */
+
+ private void getFlagsfromClasses() {
+ flags=new Hashtable();
+ extern_flags = new Hashtable();
+
+ /** Iterate through the classes used in the program to build the table of flags
+ */
+ for(Iterator it_classes=state.getClassSymbolTable().getDescriptorsIterator();it_classes.hasNext();) {
+
+ ClassDescriptor cd = (ClassDescriptor)it_classes.next();
+ Vector vFlags=new Vector();
+ FlagDescriptor flag[];
+ int ctr=0;
+
+
+ /* Adding the flags of the super class */
+ if (cd.getSuper()!=null) {
+ ClassDescriptor superdesc=cd.getSuperDesc();
+
+ for(Iterator it_cflags=superdesc.getFlags();it_cflags.hasNext();) {
+ FlagDescriptor fd = (FlagDescriptor)it_cflags.next();
+ vFlags.add(fd);
+ }
+ }
-public class TaskAnalysis
-{
- State state;
-// Vector vFlags; //Vector holding the FlagDescriptors from all the classes used
-// FlagDescriptor flags[];
- Hashtable Adj_List;
- Hashtable flags;
- Hashtable extern_flags;
- Queue<TriggerState> q_main;
+ for(Iterator it_cflags=cd.getFlags();it_cflags.hasNext();) {
+ FlagDescriptor fd = (FlagDescriptor)it_cflags.next();
+ vFlags.add(fd);
+ }
- /**
- * Class Constructor
- *
- * @param state a flattened State object
- * @see State
- */
- public TaskAnalysis(State state)
- {
- this.state=state;
+ if (vFlags.size()!=0) {
+ flag=new FlagDescriptor[vFlags.size()];
+
+ for(int i=0;i < vFlags.size() ; i++) {
+ if (((FlagDescriptor)vFlags.get(i)).getExternal()) {
+ flag[ctr]=(FlagDescriptor)vFlags.get(i);
+ vFlags.remove(flag[ctr]);
+ ctr++;
+ }
+ }
+ for(int i=0;i < vFlags.size() ; i++) {
+ flag[i+ctr]=(FlagDescriptor)vFlags.get(i);
+ }
+ extern_flags.put(cd,new Integer(ctr));
+ flags.put(cd,flag);
+
+ }
}
- private void getFlagsfromClasses() //This function returns the number of external flags amongst the other things it does.
- {
+ }
+ /** Method which starts up the analysis
+ *
+ */
+
+ public void taskAnalysis() throws java.io.IOException {
+ flagstates=new Hashtable();
+ Hashtable<FlagState,FlagState> sourcenodes;
+ cdtorootnodes=new Hashtable();
- flags=new Hashtable();
- extern_flags = new Hashtable();
-
- for(Iterator it_classes=state.getClassSymbolTable().getDescriptorsIterator();it_classes.hasNext();)
- {
-
- ClassDescriptor cd = (ClassDescriptor)it_classes.next();
- System.out.println(cd.getSymbol());
- Vector vFlags=new Vector();
- FlagDescriptor flag[];
- int ctr=0;
-
-
- /* Adding the flags of the super class */
- if (cd.getSuper()!=null)
- {
- ClassDescriptor superdesc=cd.getSuperDesc();
-
- for(Iterator it_cflags=superdesc.getFlags();it_cflags.hasNext();)
- {
- FlagDescriptor fd = (FlagDescriptor)it_cflags.next();
- System.out.println(fd.toString());
- vFlags.add(fd);
- }
- }
- /*************************************/
-
- for(Iterator it_cflags=cd.getFlags();it_cflags.hasNext();)
- {
- FlagDescriptor fd = (FlagDescriptor)it_cflags.next();
- System.out.println(fd.toString());
- vFlags.add(fd);
- }
- if (vFlags.size()!=0)
- {
- flag=new FlagDescriptor[vFlags.size()];
-
- for(int i=0;i < vFlags.size() ; i++)
- {
- if (((FlagDescriptor)vFlags.get(i)).getExternal())
- {
- flag[ctr]=(FlagDescriptor)vFlags.get(i);
- vFlags.remove(flag[ctr]);
- ctr++;
- }
- }
- for(int i=0;i < vFlags.size() ; i++)
- {
- flag[i+ctr]=(FlagDescriptor)vFlags.get(i);
- }
- extern_flags.put(cd,new Integer(ctr));
- flags.put(cd,flag);
+ getFlagsfromClasses();
+
+ int externs;
+ toprocess=new LinkedList<FlagState>();
+
+ for(Iterator it_classes=(Iterator)flags.keys();it_classes.hasNext();) {
+ ClassDescriptor cd=(ClassDescriptor)it_classes.next();
+ externs=((Integer)extern_flags.get(cd)).intValue();
+ FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
+ flagstates.put(cd,new Hashtable<FlagState,FlagState>());
+ cdtorootnodes.put(cd,new Vector());
+ }
+
+
+ ClassDescriptor startupobject=typeutil.getClass(TypeUtil.StartupClass);
+
+ sourcenodes=(Hashtable<FlagState,FlagState>)flagstates.get(startupobject);
+ FlagState fsstartup=new FlagState(startupobject);
+
+
+ FlagDescriptor[] fd=(FlagDescriptor[])flags.get(startupobject);
+
+ fsstartup=fsstartup.setFlag(fd[0],true);
+ fsstartup.setAsSourceNode();
+ ((Vector)cdtorootnodes.get(startupobject)).add(fsstartup);
- }
- }
+ sourcenodes.put(fsstartup,fsstartup);
+ toprocess.add(fsstartup);
+ /** Looping through the flagstates in the toprocess queue to perform the state analysis */
+ while (!toprocess.isEmpty()) {
+ FlagState trigger=toprocess.poll();
+ createPossibleRuntimeStates(trigger);
+
+ analyseTasks(trigger);
}
-
- public void taskAnalysis() throws java.io.IOException
- {
- Adj_List=new Hashtable();
-
- getFlagsfromClasses();
-
- int externs;
- q_main=new LinkedList<TriggerState>();
-
- // for(Iterator it_classes=state.getClassSymbolTable().getDescriptorsIterator();it_classes.hasNext();)
- for(Iterator it_classes=(Iterator)flags.keys();it_classes.hasNext();)
- {
- ClassDescriptor cd=(ClassDescriptor)it_classes.next();
-
- externs=((Integer)extern_flags.get(cd)).intValue();
-
- FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
- //Debug block
- System.out.println("Inside taskAnalysis;\n Class:"+ cd.getSymbol());
- System.out.println("No of externs " + externs);
- System.out.println("No of flags: "+fd.length);
- //Debug block
- if (fd.length == externs)
- {
- System.out.println("extern called");
- boolean onlyExterns=true;
-// processExterns(true,cd);
- /*Queue<TriggerState> q_temp=createPossibleRuntimeStates(cd);
- if ( q_temp != null)
- {
- q_main.addAll(q_temp);
- }
- */
-
- }
- else
- {
- if ((fd.length == 1) && (fd[0].getSymbol().compareTo("initialstate")==0))
- {
- FlagState fstemp=new FlagState(fd);
- Hashtable Adj_List_temp=new Hashtable();
-
- fstemp.put(fd[0],new Boolean(true));
- Vector vtemp=new Vector();
- vtemp.add(new Edge(fstemp,"Runtime"));
- Adj_List_temp.put(new FlagState(fd),vtemp);
- Adj_List.put(cd,Adj_List_temp);
-
- Queue<TriggerState> q_temp=analyseTasks(new TriggerState(cd,fstemp));
-
-
- if ( q_temp != null)
- {
- q_main.addAll(q_temp);
- }
-
- }
- }
- }
- while (q_main.size() > 0)
- {
- // ****debug block********
- for (Iterator it_qm=q_main.iterator();it_qm.hasNext();)
- {
- TriggerState ts_qm=(TriggerState)it_qm.next();
- FlagState fs_qm=ts_qm.getState();
- System.out.println("/***********contents of main q**********/");
- System.out.println("FS : "+fs_qm.toString((FlagDescriptor [])flags.get(ts_qm.getClassDescriptor())));
-
-
- }
- System.out.println("/*********************************/");
- // ****debug block********
- Queue<TriggerState> q_temp=analyseTasks(q_main.poll());
- if ( q_temp != null)
- {
- q_main.addAll(q_temp);
- }
- }
-
- //Creating DOT files
- Enumeration e=Adj_List.keys();
-
- while (e.hasMoreElements())
- {
- System.out.println("creating dot file");
- ClassDescriptor cdtemp=(ClassDescriptor)e.nextElement();
- System.out.println((cdtemp.getSymbol()));
- // createDOTfile((ClassDescriptor)e.nextElement());
- createDOTfile(cdtemp);
- }
-
+
+ /** Creating DOT files */
+ Enumeration e=flagstates.keys();
+
+ while (e.hasMoreElements()) {
+ ClassDescriptor cdtemp=(ClassDescriptor)e.nextElement();
+ createDOTfile(cdtemp);
}
-
-
- public Queue<TriggerState> analyseTasks(TriggerState ts) throws java.io.IOException
- {
- Queue<FlagState> q;
- Queue<FlagState> qft;
-
- Hashtable Adj_List_temp;
- Queue<TriggerState> q_retval;
-
- ClassDescriptor cd=ts.getClassDescriptor();
-
- if (Adj_List.containsKey(cd))
- {
- //Debug block
- System.out.println("Inside analyseTasks;\n Checking if adj_list contains the class desc:"+ cd.getSymbol());
- //Debug block
-
- Adj_List_temp=(Hashtable)Adj_List.get(cd);
- }
- else
- {
- Adj_List_temp=new Hashtable();
- Adj_List.put(cd,Adj_List_temp);
- }
-
-
- int externs=((Integer)extern_flags.get(cd)).intValue();
- FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
-
- q = new LinkedList<FlagState>();
- q_retval=new LinkedList<TriggerState>();
- q.offer(ts.getState());
-
- //***Debug Block***
- //
- /*Enumeration eFlags=fsinitial.getStateTable().keys();
-
- while(eFlags.hasMoreElements())
- {
- System.out.println(((FlagDescriptor)eFlags.nextElement()).toString());
- } */
- //***Debug Block***
-
- while (q.size() != 0 /* && debug_ctr<10*/ )
- {
- System.out.println("inside while loop in analysetasks \n");
-
- FlagState fsworking=q.poll();
-
- //***Debug Block***
- FlagDescriptor[] ftemp=(FlagDescriptor[])flags.get(cd);
- System.out.println("Processing state: "+cd.getSymbol()+" " + fsworking.toString(ftemp));
-
- //***Debug Block***
-
-
- for(Iterator it_tasks=state.getTaskSymbolTable().getDescriptorsIterator();it_tasks.hasNext();)
- {
- TaskDescriptor td = (TaskDescriptor)it_tasks.next();
- boolean taskistriggered=false;
- int ctr=0;
- String taskname=getTaskName(td);
-
-
-
- //***Debug Block***
-
- System.out.println();
- System.out.println("Method: AnalyseTasks");
- System.out.println(taskname);
- System.out.println();
-
- //***Debug Block***
-
-
- for(int i=0; i < td.numParameters(); i++)
- {
- //System.out.println("\n Num of parameters: "+td.numParameters());
-
- FlagExpressionNode fen=td.getFlag(td.getParameter(i));
- if (isTaskTrigger(fen,fsworking))
- taskistriggered = true;
- // ctr++;
-
- }
-
- //***Debug Block***
-
- //System.out.println("xxx "+ctr);
-
- //***Debug Block***
-
- /* if (ctr == td.numParameters())
- {
- taskistriggered = true;
- }*/
- if (taskistriggered)
- {
- //***Debug Block***
- //
- System.out.println("inside taskistriggered");
-
- //***Debug Block***
-
- // Adj_List.put(fsworking,new Integer(2));
- // System.out.println(td.toString());
- // printAdjList(cd);
-
- if (wasFlagStateProcessed(Adj_List_temp,fsworking))
- {
- if (! (fd.length == externs))
- continue;
- }
- else
- Adj_List_temp.put(fsworking,new Vector());
-
-/* qft=createPossibleRuntimeStates(new TriggerState(cd,new FlagState(fsworking.getStateTable())));
- for (Iterator it_qft=qft.iterator();it_qft.hasNext();)
- {
- FlagState fs_qft=(FlagState)it_qft.next();
- if (!existsInFSQueue(q,fs_qft))
- q.add(fs_qft);
-
- }
-*/
- FlatMethod fm = state.getMethodFlat(td);
- FlatNode fn=fm.methodEntryNode();
-
- HashSet tovisit= new HashSet();
- HashSet visited= new HashSet();
-
- tovisit.add(fn);
- while(!tovisit.isEmpty())
- {
- FlatNode fn1 = (FlatNode)tovisit.iterator().next();
- tovisit.remove(fn1);
- visited.add(fn1);
- for(int i = 0; i < fn1.numNext(); i++)
- {
- FlatNode nn=fn1.getNext(i);
- /* if (nn.kind()==4)
- {
- ClassDescriptor cd_flatnew=processFlatNew(nn);
- if (cd_flatnew != null)
- {
- //Create possible runtime states for this object
- q_retval.addAll(createPossibleRuntimeStates(new TriggerState(cd_flatnew,new FlagState((FlagDescriptor[])flags.get(cd_flatnew)))));
- }
- }
- else
- */
-
- if (nn.kind()==13)
- {
- //***Debug Block***
- // System.out.println();
-
-
-
- //***Debug Block***
- if (((FlatFlagActionNode)nn).getFFANType() == FlatFlagActionNode.PRE)
- {
- //***Debug Block***
- System.out.println("PRE");
- //***Debug Block***
-
- FlagState fstemp=new FlagState(fsworking.getStateTable());
- for(Iterator it_tfp=((FlatFlagActionNode)nn).getTempFlagPairs();it_tfp.hasNext();)
- {
- TempFlagPair tfp=(TempFlagPair)it_tfp.next();
- // System.out.println(tfp.getTemp()+" " +tfp.getFlag()+" "+((FlatFlagActionNode)nn).getFlagChange(tfp));
- fstemp.put(tfp.getFlag(),new Boolean(((FlatFlagActionNode)nn).getFlagChange(tfp)));
- }
- if (! edgeexists(Adj_List_temp,fsworking,fstemp,taskname+"_PRE"))
- {
- ((Vector)Adj_List_temp.get(fsworking)).add(new Edge(fstemp,taskname+"_PRE"));
- }
- if (!wasFlagStateProcessed(Adj_List_temp,fstemp))
- {
- q.offer(fstemp);
- //pretasks.put(td,fstemp);
-
- }
- fstemp=null;
-
- }
- if (((FlatFlagActionNode)nn).getFFANType() == FlatFlagActionNode.NEWOBJECT)
- {
- //***Debug Block***
- System.out.println("NEWObject");
- //***Debug Block***
-
-
- TempDescriptor[] tdArray = ((FlatFlagActionNode)nn).readsTemps();
-
- //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();
-
- System.out.println("Class: "+cd_new.getSymbol());
-
- FlagState fstemp=new FlagState((FlagDescriptor[])flags.get(cd_new));
-
- for(Iterator it_tfp=((FlatFlagActionNode)nn).getTempFlagPairs();it_tfp.hasNext();)
- {
- TempFlagPair tfp=(TempFlagPair)it_tfp.next();
- if (tfp.getFlag()==null)
- {
- System.out.println("test1");
- q_retval.addAll(createPossibleRuntimeStates(new TriggerState(cd_new,new FlagState((FlagDescriptor[])flags.get(cd_new)))));
- // ****debug block********
- System.out.println("/***********contents of q ret**********/");
- for (Iterator it_qret=q_retval.iterator();it_qret.hasNext();)
- {
- TriggerState ts_qret=(TriggerState)it_qret.next();
- FlagState fs_qret=ts_qret.getState();
-
- System.out.println("FS : "+fs_qret.toString((FlagDescriptor [])flags.get(ts_qret.getClassDescriptor())));
- }
- System.out.println("/*********************************/");
- // ****debug block********
- }
- else
- fstemp.put(tfp.getFlag(),new Boolean(((FlatFlagActionNode)nn).getFlagChange(tfp)));
-
-
- }
-
- //***Debug Block***
- System.out.println("test2");
- System.out.println("Newobj fsworking "+fsworking.toString((FlagDescriptor [])flags.get(cd_new)));
- System.out.println("Newobj fstemp "+fstemp.toString((FlagDescriptor [])flags.get(cd_new)));
-
- //***Debug Block***
-
- q_retval.offer(new TriggerState(cd_new,fstemp));
-
- //make this a function containsExterns()
- int extrns=((Integer)extern_flags.get(cd_new)).intValue();
-
- if ((extrns >0) && (extrns!=((FlagDescriptor[])flags.get(cd_new)).length))
- q_retval.addAll(createPossibleRuntimeStates(new TriggerState(cd_new,fstemp)));
-
- fstemp=null;
- // ****debug block********
- System.out.println("/***********contents of q ret 1**********/");
- for (Iterator it_qret=q_retval.iterator();it_qret.hasNext();)
- {
- TriggerState ts_qret=(TriggerState)it_qret.next();
- FlagState fs_qret=ts_qret.getState();
-
- System.out.println("FS : "+fs_qret.toString((FlagDescriptor [])flags.get(ts_qret.getClassDescriptor())));
- }
- System.out.println("/*********************************/");
- // ****debug block********
-
- }
- if (((FlatFlagActionNode)nn).getFFANType() == FlatFlagActionNode.TASKEXIT)
- {
- //***Debug Block***
- //
- System.out.println("TaskExit");
- //***Debug Block***
-
- FlagState fstemp=new FlagState(fsworking.getStateTable());
-
- for(Iterator it_tfp=((FlatFlagActionNode)nn).getTempFlagPairs();it_tfp.hasNext();)
- {
- TempFlagPair tfp=(TempFlagPair)it_tfp.next();
- fstemp.put(tfp.getFlag(),new Boolean(((FlatFlagActionNode)nn).getFlagChange(tfp)));
- }
- //***Debug Block***
- System.out.println();
- System.out.println(fstemp.toString((FlagDescriptor [])flags.get(cd)));
- System.out.println();
- System.out.println("taskexit fsworking "+fsworking.toString((FlagDescriptor [])flags.get(cd)));
- System.out.println("taskexit fstemp "+fstemp.toString((FlagDescriptor [])flags.get(cd)));
-
- //***Debug Block***
- if (!edgeexists(Adj_List_temp,fsworking,fstemp,taskname))
- {
-
-
- ((Vector)Adj_List_temp.get(fsworking)).add(new Edge(fstemp,taskname));
-
- }
- if (!wasFlagStateProcessed(Adj_List_temp,fstemp))
- {
- q.offer(fstemp);
- }
- fstemp=null;
-
- }
- }
-
- if (!visited.contains(nn) && !tovisit.contains(nn))
- {
- tovisit.add(nn);
- }
- }
- }
- }
- }
-
- }
-
-
- if (q_retval.size()==0)
- {
- return null;
- }
- else
- {
- return q_retval;
- }
+ }
+
+
+ /** Analyses the set of tasks based on the given flagstate, checking
+ * to see which tasks are triggered and what new flagstates are created
+ * from the base flagstate.
+ * @param fs A FlagState object which is used to analyse the task
+ * @see FlagState
+ */
+
+private void analyseTasks(FlagState fs) {
+ ClassDescriptor cd=fs.getClassDescriptor();
+ Hashtable<FlagState,FlagState> sourcenodes=(Hashtable<FlagState,FlagState>)flagstates.get(cd);
+
+ for(Iterator it_tasks=state.getTaskSymbolTable().getDescriptorsIterator();it_tasks.hasNext();) {
+ TaskDescriptor td = (TaskDescriptor)it_tasks.next();
+ String taskname=td.getSymbol();
+
+ /** counter to keep track of the number of parameters (of the task being analyzed) that
+ * are satisfied by the flagstate.
+ */
+ int trigger_ctr=0;
+ TempDescriptor temp=null;
+ FlatMethod fm = state.getMethodFlat(td);
+
+ for(int i=0; i < td.numParameters(); i++) {
+ FlagExpressionNode fen=td.getFlag(td.getParameter(i));
+ TagExpressionList tel=td.getTag(td.getParameter(i));
+
+ /** Checking to see if the parameter is of the same type/class as the
+ * flagstate's and also if the flagstate fs triggers the given task*/
+ if (typeutil.isSuperorType(td.getParamType(i).getClassDesc(),cd)
+ && isTaskTrigger_flag(fen,fs)
+ && isTaskTrigger_tag(tel,fs)) {
+ temp=fm.getParameter(i);
+ trigger_ctr++;
+ }
}
-
- private boolean isTaskTrigger(FlagExpressionNode fen,FlagState fs)
- {
- if (fen instanceof FlagNode)
- {
- return fs.get(((FlagNode)fen).getFlag());
- }
- else
- {
- switch (((FlagOpNode)fen).getOp().getOp())
- {
- case Operation.LOGIC_AND:
- return ((isTaskTrigger(((FlagOpNode)fen).getLeft(),fs)) && (isTaskTrigger(((FlagOpNode)fen).getRight(),fs)));
- case Operation.LOGIC_OR:
- return ((isTaskTrigger(((FlagOpNode)fen).getLeft(),fs)) || (isTaskTrigger(((FlagOpNode)fen).getRight(),fs)));
- case Operation.LOGIC_NOT:
- return !(isTaskTrigger(((FlagOpNode)fen).getLeft(),fs));
- default:
- return false;
- }
- }
-
+
+ if (trigger_ctr==0) //Look at next task
+ continue;
+
+ if (trigger_ctr>1)
+ throw new Error("Illegal Operation: A single flagstate cannot satisfy more than one parameter of a task.");
+
+
+ Set newstates=taganalysis.getFlagStates(td);
+ for(Iterator fsit=newstates.iterator();fsit.hasNext();) {
+ FlagState fsnew=(FlagState) fsit.next();
+ fsnew.setAsSourceNode();
+ fsnew.addAllocatingTask(td);
+ ((Vector)cdtorootnodes.get(fsnew.getClassDescriptor())).add(fsnew);
+
+ if (! ((Hashtable<FlagState,FlagState>)flagstates.get(fsnew.getClassDescriptor())).containsKey(fsnew)) {
+ ((Hashtable<FlagState,FlagState>)flagstates.get(fsnew.getClassDescriptor())).put(fsnew, fsnew);
+ toprocess.add(fsnew);
+ }
}
-
- private boolean wasFlagStateProcessed(Hashtable Adj_List,FlagState fs)
- {
- Enumeration e=Adj_List.keys();
-
- while(e.hasMoreElements())
- {
- FlagState fsv = (FlagState)(e.nextElement());
-
- if (fsv.isEqual(fs))
- {
- return true;
+
+ Stack nodestack=new Stack();
+ HashSet discovered=new HashSet();
+ nodestack.push(fm);
+ discovered.add(fm);
+ //Iterating through the nodes
+
+ while(!nodestack.isEmpty()) {
+ FlatNode fn1 = (FlatNode) nodestack.pop();
+
+ if (fn1.kind()==FKind.FlatReturnNode) {
+ /* Self edge */
+ FEdge newedge=new FEdge(fs, taskname);
+ fs.addEdge(newedge);
+ continue;
+ } else if (fn1.kind()==FKind.FlatFlagActionNode) {
+ FlatFlagActionNode ffan=(FlatFlagActionNode)fn1;
+ if (ffan.getTaskType() == FlatFlagActionNode.PRE) {
+ if (ffan.getTempFlagPairs().hasNext()||ffan.getTempTagPairs().hasNext())
+ throw new Error("PRE FlagActions not supported");
+
+ } else if (ffan.getTaskType() == FlatFlagActionNode.TASKEXIT) {
+ 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);
}
- }
- return false;
+ //seen this node already
+ fs_taskexit=canonicalizeFlagState(sourcenodes,fs_taskexit);
+ FEdge newedge=new FEdge(fs_taskexit,taskname);
+ fs.addEdge(newedge);
+ }
+ continue;
+ }
+ }
+ /* Queue other nodes past this one */
+ for(int i=0;i<fn1.numNext();i++) {
+ FlatNode fnext=fn1.getNext(i);
+ if (!discovered.contains(fnext)) {
+ discovered.add(fnext);
+ nodestack.push(fnext);
+ }
+ }
}
+ }
+}
- private boolean existsInQueue(TriggerState ts)
- {
- for(Iterator it_queue=q_main.iterator();it_queue.hasNext();)
- {
- TriggerState ts_local=(TriggerState)it_queue.next();
- if (ts_local.equals(ts))
- {
- return true;
- }
+/** Determines whether the given flagstate satisfies a
+ * single parameter in the given task.
+ * @param fen FlagExpressionNode
+ * @see FlagExpressionNode
+ * @param fs FlagState
+ * @see FlagState
+ * @return <CODE>true</CODE> if fs satisfies the boolean expression
+ denoted by fen else <CODE>false</CODE>.
+ */
+
+
+private boolean isTaskTrigger_flag(FlagExpressionNode fen,FlagState fs) {
+ if (fen==null)
+ return true;
+ else if (fen instanceof FlagNode)
+ return fs.get(((FlagNode)fen).getFlag());
+ else
+ switch (((FlagOpNode)fen).getOp().getOp()) {
+ case Operation.LOGIC_AND:
+ return ((isTaskTrigger_flag(((FlagOpNode)fen).getLeft(),fs)) && (isTaskTrigger_flag(((FlagOpNode)fen).getRight(),fs)));
+ case Operation.LOGIC_OR:
+ return ((isTaskTrigger_flag(((FlagOpNode)fen).getLeft(),fs)) || (isTaskTrigger_flag(((FlagOpNode)fen).getRight(),fs)));
+ case Operation.LOGIC_NOT:
+ return !(isTaskTrigger_flag(((FlagOpNode)fen).getLeft(),fs));
+ default:
+ return false;
+ }
+}
+private boolean isTaskTrigger_tag(TagExpressionList tel, FlagState fs){
+
+ if (tel!=null){
+ for (int i=0;i<tel.numTags() ; i++){
+ switch (fs.getTagCount(tel.getType(i))){
+ case FlagState.ONETAG:
+ case FlagState.MULTITAGS:
+ break;
+ case FlagState.NOTAGS:
+ return false;
}
- return false;
-
}
-
- private boolean existsInFSQueue(Queue q,FlagState fs)
- {
- for (Iterator it_q=q.iterator();it_q.hasNext();)
- {
- if(((FlagState)it_q.next()).isEqual(fs))
- return true;
-
- }
- return false;
}
+ return true;
+}
- public void printAdjList(ClassDescriptor cd)
- {
- Enumeration e=((Hashtable)Adj_List.get(cd)).keys();
- //System.out.println(Adj_List.size());
-
- while(e.hasMoreElements())
- {
- FlagState fsv = (FlagState)(e.nextElement());
- // System.out.println("fsv val: "+Adj_List.get(fsv));
- System.out.println(fsv.toString((FlagDescriptor [])flags.get(cd)));
- }
+/*private int tagTypeCount(TagExpressionList tel, String tagtype){
+ int ctr=0;
+ for(int i=0;i<tel.numTags() ; i++){
+ if (tel.getType(i).equals(tagtype))
+ ctr++;
}
- public void createDOTfile(ClassDescriptor cd) throws java.io.IOException
- {
-
- File dotfile= new File("graph"+cd.getSymbol()+".dot");
-
- FileWriter dotwriter=new FileWriter(dotfile,true);
+ return ctr;
+} */
- dotwriter.write("digraph G{ \n");
+ private Vector<FlagState> evalTaskExitNode(FlatFlagActionNode ffan,ClassDescriptor cd,FlagState fs, TempDescriptor temp){
+ FlagState fstemp=fs;
+ Vector<FlagState> processed=new Vector<FlagState>();
- dotwriter.write("center=true;\norientation=landscape;\n");
-
-
- Enumeration e=((Hashtable)Adj_List.get(cd)).keys();
- while(e.hasMoreElements())
- {
- FlagState fsv = (FlagState)(e.nextElement());
- System.out.println(fsv.toString());
- Hashtable test=(Hashtable)Adj_List.get(cd);
- Vector edges=(Vector)test.get(fsv);
- for(int i=0;i < edges.size();i++)
- {
- dotwriter.write(fsv.toString((FlagDescriptor [])flags.get(cd))+" -> "+((Edge)edges.get(i)).getState().toString((FlagDescriptor [])flags.get(cd))+"[label=\""+((Edge)edges.get(i)).getName()+"\"];\n");
- }
-
- }
- dotwriter.write("}\n");
- dotwriter.flush();
- dotwriter.close();
+ //Process the flag changes
+
+ for(Iterator it_tfp=ffan.getTempFlagPairs();it_tfp.hasNext();) {
+ TempFlagPair tfp=(TempFlagPair)it_tfp.next();
+ if (temp==tfp.getTemp())
+ fstemp=fstemp.setFlag(tfp.getFlag(),ffan.getFlagChange(tfp));
}
+
+ //Process the tag changes
- private String getTaskName(TaskDescriptor td)
- {
- StringTokenizer st = new StringTokenizer(td.toString(),"(");
- return st.nextToken();
+ processed.add(fstemp);
+
+ //Process clears first
+ for(Iterator it_ttp=ffan.getTempTagPairs();it_ttp.hasNext();) {
+ TempTagPair ttp=(TempTagPair)it_ttp.next();
+
+ if (temp==ttp.getTemp()) {
+ Vector<FlagState> oldprocess=processed;
+ processed=new Vector<FlagState>();
+
+ for (Enumeration en=oldprocess.elements();en.hasMoreElements();){
+ FlagState fsworking=(FlagState)en.nextElement();
+ if (!ffan.getTagChange(ttp)){
+ processed.addAll(Arrays.asList(fsworking.clearTag(ttp.getTag())));
+ } else processed.add(fsworking);
+ }
+ }
}
- private boolean edgeexists(Hashtable Adj_List_local,FlagState v1, FlagState v2,String name)
- {
- Vector edges=(Vector)Adj_List_local.get(v1);
-
- if (edges == null)
- {
- System.out.println("no edges");
- }
- else
- {for(int i=0;i < edges.size();i++)
- {
- FlagState fs=((Edge)edges.get(i)).getState();
- if (fs.isEqual(v2) && (name.compareTo(((Edge)edges.get(i)).getName())==0))
- return true;
- }
- }
- return false;
+ //Process sets next
+ for(Iterator it_ttp=ffan.getTempTagPairs();it_ttp.hasNext();) {
+ TempTagPair ttp=(TempTagPair)it_ttp.next();
+
+ if (temp==ttp.getTemp()) {
+ Vector<FlagState> oldprocess=processed;
+ processed=new Vector<FlagState>();
+
+ for (Enumeration en=oldprocess.elements();en.hasMoreElements();){
+ FlagState fsworking=(FlagState)en.nextElement();
+ if (ffan.getTagChange(ttp)){
+ processed.addAll(Arrays.asList(fsworking.setTag(ttp.getTag())));
+ } else processed.add(fsworking);
+ }
+ }
}
- private void processExterns(boolean onlyExterns,ClassDescriptor cd) throws java.io.IOException
- {
- int noOfIterations;
- Hashtable Adj_List_temp;
- if (Adj_List.containsKey(cd))
- {
- Adj_List_temp=(Hashtable)Adj_List.get(cd);
- }
- else
- {
- Adj_List_temp=new Hashtable();
- Adj_List.put(cd,Adj_List_temp);
- }
-
-
- if (onlyExterns)
- {
- FlagDescriptor [] fd=(FlagDescriptor [])flags.get(cd);
- System.out.println("onlyExterns"+fd.length);
- noOfIterations=(int)Math.pow(2.0,fd.length);
- boolean BoolValTable[]=new boolean[fd.length];
-
- for(int i=0; i < fd.length ; i++)
- {
- System.out.println(fd[i].getSymbol());
- BoolValTable[i]=false;
- }
- Adj_List_temp.put(new FlagState(fd),new Vector());
-
- for(int k=1; k<noOfIterations; k++)
- {
- for(int j=0; j< fd.length ;j++)
- {
- if (k% (int)Math.pow(2.0,(double)j) == 0)
- BoolValTable[j]=(!BoolValTable[j]);
- }
-
- FlagState fstemp=new FlagState(fd);
- int i=0;
- for(Enumeration e=fstemp.getStateTable().keys(); e.hasMoreElements() && i < fd.length;i++)
- {
- fstemp.put((FlagDescriptor)e.nextElement(),new Boolean(BoolValTable[i]));
- }
- Adj_List_temp.put(fstemp,new Vector());
- }
-
- Enumeration e=Adj_List_temp.keys();
- while(e.hasMoreElements())
- {
- FlagState fstemp=(FlagState)e.nextElement();
- Enumeration en=Adj_List_temp.keys();
- while (en.hasMoreElements())
- {
- FlagState fs=(FlagState)en.nextElement();
- if(fstemp == fs)
- {
- continue;
- }
- else
- {
- ((Vector)Adj_List_temp.get(fstemp)).add(new Edge(fs,"Runtime"));
- }
- }
- }
- }
- // createDOTfile(cd);
-
-
- }
-
- private Queue createPossibleRuntimeStates(TriggerState ts) throws java.io.IOException
- {
- int noOfIterations, externs;
- Hashtable Adj_List_temp;
- boolean onlyExterns;
-
- System.out.println("Inside CreatePossible runtime states");
-
- ClassDescriptor cd = ts.getClassDescriptor();
- FlagState fs= ts.getState();
- if (Adj_List.containsKey(cd))
- {
- Adj_List_temp=(Hashtable)Adj_List.get(cd);
- }
- else
- {
- Adj_List_temp=new Hashtable();
- Adj_List.put(cd,Adj_List_temp);
- }
-
- externs=((Integer)extern_flags.get(cd)).intValue();
-
- FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
-
- if (fd.length == externs)
- onlyExterns=true;
- else
- onlyExterns=false;
-
- Queue q_ret;
-
- q_ret=new LinkedList();
-
- if (onlyExterns)
- {
- // FlagDescriptor [] fd=(FlagDescriptor [])flags.get(cd);
- // System.out.println("onlyExterns"+fd.length);
- noOfIterations=(int)Math.pow(2.0,fd.length);
- boolean BoolValTable[]=new boolean[fd.length];
-
-
-
-
- for(int i=0; i < fd.length ; i++)
- {
- System.out.println(fd[i].getSymbol());
- BoolValTable[i]=false;
- }
-
- if (! wasFlagStateProcessed(Adj_List_temp,fs))
- {
- TriggerState ts_local=new TriggerState(cd,fs);
- if (!existsInQueue(ts_local))
- {
- q_ret.offer(ts_local);
- }
- //q_ret.offer(new TriggerState(cd,fs));
- Adj_List_temp.put(fs,new Vector());
- }
-
- for(int k=1; k<noOfIterations; k++)
- {
- for(int j=0; j< fd.length ;j++)
- {
- if (k% (int)Math.pow(2.0,(double)j) == 0)
- BoolValTable[j]=(!BoolValTable[j]);
- }
-
- FlagState fstemp=new FlagState(fs.getStateTable());
- int i=0;
- for(Enumeration e=fstemp.getStateTable().keys(); e.hasMoreElements() && i < fd.length;i++)
- {
- fstemp.put((FlagDescriptor)e.nextElement(),new Boolean(BoolValTable[i]));
- }
-
- if (wasFlagStateProcessed(Adj_List_temp,fstemp))
- {
- continue;
- }
- else
- {
- TriggerState ts_local=new TriggerState(cd,fstemp);
- if (!existsInQueue(ts_local))
- {
- q_ret.offer(ts_local);
- }
-
-
- Adj_List_temp.put(fstemp,new Vector());
- }
-
- }
-
- Enumeration e=Adj_List_temp.keys();
- while(e.hasMoreElements())
- {
- FlagState fstemp=(FlagState)e.nextElement();
- Enumeration en=Adj_List_temp.keys();
- while (en.hasMoreElements())
- {
- FlagState fs_local=(FlagState)en.nextElement();
- if(fstemp == fs_local)
- {
- continue;
- }
- else
- {
- ((Vector)Adj_List_temp.get(fstemp)).add(new Edge(fs_local,"Runtime"));
- }
- }
- }
-
- return q_ret;
- }
- else
- {
- System.out.println("inside else part");
- noOfIterations=(int)Math.pow(2.0,externs);
- boolean BoolValTable[]=new boolean[externs];
- Hashtable Adj_List_local;
-
-
- Adj_List_local=new Hashtable();
-
- for(int i=0; i < externs ; i++)
- {
- System.out.println(fd[i].getSymbol());
- BoolValTable[i]=fs.get(fd[i]);
- }
-
- if (! wasFlagStateProcessed(Adj_List_temp,fs))
- {
- //q_ret.offer(new TriggerState(cd,fs));
- // Adj_List_local.put(fs, new Vector());
- //Adj_List_temp.put(fs,new Vector());
- }
- for(int k=1; k<noOfIterations; k++)
- {
- for(int j=0; j< fd.length ;j++)
- {
- if (k% (int)Math.pow(2.0,(double)j) == 0)
- BoolValTable[j]=(!BoolValTable[j]);
- }
-
- FlagState fstemp=new FlagState(fs.getStateTable());
- FlagDescriptor fdtemp[]=(FlagDescriptor [])flags.get(cd);
-
- for(int i=0; i < externs;i++)
- {
- fstemp.put(fdtemp[i],new Boolean(BoolValTable[i]));
- }
-
- q_ret.offer(new TriggerState(cd,fstemp));
-// ((Vector)(Adj_List_temp.get(fs))).add(new Edge(fstemp,"Runtime"));
- // Adj_List_local.put(fstemp, new Vector());
- //Adj_List_temp.put(fstemp,new Vector());
-
- }
- /* Enumeration e=Adj_List_local.keys();
- while(e.hasMoreElements())
- {
- FlagState fstemp=(FlagState)e.nextElement();
- Enumeration en=Adj_List_local.keys();
- while (en.hasMoreElements())
- {
- FlagState fs_local=(FlagState)en.nextElement();
- if(fstemp == fs_local)
- {
- continue;
- }
- else
- {
- ((Vector)Adj_List_local.get(fstemp)).add(new Edge(fs_local,"Runtime"));
- }
- }
-
- }
- Adj_List_temp.putAll(Adj_List_local);
- */
- return q_ret;
-
- }
-}
-
-
-
-
-private Queue createPossibleRuntimeStates(ClassDescriptor cd,FlagState fs) throws java.io.IOException
- {
- int noOfIterations, externs;
- Hashtable Adj_List_temp;
- boolean onlyExterns;
-
- System.out.println("Inside CreatePossible runtime states(flagstates)");
-
- //ClassDescriptor cd = ts.getClassDescriptor();
- //FlagState fs= ts.getState();
- if (Adj_List.containsKey(cd))
- {
- Adj_List_temp=(Hashtable)Adj_List.get(cd);
- }
- else
- {
- Adj_List_temp=new Hashtable();
- Adj_List.put(cd,Adj_List_temp);
- }
-
- externs=((Integer)extern_flags.get(cd)).intValue();
-
- FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
-
- if (fd.length == externs)
- onlyExterns=true;
- else
- onlyExterns=false;
-
- Queue q_ret;
-
- q_ret=new LinkedList();
-
- if (onlyExterns)
- {
- // FlagDescriptor [] fd=(FlagDescriptor [])flags.get(cd);
- // System.out.println("onlyExterns"+fd.length);
- noOfIterations=(int)Math.pow(2.0,fd.length);
- boolean BoolValTable[]=new boolean[fd.length];
-
-
-
-
- for(int i=0; i < fd.length ; i++)
- {
- System.out.println(fd[i].getSymbol());
- BoolValTable[i]=false;
- }
-
- /*if (! wasFlagStateProcessed(Adj_List_temp,fs))
- {
- FlagState fs_local=new FlagState(fs.getStateTable());
- if (!existsInQueue(ts_local))
- {
- q_ret.offer(ts_local);
- }
- //q_ret.offer(new TriggerState(cd,fs));
- Adj_List_temp.put(fs,new Vector());
- }
-
- for(int k=1; k<noOfIterations; k++)
- {
- for(int j=0; j< fd.length ;j++)
- {
- if (k% (int)Math.pow(2.0,(double)j) == 0)
- BoolValTable[j]=(!BoolValTable[j]);
- }
-
- FlagState fstemp=new FlagState(fs.getStateTable());
- int i=0;
- for(Enumeration e=fstemp.getStateTable().keys(); e.hasMoreElements() && i < fd.length;i++)
- {
- fstemp.put((FlagDescriptor)e.nextElement(),new Boolean(BoolValTable[i]));
- }
-
- if (wasFlagStateProcessed(Adj_List_temp,fstemp))
- {
- continue;
- }
- else
- {
- TriggerState ts_local=new TriggerState(cd,fstemp);
- if (!existsInQueue(ts_local))
- {
- q_ret.offer(ts_local);
- }
-
-
- Adj_List_temp.put(fstemp,new Vector());
- }
-
- }
-
- Enumeration e=Adj_List_temp.keys();
- while(e.hasMoreElements())
- {
- FlagState fstemp=(FlagState)e.nextElement();
- Enumeration en=Adj_List_temp.keys();
- while (en.hasMoreElements())
- {
- FlagState fs_local=(FlagState)en.nextElement();
- if(fstemp == fs_local)
- {
- continue;
- }
- else
- {
- ((Vector)Adj_List_temp.get(fstemp)).add(new Edge(fs_local,"Runtime"));
- }
- }
- }*/
-
- return q_ret;
- }
- else
- {
- System.out.println("inside else part(fs)");
- noOfIterations=(int)Math.pow(2.0,externs);
- boolean BoolValTable[]=new boolean[externs];
- Hashtable Adj_List_local;
-
-
- Adj_List_local=new Hashtable();
-
- for(int i=0; i < externs ; i++)
- {
- System.out.println(fd[i].getSymbol());
- BoolValTable[i]=fs.get(fd[i]);
- }
-
- if (! wasFlagStateProcessed(Adj_List_temp,fs))
- {
- //q_ret.offer(fs));
- // Adj_List_local.put(fs, new Vector());
- Adj_List_temp.put(fs,new Vector());
- }
- for(int k=1; k<noOfIterations; k++)
- {
- for(int j=0; j< fd.length ;j++)
- {
- if (k% (int)Math.pow(2.0,(double)j) == 0)
- BoolValTable[j]=(!BoolValTable[j]);
- }
-
- FlagState fstemp=new FlagState(fs.getStateTable());
- FlagDescriptor fdtemp[]=(FlagDescriptor [])flags.get(cd);
-
- for(int i=0; i < externs;i++)
- {
- fstemp.put(fdtemp[i],new Boolean(BoolValTable[i]));
- }
-
- q_ret.offer(fstemp);
- ((Vector)(Adj_List_temp.get(fs))).add(new Edge(fstemp,"Runtime"));
- //Adj_List_local.put(fstemp, new Vector());
- //Adj_List_temp.put(fstemp,new Vector());
-
- }
- /* Enumeration e=Adj_List_local.keys();
- while(e.hasMoreElements())
- {
- FlagState fstemp=(FlagState)e.nextElement();
- Enumeration en=Adj_List_local.keys();
- while (en.hasMoreElements())
- {
- FlagState fs_local=(FlagState)en.nextElement();
- if(fstemp == fs_local)
- {
- continue;
- }
- else
- {
- ((Vector)Adj_List_local.get(fstemp)).add(new Edge(fs_local,"Runtime"));
- }
- }
-
- }
- Adj_List_temp.putAll(Adj_List_local);
- */
- return q_ret;
-
- }
-}
-
-
-/*private Queue createPossibleRuntimeStates(ClassDescriptor cd) throws java.io.IOException
- {
- int noOfIterations, externs;
- Hashtable Adj_List_temp;
-
- externs=((Integer)extern_flags.get(cd)).intValue();
-
- FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
- if (Adj_List.containsKey(cd))
- {
- Adj_List_temp=(Hashtable)Adj_List.get(cd);
- }
- else
- {
- Adj_List_temp=new Hashtable();
- Adj_List.put(cd,Adj_List_temp);
- }
-
-
- Queue q_ret;
-
- q_ret=new LinkedList();
-
-
- // FlagDescriptor [] fd=(FlagDescriptor [])flags.get(cd);
- // System.out.println("onlyExterns"+fd.length);
- noOfIterations=(int)Math.pow(2.0,fd.length);
- boolean BoolValTable[]=new boolean[fd.length];
-
- for(int i=0; i < fd.length ; i++)
- {
- System.out.println(fd[i].getSymbol());
- BoolValTable[i]=false;
- }
-
- if (! wasFlagStateProcessed(Adj_List_temp,fs))
- {
- TriggerState ts_local=new TriggerState(cd,fs);
- if (!existsInQueue(ts_local))
- {
- q_ret.offer(ts_local);
- }
- Adj_List_temp.put(fs,new Vector());
- }
-
- for(int k=1; k<noOfIterations; k++)
- {
- for(int j=0; j< fd.length ;j++)
- {
- if (k% (int)Math.pow(2.0,(double)j) == 0)
- BoolValTable[j]=(!BoolValTable[j]);
- }
-
- FlagState fstemp=new FlagState(fs.getStateTable());
- int i=0;
- for(Enumeration e=fstemp.getStateTable().keys(); e.hasMoreElements() && i < fd.length;i++)
- {
- fstemp.put((FlagDescriptor)e.nextElement(),new Boolean(BoolValTable[i]));
- }
-
- if (wasFlagStateProcessed(Adj_List_temp,fstemp))
- {
- continue;
- }
- else
- {
- TriggerState ts_local=new TriggerState(cd,fstemp);
- if (!existsInQueue(ts_local))
- {
- q_ret.offer(ts_local);
- }
-
- Adj_List_temp.put(fstemp,new Vector());
- }
-
- }
-
- Enumeration e=Adj_List_temp.keys();
- while(e.hasMoreElements())
- {
- FlagState fstemp=(FlagState)e.nextElement();
- Enumeration en=Adj_List_temp.keys();
- while (en.hasMoreElements())
- {
- FlagState fs_local=(FlagState)en.nextElement();
- if(fstemp == fs_local)
- {
- continue;
- }
- else
- {
- ((Vector)Adj_List_temp.get(fstemp)).add(new Edge(fs_local,"Runtime"));
- }
- }
- }
-
- return q_ret;
-
- //createDOTfile(cd);
-
-
+ return processed;
+ }
+
+
+ private FlagState canonicalizeFlagState(Hashtable sourcenodes, FlagState fs){
+ if (sourcenodes.containsKey(fs))
+ return (FlagState)sourcenodes.get(fs);
+ else{
+ sourcenodes.put(fs,fs);
+ return fs;
}
-*/
-
-
-
- private void processTasksWithPost(ClassDescriptor cd, Hashtable pre)
- {
- //
+ }
+
+ /** Creates a DOT file using the flagstates for a given class
+ * @param cd ClassDescriptor of the class
+ * @throws java.io.IOException
+ * @see ClassDescriptor
+ */
+
+ public void createDOTfile(ClassDescriptor cd) throws java.io.IOException {
+ File dotfile_flagstates= new File("graph"+cd.getSymbol()+".dot");
+ FileOutputStream dotstream=new FileOutputStream(dotfile_flagstates,true);
+ FlagState.DOTVisitor.visit(dotstream,((Hashtable)flagstates.get(cd)).values());
+ }
+
+ /** Returns the flag states for the class descriptor. */
+ public Set getFlagStates(ClassDescriptor cd) {
+ if (flagstates.containsKey(cd))
+ return ((Hashtable)flagstates.get(cd)).keySet();
+ else
+ return null;
+ }
+
+
+ private void createPossibleRuntimeStates(FlagState fs) {
+ ClassDescriptor cd = fs.getClassDescriptor();
+ Hashtable<FlagState,FlagState> sourcenodes=(Hashtable<FlagState,FlagState>)flagstates.get(cd);
+ FlagDescriptor[] fd=(FlagDescriptor[])flags.get(cd);
+ int externs=((Integer)extern_flags.get(cd)).intValue();
+
+ if(externs==0)
+ return;
+
+ int noOfIterations=(1<<externs) - 1;
+ boolean BoolValTable[]=new boolean[externs];
+
+
+ for(int i=0; i < externs ; i++) {
+ BoolValTable[i]=fs.get(fd[i]);
+ }
+
+ for(int k=0; k<noOfIterations; k++) {
+ for(int j=0; j < externs ;j++) {
+ if ((k% (1<<j)) == 0)
+ BoolValTable[j]=(!BoolValTable[j]);
}
-
-/* public Vector getInitialStates(ClassDescriptor cd)
- {
-
+
+ FlagState fstemp=fs;
+
+ for(int i=0; i < externs;i++) {
+ fstemp=fstemp.setFlag(fd[i],BoolValTable[i]);
}
-*/
- private ClassDescriptor processFlatNew(FlatNode fn)
- {
- if (! (fn.getNext(0).kind() == 13))
- {
- return (((FlatNew)fn).getType().getClassDesc());
- }
- return null;
+ if (!sourcenodes.containsKey(fstemp))
+ toprocess.add(fstemp);
+ fstemp=canonicalizeFlagState(sourcenodes,fstemp);
+ fs.addEdge(new FEdge(fstemp,"Runtime"));
+ }
+ }
+
+ public Vector getRootNodes(ClassDescriptor cd){
+ return (Vector)cdtorootnodes.get(cd);
}
-}
+
+
+}
+