public Instruction execute(SystemState ss, KernelState ks, ThreadInfo ti) { if (!ti.isFirstStepInsn()) { InvocationCG cg = new InvocationCG("INVOKECG", invokes); ss.setNextChoiceGenerator(cg); return this; } else { InvocationCG cg = ss.getCurrentChoiceGenerator("INVOKECG", InvocationCG.class); assert (cg != null) : "no current InvocationCG"; Invocation call = cg.getNextChoice(); MethodInfo callee = call.getMethodInfo(); InstructionFactory insnFactory = MethodInfo.getInstructionFactory(); if (callee.isStatic()) { realInvoke = (InvokeInstruction) insnFactory.create(null, Constants.INVOKESTATIC); } else { realInvoke = (InvokeInstruction) insnFactory.create(null, Constants.INVOKENONVIRTUAL); } realInvoke.init(mi, offset, position); realInvoke.setInvokedMethod( callee.getClassInfo().getName(), callee.getName(), callee.getSignature()); pushArguments(ti, call.getArguments(), call.getAttrs()); return realInvoke; } }
/** @see gov.nasa.jpf.ListenerAdapter#instructionExecuted(gov.nasa.jpf.jvm.JVM) */ public void instructionExecuted(JVM vm) { Instruction instr = vm.getLastInstruction(); ThreadInfo ti = vm.getLastThreadInfo(); if (instr instanceof InvokeInstruction) { InvokeInstruction invInstr = ((InvokeInstruction) instr); String method = invInstr.toString(); // if(method.contains("Test")) // System.out.println(method); MethodInfo mi = ((InvokeInstruction) instr).getInvokedMethod(); if (this.traceDefFilter != null && this.traceDefFilter.accept(mi)) { // Callee ElementInfo calleeElement = ti.getThisElementInfo(); MethodInfo calleeMethod = invInstr.getInvokedMethod(); ClassInfo calleeClass = null; int calleeID = -1; if (calleeMethod.isStatic()) { // static method: method declared in class calleeClass = calleeMethod.getClassInfo(); // static methods do not have a instance calleeID = -1; } else { // non static method: method is maybe overridden. get the current class // instead of the class the method is declared in. calleeClass = calleeElement.getClassInfo(); // get the current instance calleeID = calleeElement.getThisReference(); } assert (calleeClass != null); // Caller ElementInfo callerElement = ti.getElementInfo(ti.getCallerStackFrame().getThis()); if (callerElement != null) { MethodInfo callerMethod = invInstr.getMethodInfo(); ClassInfo callerClass = null; int callerID = -1; if (callerMethod.isStatic()) { // see above callerClass = callerMethod.getClassInfo(); callerID = -1; } else { // see above callerClass = callerElement.getClassInfo(); callerID = callerElement.getThisReference(); } // Arguments Object[] argumentValues = invInstr.getArgumentValues(ti); Object[] arguments = new Object[argumentValues.length]; for (int i = 0; i < arguments.length; i++) { if (this.argumentValues) { if (argumentValues[i] instanceof ElementInfo) arguments[i] = ((ElementInfo) argumentValues[i]).getThisReference(); else arguments[i] = argumentValues[i]; } else arguments[i] = null; } MethodEntry methodEntry = new MethodEntry( callerID, callerMethod, callerClass, calleeID, calleeMethod, calleeClass, arguments, ti.getName()); this.currentStateNode.methods.add(methodEntry); if (this.timeStamps) methodEntry.time = new Date().getTime(); } } } }