throws Exception
  public Expr []bindArguments(Env env, Expr fun, Expr []args)    throws Exception  {    if (_defaultExprs.length == args.length)      return args;    int length = _defaultExprs.length;    if (_defaultExprs.length < args.length) {      if (_hasRestArgs)        length = args.length;      else {        env.warning(L.l(          "function '{0}' has {1} required arguments, but {2} were provided",          _method.getName(),          _defaultExprs.length,          args.length));        return null;      }    } else if (_defaultExprs[args.length] == null) {      int required;      for (required = args.length;           required < _defaultExprs.length;           required++) {        if (_defaultExprs[required] != null)          break;      }      env.warning(L.l(        "function '{0}' has {1} required arguments, but only {2} were provided",        _method.getName(),        required,        args.length));      return null;    }    Expr []expandedArgs = new Expr[length];    System.arraycopy(args, 0, expandedArgs, 0, args.length);    if (args.length < expandedArgs.length) {      for (int i = args.length; i < expandedArgs.length; i++) {        Expr defaultExpr = _defaultExprs[i];        if (defaultExpr == null)          defaultExpr = NullLiteralExpr.NULL;        expandedArgs[i] = defaultExpr;      }    }    return expandedArgs;  }