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