package cute.concolic.symbolicstate;
import cute.concolic.logging.Logger;
import cute.concolic.logging.Printable;
import cute.concolic.Information;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.Stack;
/**
* Author: Koushik Sen <ksen@cs.uiuc.edu>
*/
public class State implements Printable {
private HashMap gs;
private IdentityHashMap localStacks;
private Logger logger;
private Information information;
private HashMap concreteToSymbolic;
public State(Logger logger, Information information) {
this.logger = logger;
this.information = information;
gs = new HashMap();
localStacks = new IdentityHashMap();
concreteToSymbolic = new HashMap();
}
public void setState(long address, Expression e) {
Thread t = Thread.currentThread();
HashMap ls;
synchronized(localStacks){
Stack localStack = (Stack)localStacks.get(t);
if(localStack == null){
localStack = new Stack();
localStacks.put(t,localStack);
ls = new HashMap();
localStack.push(ls);
} else {
ls = (HashMap)localStack.peek();
}
if(e==null){
ls.remove(new Long(address));
gs.remove(new Long(address));
} else {
if(address>>32 == 0){
ls.put(new Long(address),e);
} else {
gs.put(new Long(address),e);
}
}
if((information.debugLevel&16)!=0) logger.info(16,null,this);
}
}
public void popLocals() {
Thread t = Thread.currentThread();
synchronized(localStacks){
Stack localStack = (Stack)localStacks.get(t);
if(localStack!=null){
localStack.pop();
if(localStack.isEmpty())
localStacks.remove(t);
}
if((information.debugLevel&16)!=0) logger.info(16,null,this);
}
}
public void pushLocals() {
Thread t = Thread.currentThread();
Stack localStack;
HashMap ls;
synchronized(localStacks){
localStack = (Stack)localStacks.get(t);
if(localStack == null){
localStack = new Stack();
localStacks.put(t,localStack);
}
ls = new HashMap();
localStack.push(ls);
if((information.debugLevel&16)!=0) logger.info(16,null,this);
}
}
public Expression getState(long address) {
Thread t = Thread.currentThread();
Stack localStack;
synchronized(localStacks){
localStack = (Stack)localStacks.get(t);
}
HashMap ls;
if(localStack == null){
return null;
}
if(localStack.isEmpty()){
return null;
}
ls = (HashMap)localStack.peek();
if(address>>32 == 0){
return (Expression)ls.get(new Long(address));
} else {
return (Expression)gs.get(new Long(address));
}
}
public Expression getState(long address,long oid) {
Expression e = getState(address);
if(e!=null) return e;
return getStateConcrete(oid);
}
public void print(PrintWriter out){
int i=0;
out.println("Global Symbolic State");
for (Iterator iterator = gs.keySet().iterator(); iterator.hasNext();) {
Long l = (Long) iterator.next();
Expression e = (Expression)gs.get(l);
out.print(l+" : ");
e.printExpression(out);
}
for (Iterator iterator2 = localStacks.keySet().iterator(); iterator2.hasNext();) {
Thread t = (Thread) iterator2.next();
Stack localStack = (Stack) localStacks.get(t);
out.println("Local Symbolic State of thread "+t);
for (Iterator iterator = localStack.iterator(); iterator.hasNext();) {
i++;
out.println("Local Stack "+i);
HashMap tmp = (HashMap) iterator.next();
for (Iterator iter2 = tmp.keySet().iterator(); iter2.hasNext();) {
Long l = (Long) iter2.next();
Expression e = (Expression)tmp.get(l);
out.print(l+" : ");
e.printExpression(out);
}
}
}
out.println("Object map ");
for (Iterator iterator = concreteToSymbolic.keySet().iterator(); iterator.hasNext();) {
Long aLong = (Long) iterator.next();
out.print(aLong+" :");
getStateConcrete(aLong).printExpression(out);
}
out.flush();
}
public void setStateConcrete(Long oid, Expression e) {
concreteToSymbolic.put(oid,e);
}
public Expression getStateConcrete(Long l){
return (Expression)concreteToSymbolic.get(l);
}
public Expression getStateConcrete(long l){
return getStateConcrete(new Long(l));
}
}