@@ -290,6 +290,7 @@ attribute_hidden SEXP do_bodyCode(SEXP call, SEXP op, SEXP args, SEXP rho)
290290#define simple_as_environment (arg ) (IS_S4_OBJECT(arg) && (TYPEOF(arg) == OBJSXP) ? R_getS4DataSlot(arg, ENVSXP) : arg)
291291
292292
293+ // environment(fun)
293294attribute_hidden SEXP do_envir (SEXP call , SEXP op , SEXP args , SEXP rho )
294295{
295296 checkArity (op , args );
@@ -300,16 +301,15 @@ attribute_hidden SEXP do_envir(SEXP call, SEXP op, SEXP args, SEXP rho)
300301 else return getAttrib (CAR (args ), R_DotEnvSymbol );
301302}
302303
304+ // environment(fun) <- <env>
303305attribute_hidden SEXP do_envirgets (SEXP call , SEXP op , SEXP args , SEXP rho )
304306{
305- SEXP env , s = CAR (args );
306-
307307 checkArity (op , args );
308- check1arg (args , call , "x" );
309-
310- env = CADR (args );
308+ /* check1arg(args, call, "x"); as it had no effect: should be "fun" */
309+ SEXP s = CAR ( args ),
310+ env = CADR (args );
311311
312- if (TYPEOF (CAR ( args ) ) == CLOSXP
312+ if (TYPEOF (s ) == CLOSXP
313313 && (isEnvironment (env ) ||
314314 isEnvironment (env = simple_as_environment (env )) ||
315315 isNull (env ))) {
@@ -321,12 +321,17 @@ attribute_hidden SEXP do_envirgets(SEXP call, SEXP op, SEXP args, SEXP rho)
321321 s = duplicate (s );
322322 if (TYPEOF (BODY (s )) == BCODESXP )
323323 /* switch to interpreted version if compiled */
324- SET_BODY (s , R_ClosureExpr (CAR ( args ) ));
324+ SET_BODY (s , R_ClosureExpr (s ));
325325 SET_CLOENV (s , env );
326326 }
327327 else if (isNull (env ) || isEnvironment (env ) ||
328328 isEnvironment (env = simple_as_environment (env )))
329- setAttrib (s , R_DotEnvSymbol , env );
329+ {
330+ if (!isNull (env ) && isPrimitive (s )) // temporary, to become error()
331+ warning (_ ("setting environment(<primitive function>) is not possible and trying it is deprecated" ));
332+ else
333+ setAttrib (s , R_DotEnvSymbol , env );
334+ }
330335 else
331336 error (_ ("replacement object is not an environment" ));
332337 return s ;
0 commit comments