package janala.interpreters; import static janala.interpreters.ObjectValue.ADDRESS_UNKNOWN; import janala.config.Config; import janala.solvers.History; public final class StaticInvocation { private final Config config; public StaticInvocation(Config config) { this.config = config; } private boolean knownMethod = false; public boolean getKnownMethod() { return knownMethod; } public Value invokeMethod(int iid, String owner, String name, Value[] args, History history) { knownMethod = true; if (owner.equals("java/lang/Integer") && name.equals("valueOf")) { if (args[0] instanceof IntValue) { IntValue intValue = (IntValue) args[0]; return new IntegerObjectValue(intValue, ADDRESS_UNKNOWN); } } else if (owner.equals("java/lang/Long") && name.equals("valueOf")) { if (args[0] instanceof LongValue) { LongValue longValue = (LongValue) args[0]; return new LongObjectValue(longValue, ADDRESS_UNKNOWN); } } else if (owner.equals("java/sql/Date") && name.equals("valueOf")) { SqlDateObjectValue ret = new SqlDateObjectValue(); if (args[0] instanceof StringValue) { ret.longValue = new LongValue((java.sql.Date.valueOf(((StringValue) args[0]).getConcrete()).getTime())); return ret; } } else if (owner.equals("java/sql/Time") && name.equals("valueOf")) { SqlDateObjectValue ret = new SqlDateObjectValue(); if (args[0] instanceof StringValue) { ret.longValue = new LongValue((java.sql.Time.valueOf(((StringValue) args[0]).getConcrete()).getTime())); return ret; } } else if (owner.equals("java/sql/Timestamp") && name.equals("valueOf")) { SqlDateObjectValue ret = new SqlDateObjectValue(); if (args[0] instanceof StringValue) { ret.longValue = new LongValue( (java.sql.Timestamp.valueOf(((StringValue) args[0]).getConcrete()).getTime())); return ret; } } else if (owner.equals("janala/Main") && name.equals("assume") && args.length == 1) { if (((IntValue) args[0]).concrete != 0) { history.setLastBranchDone(); } return PlaceHolder.instance; } else if (owner.equals("janala/Main") && name.equals("forceTruth") && args.length == 1) { history.setLastForceTruth(); return PlaceHolder.instance; } else if (owner.equals("janala/Main") && name.equals("MakeSymbolic") && args.length == 1) { int symbol = args[0].MAKE_SYMBOLIC(history); history.addInput(symbol, args[0]); return PlaceHolder.instance; } else if (owner.equals("janala/Main") && name.equals("beginScope") && (args == null || args.length == 0)) { history.addInput(config.scopeBeginSymbol, null); history.beginScope(iid); return PlaceHolder.instance; } else if (owner.equals("janala/Main") && name.equals("endScope") && (args == null || args.length == 0)) { history.addInput(config.scopeEndSymbol, null); history.endScope(iid); return PlaceHolder.instance; } else if (owner.equals("janala/Main") && name.equals("abstractEqualsConcrete") && args.length == 1) { history.abstractData(((IntValue) args[0]).concrete != 0); return PlaceHolder.instance; } else if (owner.equals("janala/Main") && name.equals("assumeOrBegin") && args.length == 1) { return history.assumeOrBegin((IntValue) args[0]); } else if (owner.equals("janala/Main") && name.equals("assumeOr") && args.length == 2) { return history.assumeOr((IntValue) args[0], (SymbolicOrValue) args[1]); } else if (owner.equals("janala/Main") && name.equals("assumeOrEnd") && args.length == 1) { return history.assumeOrEnd(iid, (SymbolicOrValue) args[0]); } else if (owner.equals("janala/Main") && name.equals("ignore") && args.length == 0) { return history.ignore(); } knownMethod = false; return PlaceHolder.instance; } }