in src/Init.cpp [90:125]
static void initDoQuit() {
setFunTabFunction(getFunTabOffset("quit"), [](SEXP call, SEXP op, SEXP args, SEXP rho) -> SEXP {
int argsCount = Rf_length(args);
if (argsCount != 3) {
Rf_error("%d arguments passed to .Internal(quit) which requires 3", argsCount);
}
if (!Rf_isString(CAR(args)))
Rf_error("one of \"yes\", \"no\", \"ask\" or \"default\" expected.");
const char* saveStr = CHAR(STRING_ELT(CAR(args), 0)); /* ASCII */
bool save;
if (!strcmp(saveStr, "no")) {
save = false;
} else if (!strcmp(saveStr, "yes")) {
save = true;
} else if (!strcmp(saveStr, "default") || !strcmp(saveStr, "ask")) {
save = sessionManager.saveOnExit;
} else {
Rf_error("unrecognized value of 'save'");
}
int status = Rf_asInteger(CADR(args));
if (status == NA_INTEGER) {
Rf_warning("invalid 'status', 0 assumed");
status = 0;
}
int runLast = Rf_asLogical(CADDR(args));
if (runLast == NA_LOGICAL) {
Rf_warning("invalid 'runLast', FALSE assumed");
runLast = 0;
}
sessionManager.saveOnExit = save;
if (!runLast) quitRWrapper();
R_CleanUp(SA_NOSAVE, status, runLast);
exit(0);
});
}