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 Hashtable<FlatNode, HashSet<FlatNode>> map=new Hashtable<FlatNode, HashSet<FlatNode>>();
19 HashSet<FlatNode> toprocess=new HashSet<FlatNode>();
21 while(!toprocess.isEmpty()) {
22 FlatNode fn=toprocess.iterator().next();
24 HashSet<FlatNode> myset=new HashSet<FlatNode>();
25 if (!analysisCares(fn)) {
26 for(int i=0;i<fn.numPrev();i++) {
27 myset.addAll(map.get(fn.getPrev(i)));
32 if (!map.containsKey(fn)||!map.get(fn).equals(myset)) {
34 for(int i=0;i<fn.numNext();i++) {
35 toprocess.add(fn.getNext(i));
39 for(Iterator<FlatNode> it=map.keySet().iterator();it.hasNext();) {
40 FlatNode fn=it.next();
41 if (analysisCares(fn)) {
42 HashSet<FlatNode> myset=new HashSet<FlatNode>();
43 for(int i=0;i<fn.numPrev();i++) {
44 myset.addAll(map.get(fn.getPrev(i)));
46 if (!prevmap.containsKey(fn))
47 prevmap.put(fn, new Vector());
48 for(Iterator<FlatNode> it2=myset.iterator();it2.hasNext();) {
49 FlatNode fnprev=it2.next();
50 if (!nextmap.containsKey(fnprev))
51 nextmap.put(fnprev, new Vector());
52 nextmap.get(fnprev).add(fn);
53 prevmap.get(fn).add(fnprev);
59 public int numNext(FlatNode fn) {
60 return nextmap.get(fn).size();
63 public FlatNode getNext(FlatNode fn, int i) {
64 return nextmap.get(fn).get(i);
67 public int numPrev(FlatNode fn) {
68 return prevmap.get(fn).size();
71 public FlatNode getPrev(FlatNode fn, int i) {
72 return prevmap.get(fn).get(i);
75 public boolean analysisCares(FlatNode fn) {
77 case FKind.FlatMethod:
78 case FKind.FlatFieldNode:
79 case FKind.FlatSetFieldNode:
80 case FKind.FlatElementNode:
81 case FKind.FlatSetElementNode:
84 case FKind.FlatReturnNode:
86 case FKind.FlatCastNode:
87 FlatCastNode fcn=(FlatCastNode)fn;
88 TypeDescriptor td=fcn.getType();
90 case FKind.FlatOpNode:
91 FlatOpNode fon = (FlatOpNode) fn;
92 return fon.getOp().getOp()==Operation.ASSIGN&&fon.getLeft().getType().isPtr();