1 package Analysis.Disjoint;
8 public class PointerMethod {
9 public PointerMethod() {
10 nextmap=new Hashtable<FlatNode, Vector<FlatNode>>();
11 prevmap=new Hashtable<FlatNode, Vector<FlatNode>>();
14 Hashtable<FlatNode, Vector<FlatNode>> nextmap;
15 Hashtable<FlatNode, Vector<FlatNode>> prevmap;
17 public void analyzeMethod(FlatMethod fm) {
18 if (nextmap.containsKey(fm))
20 Hashtable<FlatNode, HashSet<FlatNode>> map=new Hashtable<FlatNode, HashSet<FlatNode>>();
21 HashSet<FlatNode> toprocess=new HashSet<FlatNode>();
23 while(!toprocess.isEmpty()) {
24 FlatNode fn=toprocess.iterator().next();
26 HashSet<FlatNode> myset=new HashSet<FlatNode>();
27 if (!analysisCares(fn)) {
28 for(int i=0; i<fn.numPrev(); i++) {
29 if (map.containsKey(fn.getPrev(i)))
30 myset.addAll(map.get(fn.getPrev(i)));
35 if (!map.containsKey(fn)||!map.get(fn).equals(myset)) {
37 for(int i=0; i<fn.numNext(); i++) {
38 toprocess.add(fn.getNext(i));
42 for(Iterator<FlatNode> it=map.keySet().iterator(); it.hasNext(); ) {
43 FlatNode fn=it.next();
44 if (analysisCares(fn)) {
45 HashSet<FlatNode> myset=new HashSet<FlatNode>();
46 for(int i=0; i<fn.numPrev(); i++) {
47 if (map.containsKey(fn.getPrev(i)))
48 myset.addAll(map.get(fn.getPrev(i)));
50 if (!prevmap.containsKey(fn))
51 prevmap.put(fn, new Vector());
52 for(Iterator<FlatNode> it2=myset.iterator(); it2.hasNext(); ) {
53 FlatNode fnprev=it2.next();
54 if (!nextmap.containsKey(fnprev))
55 nextmap.put(fnprev, new Vector());
56 nextmap.get(fnprev).add(fn);
57 prevmap.get(fn).add(fnprev);
63 public int numNext(FlatNode fn) {
64 Vector<FlatNode> vfn=nextmap.get(fn);
71 public FlatNode getNext(FlatNode fn, int i) {
72 return nextmap.get(fn).get(i);
75 public int numPrev(FlatNode fn) {
76 return prevmap.get(fn).size();
79 public FlatNode getPrev(FlatNode fn, int i) {
80 return prevmap.get(fn).get(i);
83 public boolean isBackEdge(FlatNode fn) {
84 return fn.kind() == FKind.FlatBackEdge;
87 public boolean analysisCares(FlatNode fn) {
89 case FKind.FlatMethod:
90 case FKind.FlatFieldNode:
91 case FKind.FlatSetFieldNode:
92 case FKind.FlatElementNode:
93 case FKind.FlatSetElementNode:
96 case FKind.FlatReturnNode:
97 case FKind.FlatBackEdge:
98 case FKind.FlatSESEEnterNode:
99 case FKind.FlatSESEExitNode:
100 case FKind.FlatGenReachNode:
101 case FKind.FlatGenDefReachNode:
105 case FKind.FlatCastNode:
106 FlatCastNode fcn=(FlatCastNode)fn;
107 TypeDescriptor td=fcn.getType();
110 case FKind.FlatOpNode:
111 FlatOpNode fon = (FlatOpNode) fn;
112 return fon.getOp().getOp()==Operation.ASSIGN&&fon.getLeft().getType().isPtr();