Hashtable<FlatNode, Vector<FlatNode>> prevmap;
public void analyzeMethod(FlatMethod fm) {
+ if (nextmap.containsKey(fm))
+ return;
Hashtable<FlatNode, HashSet<FlatNode>> map=new Hashtable<FlatNode, HashSet<FlatNode>>();
HashSet<FlatNode> toprocess=new HashSet<FlatNode>();
toprocess.add(fm);
toprocess.remove(fn);
HashSet<FlatNode> myset=new HashSet<FlatNode>();
if (!analysisCares(fn)) {
- for(int i=0;i<fn.numPrev();i++) {
- myset.addAll(map.get(fn.getPrev(i)));
- }
+ for(int i=0; i<fn.numPrev(); i++) {
+ if (map.containsKey(fn.getPrev(i)))
+ myset.addAll(map.get(fn.getPrev(i)));
+ }
} else {
- myset.add(fn);
+ myset.add(fn);
}
if (!map.containsKey(fn)||!map.get(fn).equals(myset)) {
- map.put(fn, myset);
- for(int i=0;i<fn.numNext();i++) {
- toprocess.add(fn.getNext(i));
- }
+ map.put(fn, myset);
+ for(int i=0; i<fn.numNext(); i++) {
+ toprocess.add(fn.getNext(i));
+ }
}
}
- for(Iterator<FlatNode> it=map.keySet().iterator();it.hasNext();) {
+ for(Iterator<FlatNode> it=map.keySet().iterator(); it.hasNext(); ) {
FlatNode fn=it.next();
if (analysisCares(fn)) {
- HashSet<FlatNode> myset=new HashSet<FlatNode>();
- for(int i=0;i<fn.numPrev();i++) {
- myset.addAll(map.get(fn.getPrev(i)));
- }
- if (!prevmap.containsKey(fn))
- prevmap.put(fn, new Vector());
- for(Iterator<FlatNode> it2=myset.iterator();it2.hasNext();) {
- FlatNode fnprev=it2.next();
- if (!nextmap.containsKey(fnprev))
- nextmap.put(fnprev, new Vector());
- nextmap.get(fnprev).add(fn);
- prevmap.get(fn).add(fnprev);
- }
+ HashSet<FlatNode> myset=new HashSet<FlatNode>();
+ for(int i=0; i<fn.numPrev(); i++) {
+ if (map.containsKey(fn.getPrev(i)))
+ myset.addAll(map.get(fn.getPrev(i)));
+ }
+ if (!prevmap.containsKey(fn))
+ prevmap.put(fn, new Vector());
+ for(Iterator<FlatNode> it2=myset.iterator(); it2.hasNext(); ) {
+ FlatNode fnprev=it2.next();
+ if (!nextmap.containsKey(fnprev))
+ nextmap.put(fnprev, new Vector());
+ nextmap.get(fnprev).add(fn);
+ prevmap.get(fn).add(fnprev);
+ }
}
}
}
public int numNext(FlatNode fn) {
- return nextmap.get(fn).size();
+ Vector<FlatNode> vfn=nextmap.get(fn);
+ if (vfn==null)
+ return 0;
+ else
+ return vfn.size();
}
public FlatNode getNext(FlatNode fn, int i) {
return prevmap.get(fn).get(i);
}
+ public boolean isBackEdge(FlatNode fn) {
+ return fn.kind() == FKind.FlatBackEdge;
+ }
+
public boolean analysisCares(FlatNode fn) {
switch(fn.kind()) {
case FKind.FlatMethod:
case FKind.FlatNew:
case FKind.FlatCall:
case FKind.FlatReturnNode:
+ case FKind.FlatBackEdge:
+ case FKind.FlatSESEEnterNode:
+ case FKind.FlatSESEExitNode:
+ case FKind.FlatGenReachNode:
+ case FKind.FlatGenDefReachNode:
+ case FKind.FlatExit:
return true;
+
case FKind.FlatCastNode:
FlatCastNode fcn=(FlatCastNode)fn;
TypeDescriptor td=fcn.getType();
return td.isPtr();
+
case FKind.FlatOpNode:
FlatOpNode fon = (FlatOpNode) fn;
return fon.getOp().getOp()==Operation.ASSIGN&&fon.getLeft().getType().isPtr();
+
default:
return false;
}