@Override public Object visitFunction(Function fcn) { if (fcn.isSketchHarness() || fcn.getSpecification() != null || specFcns.contains(fcn.getName()) || !fcn.isStatic()) { return fcn; } else { this.parametersToInout = new TypedHashSet<String>(); this.inputParameters = new Vector<String>(); for (Parameter param : fcn.getParams()) { if (!param.isParameterOutput()) { this.inputParameters.add(param.getName()); } } super.visitFunction(fcn); if (parametersToInout.isEmpty()) { return fcn; } else { Vector<Parameter> newParams = new Vector<Parameter>(); for (Parameter param : fcn.getParams()) { if (parametersToInout.contains(param.getName())) { newParams.add(new Parameter(param, param.getType(), param.getName(), Parameter.REF)); } else { newParams.add(param); } } return fcn.creator().params(newParams).create(); } } }
public Object visitExprFunCall(ExprFunCall efc) { Function fun = nres.getFun(efc.getName()); List<Expression> newParams = new ArrayList<Expression>(fun.getParams().size()); Map<Expression, Integer> pset = new HashMap<Expression, Integer>(); Iterator<Expression> eit = efc.getParams().iterator(); for (Parameter p : fun.getParams()) { Expression actual = eit.next(); { ExprVar ev = getBaseVar(actual); if (ev != null && pset.containsKey(ev)) { pset.put(ev, pset.get(ev) + 1); } else { pset.put(ev, 1); } } } boolean hasChanged = false; eit = efc.getParams().iterator(); Map<String, Expression> repl = new HashMap<String, Expression>(); VarReplacer vr = new VarReplacer(repl); for (Parameter p : fun.getParams()) { Expression actual = eit.next(); repl.put(p.getName(), actual); if (p.isParameterOutput()) { ExprVar ev = getBaseVar(actual); if (ev == null) { newParams.add(actual); continue; } if (ev == FromHeap) { addTemp(p, actual, newParams, vr); hasChanged = true; continue; } int cnt = pset.get(ev); if (cnt > 1) { addTemp(p, actual, newParams, vr); hasChanged = true; } else { newParams.add(actual); } } else { newParams.add(actual); } } if (!hasChanged) addStatement(new StmtExpr(efc)); else addStatement(new StmtExpr(new ExprFunCall(efc, efc.getName(), newParams))); addStatements(after); after.clear(); return null; }