package janala.logger;
import janala.config.Config;
import janala.interpreters.ConcolicInterpreter;
import janala.logger.inst.*;
import janala.utils.MyLogger;
public class DirectConcolicExecution extends AbstractLogger {
private Instruction inst, next;
java.util.logging.Logger tester =
MyLogger.getTestLogger(Config.mainClass + "." + Config.iteration);
private final ConcolicInterpreter intp;
public ConcolicInterpreter getIntp() {
return intp;
}
public DirectConcolicExecution() {
this(new ConcolicInterpreter(ClassNames.getInstance(), Config.instance), true);
}
//VisibleForTesting
public DirectConcolicExecution(ConcolicInterpreter interpreter, boolean needToEnd) {
intp = interpreter;
if (needToEnd) {
Runtime.getRuntime().addShutdownHook(new Finisher(this));
}
}
private static class Finisher extends Thread {
private final DirectConcolicExecution parent;
public Finisher(DirectConcolicExecution parent) {
this.parent = parent;
}
@Override
public void run() {
parent.finish();
}
}
public void finish() {
log(null);
intp.endExecution();
MyLogger.checkLog(tester);
}
@Override
protected void log(Instruction insn) {
if (inst == null) {
inst = insn;
} else {
next = insn;
intp.setNext(next);
inst.visit(intp);
inst = next;
}
}
}