package cute.concolic.symbolicstate;
import cute.concolic.Globals;
import cute.concolic.input.InputElement;
import cute.concolic.input.InputMap;
import cute.concolic.symbolicexecution.ComputationStack;
import java.util.Stack;
/**
* Created by IntelliJ IDEA.
* User: Koushik Sen (ksen@cs.uiuc.edu)
* Date: Jul 21, 2006
* Time: 8:24:16 PM
*/
public abstract class FunctionExpression extends Expression {
public static void insertAuxVariableandReturnExpression(Expression e, int type, ComputationStack cstack, InputMap input){
InputElement ie = new InputElement(e,null, type,-1);
cstack.setReturnExpression(new ArithmeticExpression(input.putAndGetArithExpression(ie)));
}
public static void handleFunction(String fname, Stack syms, Stack vals, ComputationStack cstack, InputMap input){
Expression e=null;
e = StringEqualsExpression.getExpression(fname,syms,vals);
if(e != null) {
insertAuxVariableandReturnExpression(e,Globals.BOOLEAN,cstack,input);
return;
}
e = StringLengthExpression.getExpression(fname,syms,vals);
if(e != null) {
insertAuxVariableandReturnExpression(e,Globals.INT,cstack,input);
return;
}
e = PrimitiveObjectExpression.getExpression(fname,syms,vals);
if(e!=null) {
Globals.globals.state.setStateConcrete(new Long(System.identityHashCode(vals.elementAt(0))),e);
return;
}
e = PrimitiveValueExpression.getExpression(fname,syms,vals);
if(e!=null) {
if(e instanceof PrimitiveValueExpression){
insertAuxVariableandReturnExpression(e,((PrimitiveValueExpression)e).getType(),cstack,input);
} else {
// PrintWriter out = new PrintWriter(System.out);
// e.printExpression(out);
// out.flush();
cstack.setReturnExpression(e);
}
return;
}
}
public void setValue(PointerExpression sym,Object value,InputMap input){
PointerExpression p = (PointerExpression)sym;
InputElement ie = input.getPointerElement(p.getP());
if(ie.val != null){
((InputElement)ie.val).val = value;
}
}
abstract public void solve(double v,InputMap input);
}