static void overrideDoEval()

in src/debugger/RDebugger.cpp [616:660]


static void overrideDoEval(bool enabled) {
  static int doEvalOffset = getFunTabOffset("eval");
  static FunTabFunction oldDoEval = getFunTabFunction(doEvalOffset);
  if (enabled) {
    setFunTabFunction(doEvalOffset, [](SEXP call, SEXP op, SEXP args, SEXP env) {
      SEXP expr = args == R_NilValue ? R_NilValue : CAR(args);
      if (TYPEOF(expr) != EXPRSXP) return oldDoEval(call, op, args, env);
      SourceFileManager::preprocessSrcrefs(expr);
      CPP_BEGIN
        ShieldSEXP srcrefs = getBlockSrcrefs(expr);
        if (srcrefs.length() > 0) {
          sourceFileManager.registerSrcfile(Rf_getAttrib(srcrefs[0], RI->srcfileAttr));
        }
      CPP_END_VOID
      SEXP srcrefs = getBlockSrcrefs(expr);
      if (srcrefs == R_NilValue) return oldDoEval(call, op, args, env);
      R_xlen_t length = Rf_xlength(expr);
      SEXP newExpr = Rf_allocVector(EXPRSXP, length);
      PROTECT(newExpr);
      for (R_xlen_t i = 0; i < length; ++i) {
        SEXP x = VECTOR_ELT(expr, i);
        SEXP srcref = getSrcref(srcrefs, i);
        if (srcref == R_NilValue) {
          SET_VECTOR_ELT(newExpr, i, x);
          continue;
        }
        x = Rf_lang2(RI->beginSymbol, x);
        SET_VECTOR_ELT(newExpr, i, x);
        SEXP newSrcrefs = Rf_allocVector(VECSXP, 2);
        PROTECT(newSrcrefs);
        Rf_setAttrib(x, RI->srcrefAttr, newSrcrefs);
        SET_VECTOR_ELT(newSrcrefs, 0, Rf_duplicate(srcref));
        SET_VECTOR_ELT(newSrcrefs, 1, srcref);
        UNPROTECT(1);
      }
      SEXP newArgs = Rf_cons(newExpr, CDR(args));
      PROTECT(newArgs);
      SEXP result = oldDoEval(call, op, newArgs, env);
      UNPROTECT(2);
      return result;
    });
  } else {
    setFunTabFunction(doEvalOffset, oldDoEval);
  }
}