Initial import
[jpf-core.git] / src / main / gov / nasa / jpf / listener / CallMonitor.java
1 /*
2  * Copyright (C) 2014, United States Government, as represented by the
3  * Administrator of the National Aeronautics and Space Administration.
4  * All rights reserved.
5  *
6  * The Java Pathfinder core (jpf-core) platform is licensed under the
7  * Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  * 
10  *        http://www.apache.org/licenses/LICENSE-2.0. 
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and 
16  * limitations under the License.
17  */
18 package gov.nasa.jpf.listener;
19
20 import gov.nasa.jpf.ListenerAdapter;
21 import gov.nasa.jpf.jvm.bytecode.JVMInvokeInstruction;
22 import gov.nasa.jpf.vm.ClassInfo;
23 import gov.nasa.jpf.vm.Instruction;
24 import gov.nasa.jpf.vm.VM;
25 import gov.nasa.jpf.vm.MethodInfo;
26 import gov.nasa.jpf.vm.ThreadInfo;
27
28 /**
29  * this isn't yet a useful tool, but it shows how to track method calls with
30  * their corresponding argument values
31  */
32 public class CallMonitor extends ListenerAdapter {
33
34   @Override
35   public void instructionExecuted (VM vm, ThreadInfo ti, Instruction nextInsn, Instruction executedInsn) {
36     
37     if (executedInsn instanceof JVMInvokeInstruction) {
38       if (executedInsn.isCompleted(ti) && !ti.isInstructionSkipped()) {
39         JVMInvokeInstruction call = (JVMInvokeInstruction)executedInsn;
40         MethodInfo mi = call.getInvokedMethod();
41         Object[] args = call.getArgumentValues(ti);
42         ClassInfo ci = mi.getClassInfo();
43
44         StringBuilder sb = new StringBuilder();
45
46         sb.append(ti.getId());
47         sb.append(": ");
48
49         int d = ti.getStackDepth();
50         for (int i=0; i<d; i++){
51           sb.append(" ");
52         }
53
54         if (ci != null){
55           sb.append(ci.getName());
56           sb.append('.');
57         }
58         sb.append(mi.getName());
59         sb.append('(');
60
61         int n = args.length-1;
62         for (int i=0; i<=n; i++) {
63           if (args[i] != null) {
64             sb.append(args[i].toString());
65           } else {
66             sb.append("null");
67           }
68           if (i<n) {
69             sb.append(',');
70           }
71         }
72         sb.append(')');
73
74         System.out.println(sb);
75       }
76     }
77   }
78 }