1 package Analysis.Pointer;
5 import Analysis.Pointer.BasicBlock.BBlock;
6 import Analysis.Pointer.AllocFactory.AllocNode;
9 HashMap<FlatMethod, BasicBlock> blockMap;
10 HashMap<FlatNode, Graph> graphMap;
13 AllocFactory allocFactory;
14 LinkedList<Delta> toprocess;
16 public Pointer(State state, TypeUtil typeUtil) {
18 this.blockMap=new HashMap<FlatMethod, BasicBlock>();
19 this.graphMap=new HashMap<FlatNode, Graph>();
20 this.typeUtil=typeUtil;
21 this.allocFactory=new AllocFactory(state, typeUtil);
22 this.toprocess=new LinkedList<Delta>();
25 public BasicBlock getBBlock(FlatMethod fm) {
26 if (!blockMap.containsKey(fm))
27 blockMap.put(fm, BasicBlock.getBBlock(fm));
28 return blockMap.get(fm);
31 Delta buildInitialContext() {
32 MethodDescriptor md=typeUtil.getMain();
33 FlatMethod fm=state.getMethodFlat(md);
34 BasicBlock bb=getBBlock(fm);
35 BBlock start=bb.getStart();
36 Delta delta=new Delta(start, true);
37 delta.addHeapEdge(allocFactory.StringArray, new Edge(allocFactory.StringArray, null, allocFactory.Strings));
38 delta.addVarEdge(fm.getParameter(0), new Edge(fm.getParameter(0), allocFactory.StringArray));
43 toprocess.add(buildInitialContext());
45 while(!toprocess.isEmpty()) {
46 Delta delta=toprocess.remove();
47 BBlock bblock=delta.getBlock();
48 Vector<FlatNode> nodes=bblock.nodes();
49 FlatNode firstNode=nodes.get(0);
51 //Get graph for first node
52 if (!graphMap.containsKey(firstNode)) {
53 graphMap.put(firstNode, new Graph(null));
55 Graph graph=graphMap.get(firstNode);
57 //First entrance is special...
58 if (delta.getInit()) {
59 applyInit(delta, graph);
61 applyDelta(delta, graph);
65 for(int i=1; i<nodes.size();i++) {
66 FlatNode currNode=nodes.get(i);
67 if (!graphMap.containsKey(currNode)) {
68 graphMap.put(currNode, new Graph(graph, nodeGraph));
70 nodeGraph=graphMap.get(currNode);
72 if (delta.getInit()) {
73 applyInitDiff(delta, nodeGraph);
75 applyDeltaDiff(delta, nodeGraph);