//
// Copyright (C) 2006 United States Government as represented by the
// Administrator of the National Aeronautics and Space Administration
// (NASA). All Rights Reserved.
//
// This software is distributed under the NASA Open Source Agreement
// (NOSA), version 1.3. The NOSA has been approved by the Open Source
// Initiative. See the file NOSA-1.3-JPF at the top of the distribution
// directory tree for the complete NOSA document.
//
// THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY
// KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT
// LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO
// SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR
// A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT
// THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT
// DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE.
//
package gov.nasa.jpf.listener;
import gov.nasa.jpf.Config;
import gov.nasa.jpf.ListenerAdapter;
import gov.nasa.jpf.search.Search;
import gov.nasa.jpf.vm.ChoiceGenerator;
import gov.nasa.jpf.vm.Instruction;
import gov.nasa.jpf.vm.ThreadInfo;
import gov.nasa.jpf.vm.VM;
public class CGMonitor extends ListenerAdapter {
int depth;
boolean isFirstInsn = true;
boolean showInsn = false;
public CGMonitor (Config conf) {
showInsn = conf.getBoolean("cg.show_insn");
}
@Override
public void stateAdvanced (Search search) {
depth++;
}
@Override
public void stateBacktracked (Search search) {
depth--;
}
@Override
public void stateRestored (Search search) {
depth = search.getDepth();
}
void printPrefix(char c) {
for (int i=0; i<depth; i++) {
System.out.print(c);
}
}
@Override
public void choiceGeneratorAdvanced (VM vm, ChoiceGenerator<?> currentCG) {
ChoiceGenerator<?> cg = vm.getChoiceGenerator();
printPrefix('.');
System.out.print(cg.getNextChoice());
if (!showInsn) {
System.out.println();
}
isFirstInsn = true;
}
@Override
public void instructionExecuted (VM vm, ThreadInfo ti, Instruction nextInsn, Instruction executedInsn) {
if (showInsn && isFirstInsn) {
//printPrefix(' ');
System.out.print(" : [");
System.out.print(ti.getId());
System.out.print("] ");
System.out.print(executedInsn);
System.out.print(" (in ");
System.out.print(executedInsn.getMethodInfo().getFullName());
System.out.print(":");
System.out.print(executedInsn.getInstructionIndex());
System.out.println(')');
isFirstInsn = false;
}
}
}