Index: src/library/base/R/eval.R =================================================================== --- src/library/base/R/eval.R (revision 78619) +++ src/library/base/R/eval.R (working copy) @@ -23,7 +23,7 @@ function(expr, envir = parent.frame(), enclos = if(is.list(envir) || is.pairlist(envir)) parent.frame() else baseenv()) - .Internal(eval(expr, envir, enclos)) + .Internal(eval(expr, envir, enclos, parent.frame(2L))) eval.parent <- function(expr, n = 1) { p <- parent.frame(n + 1) @@ -33,7 +33,7 @@ evalq <- function (expr, envir = parent.frame(), enclos = if (is.list(envir) || is.pairlist(envir)) parent.frame() else baseenv()) - .Internal(eval(substitute(expr), envir, enclos)) + .Internal(eval(substitute(expr), envir, enclos, parent.frame(2L))) new.env <- function (hash = TRUE, parent = parent.frame(), size = 29L) .Internal(new.env(hash, parent, size)) Index: src/library/base/baseloader.R =================================================================== --- src/library/base/baseloader.R (revision 78619) +++ src/library/base/baseloader.R (working copy) @@ -97,7 +97,7 @@ ..lazyLoad(basedb, baseenv()) -}), .Internal(new.env(FALSE, baseenv(), 29L)), baseenv())) +}), .Internal(new.env(FALSE, baseenv(), 29L)), baseenv(), baseenv())) ## keep in sync with R/zzz.R as.numeric <- as.double Index: src/main/eval.c =================================================================== --- src/main/eval.c (revision 78619) +++ src/main/eval.c (working copy) @@ -3267,7 +3267,7 @@ SEXP attribute_hidden do_eval(SEXP call, SEXP op, SEXP args, SEXP rho) { - SEXP encl, x; + SEXP encl, x, caller; volatile SEXP expr, env, tmp; int frame; @@ -3277,6 +3277,7 @@ expr = CAR(args); env = CADR(args); encl = CADDR(args); + caller = CADDDR(args); SEXPTYPE tEncl = TYPEOF(encl); if (isNull(encl)) { /* This is supposed to be defunct, but has been kept here @@ -3330,7 +3331,7 @@ if (TYPEOF(expr) == LANGSXP || TYPEOF(expr) == SYMSXP || isByteCode(expr)) { PROTECT(expr); begincontext(&cntxt, CTXT_RETURN, R_GlobalContext->call, - env, rho, args, op); + env, caller, args, op); if (!SETJMP(cntxt.cjmpbuf)) expr = eval(expr, env); else { @@ -3350,7 +3351,7 @@ PROTECT(expr); tmp = R_NilValue; begincontext(&cntxt, CTXT_RETURN, R_GlobalContext->call, - env, rho, args, op); + env, caller, args, op); if (!SETJMP(cntxt.cjmpbuf)) { int n = LENGTH(expr); for(int i = 0 ; i < n ; i++) { Index: src/main/names.c =================================================================== --- src/main/names.c (revision 78619) +++ src/main/names.c (working copy) @@ -703,7 +703,7 @@ {"dyn.unload", do_dynunload, 0, 111, 1, {PP_FUNCALL, PREC_FN, 0}}, {"ls", do_ls, 1, 11, 3, {PP_FUNCALL, PREC_FN, 0}}, {"typeof", do_typeof, 1, 11, 1, {PP_FUNCALL, PREC_FN, 0}}, -{"eval", do_eval, 0, 211, 3, {PP_FUNCALL, PREC_FN, 0}}, +{"eval", do_eval, 0, 211, 4, {PP_FUNCALL, PREC_FN, 0}}, {"returnValue", do_returnValue,0, 11, 1, {PP_FUNCALL, PREC_FN, 0}}, {"sys.parent", do_sys, 1, 11, -1, {PP_FUNCALL, PREC_FN, 0}}, {"sys.call", do_sys, 2, 11, -1, {PP_FUNCALL, PREC_FN, 0}},