throws Throwable
  private Value evalImpl(Env env, Expr []args, boolean isRef)    throws Throwable  {    HashMap<String,Var> map = new HashMap<String,Var>();    Value []values = new Value[args.length];    for (int i = 0; i < args.length; i++) {      Arg arg = null;      if (i < _args.length) {        arg = _args[i];      }      if (arg == null) {        values[i] = args[i].eval(env).copy();      }      else if (arg.isReference()) {        values[i] = args[i].evalRef(env);        map.put(arg.getName(), values[i].toRefVar());      }      else {        // php/0d04        values[i] = args[i].eval(env);        Var var = values[i].toVar();        map.put(arg.getName(), var);        values[i] = var.toValue();      }    }    for (int i = args.length; i < _args.length; i++) {      Arg arg = _args[i];      Expr defaultExpr = arg.getDefault();      if (defaultExpr == null)        return env.error("expected default expression");      else if (arg.isReference())        map.put(arg.getName(), defaultExpr.evalRef(env).toVar());      else {        map.put(arg.getName(), defaultExpr.eval(env).copy().toVar());      }    }    HashMap<String,Var> oldMap = env.pushEnv(map);    Value []oldArgs = env.setFunctionArgs(values); // php/0476    try {      Value value = _statement.execute(env);      if (value == null)        return NullValue.NULL;      else if (_isReturnsReference && isRef)        return value;      else        return value.copyReturn();    } finally {      env.restoreFunctionArgs(oldArgs);      env.popEnv(oldMap);    }  }