in src/ExecuteCode.cpp [262:327]
static void executeCodeImpl(SEXP _exprs, SEXP _env, bool withEcho, bool isDebug,
bool withExceptionHandler, bool setLastValue, bool callToplevelHandlers) {
ShieldSEXP exprs = _exprs;
ShieldSEXP env = _env;
if (exprs.type() != EXPRSXP || env.type() != ENVSXP) {
return;
}
int length = exprs.length();
ShieldSEXP srcrefs = getBlockSrcrefs(exprs);
ScopedAssign<RContext*> with1(rDebugger.bottomContext, nullptr);
ScopedAssign<SEXP> with2(rDebugger.bottomContextRealEnv, env);
ScopedAssign<std::string> with(currentExpr, "");
auto func = [&] {
SourceFileManager::preprocessSrcrefs(exprs);
RContext *currentCallContext = getCurrentCallContext();
rDebugger.bottomContext = currentCallContext;
if (isDebug) {
RI->onExit.invokeUnsafeInEnv(getEnvironment(currentCallContext), RI->jetbrainsDebuggerDisable.lang());
}
for (int i = 0; i < length; ++i) {
SEXP expr = exprs[i];
currentExpr = stringEltUTF8(RI->deparse.invokeUnsafeInEnv(R_BaseEnv, RI->quote.lang(expr)), 0);
PROTECT(R_Srcref = getSrcref(srcrefs, i));
SEXP value;
bool visible = false;
if (isDebug) {
rDebugger.enable();
value = rDebugger.doStep(expr, env, R_Srcref);
visible = *ptr_R_Visible;
rDebugger.disable();
} else {
value = Rf_eval(expr, env);
visible = *ptr_R_Visible;
}
PROTECT(value);
visible = visible && withEcho;
if (visible) {
SEXP newEnv, quoted;
PROTECT(newEnv = RI->newEnv.invokeUnsafeInEnv(env, named("parent", env)));
Rf_defineVar(RI->xSymbol, value, newEnv);
SEXP printExpr = Rf_isFunction(value) && IS_S4_OBJECT(value) ? RI->basePrintDefaultXExpr : RI->basePrintXExpr;
if (isDebug) rDebugger.enable();
Rf_eval(printExpr, newEnv);
if (isDebug) rDebugger.disable();
UNPROTECT(1);
}
if (setLastValue) {
Rf_defineVar(R_LastvalueSymbol, value, R_GlobalEnv);
}
if (callToplevelHandlers) {
RI->Rf_callToplevelHandlersWrapper(exprs[i], value, TRUE, visible ? TRUE : FALSE);
}
UNPROTECT(2);
R_Srcref = R_NilValue;
}
};
PrSEXP call = getSafeExecCall(func);
// This is called like that in order to pass "mimicsAutoPrint" check in print.data.table
call = Rf_lang2(Rf_install("knit_print.default"), call);
ShieldSEXP newEnv = RI->newEnv(named("parent", R_BaseEnv));
newEnv.assign("knit_print.default", RI->identity);
if (withExceptionHandler) {
call = RI->withReplExceptionHandler.lang(call);
}
safeEval(call, newEnv, true);
}