static void executeCodeImpl()

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);
}