1 package Analysis.CallGraph;
3 import IR.Flat.FlatMethod;
4 import IR.Flat.FlatNode;
5 import IR.Flat.FlatCall;
8 import IR.ClassDescriptor;
9 import IR.MethodDescriptor;
10 import IR.TaskDescriptor;
11 import IR.TypeDescriptor;
16 public class JavaCallGraph extends CallGraph {
18 public JavaCallGraph(State state, TypeUtil tu) {
20 mapVirtual2ImplementationSet = new Hashtable();
21 mapCaller2CalleeSet = new Hashtable();
22 mapCallee2CallerSet = new Hashtable();
28 //Work our way down from main
29 private void buildGraph() {
30 MethodDescriptor main=tu.getMain();
31 HashSet tovisit=new HashSet();
32 HashSet discovered=new HashSet();
35 while(!tovisit.isEmpty()) {
36 MethodDescriptor md=(MethodDescriptor)tovisit.iterator().next();
38 FlatMethod fm=state.getMethodFlat(main);
39 analyzeMethod(md, fm);
40 for(Iterator<FlatNode> fnit=fm.getNodeSet().iterator();fnit.hasNext();) {
41 FlatNode fn=fnit.next();
42 if (fn.kind()==FKind.FlatCall) {
43 FlatCall fcall=(FlatCall)fn;
44 Set callees=getMethods(fcall.getMethod(),fcall.getThis().getType());
45 for(Iterator mdit=callees.iterator();mdit.hasNext();) {
46 MethodDescriptor callee=(MethodDescriptor)mdit.next();
47 if (!discovered.contains(callee)) {
48 discovered.add(callee);