print message with exceptions in a try clause

This commit is contained in:
Ben Burdette 2022-06-02 12:17:28 -06:00
parent 9151dbff88
commit bc0d41e9ba
3 changed files with 22 additions and 6 deletions

View file

@ -464,10 +464,11 @@ EvalState::EvalState(
, emptyBindings(0) , emptyBindings(0)
, store(store) , store(store)
, buildStore(buildStore ? buildStore : store) , buildStore(buildStore ? buildStore : store)
, debugRepl(0) , debugRepl(nullptr)
, debugStop(false) , debugStop(false)
, debugQuit(false) , debugQuit(false)
, ignoreTry(false) , ignoreTry(false)
, trylevel(0)
, regexCache(makeRegexCache()) , regexCache(makeRegexCache())
#if HAVE_BOEHMGC #if HAVE_BOEHMGC
, valueAllocCache(std::allocate_shared<void *>(traceable_allocator<void *>(), nullptr)) , valueAllocCache(std::allocate_shared<void *>(traceable_allocator<void *>(), nullptr))
@ -833,7 +834,14 @@ void EvalState::runDebugRepl(const Error * error, const Env & env, const Expr &
: nullptr; : nullptr;
if (error) if (error)
printError("%s\n\n" ANSI_BOLD "Starting REPL to allow you to inspect the current state of the evaluator.\n" ANSI_NORMAL, error->what()); {
printError("%s\n\n", error->what());
if (trylevel > 0 && error->info().level != lvlInfo)
printError("This exception occurred in a try clause. use " ANSI_GREEN "--ignore-try" ANSI_NORMAL " to skip these.\n");
printError(ANSI_BOLD "Starting REPL to allow you to inspect the current state of the evaluator.\n" ANSI_NORMAL, error->what());
}
auto se = getStaticEnv(expr); auto se = getStaticEnv(expr);
if (se) { if (se) {

View file

@ -131,6 +131,7 @@ public:
bool debugStop; bool debugStop;
bool debugQuit; bool debugQuit;
bool ignoreTry; bool ignoreTry;
int trylevel;
std::list<DebugTrace> debugTraces; std::list<DebugTrace> debugTraces;
std::map<const Expr*, const std::shared_ptr<const StaticEnv>> exprEnvs; std::map<const Expr*, const std::shared_ptr<const StaticEnv>> exprEnvs;
const std::shared_ptr<const StaticEnv> getStaticEnv(const Expr & expr) const const std::shared_ptr<const StaticEnv> getStaticEnv(const Expr & expr) const

View file

@ -853,12 +853,16 @@ static void prim_tryEval(EvalState & state, const PosIdx pos, Value * * args, Va
auto attrs = state.buildBindings(2); auto attrs = state.buildBindings(2);
void (* savedDebugRepl)(ref<EvalState> es, const ValMap & extraEnv) = nullptr; void (* savedDebugRepl)(ref<EvalState> es, const ValMap & extraEnv) = nullptr;
if (state.debugRepl && state.ignoreTry) if (state.debugRepl)
{
state.trylevel++;
if (state.ignoreTry)
{ {
// to prevent starting the repl from exceptions withing a tryEval, null it. // to prevent starting the repl from exceptions withing a tryEval, null it.
savedDebugRepl = state.debugRepl; savedDebugRepl = state.debugRepl;
state.debugRepl = nullptr; state.debugRepl = nullptr;
} }
}
try { try {
state.forceValue(*args[0], pos); state.forceValue(*args[0], pos);
@ -873,6 +877,9 @@ static void prim_tryEval(EvalState & state, const PosIdx pos, Value * * args, Va
if (savedDebugRepl) if (savedDebugRepl)
state.debugRepl = savedDebugRepl; state.debugRepl = savedDebugRepl;
if (state.debugRepl)
state.trylevel--;
v.mkAttrs(attrs); v.mkAttrs(attrs);
} }