From 1072a8aa77b4d8ac5c40a710241f7bb1006653b8 Mon Sep 17 00:00:00 2001 From: dzaima Date: Sun, 10 Oct 2021 23:24:53 +0300 Subject: [PATCH] break less on recursive errors --- src/builtins/internal.c | 4 ++-- src/core/stuff.c | 7 +++++++ src/nfns.c | 4 ++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/builtins/internal.c b/src/builtins/internal.c index 296a6f81..2a9f920a 100644 --- a/src/builtins/internal.c +++ b/src/builtins/internal.c @@ -156,7 +156,7 @@ static bool u8_get(u8** cv, u8* cE, const char* x) { } static B variation_refs; -static void variation_root() { +static void variation_gcRoot() { mm_visit(variation_refs); mm_visit(listVariations_def); #define F(X) mm_visit(v_##X); @@ -264,7 +264,7 @@ B getInternalNS() { FOR_VARIATION(F) #undef F listVariations_def = m_str8l("if"); - gc_addFn(variation_root); + gc_addFn(variation_gcRoot); #define F(X) inc(bi_##X), B fn = bqn_exec(m_str32(U"{⟨ Type, Refc, Squeeze, IsPure, Info, ListVariations, Variation, ClearRefs, Unshare, DeepSqueeze⟩⇐𝕩}"), emptyCVec(), emptySVec()); B arg = m_caB(10,(B[]){F(itype)F(refc)F(squeeze)F(isPure)F(info)F(listVariations)F(variation)F(clearRefs)F(unshare)F(deepSqueeze)}); diff --git a/src/core/stuff.c b/src/core/stuff.c index f3a43b4f..9fd5e0d2 100644 --- a/src/core/stuff.c +++ b/src/core/stuff.c @@ -5,7 +5,14 @@ #include "../builtins.h" +bool inErr; NORETURN NOINLINE void err(char* s) { + if (inErr) { + printf("\nCBQN encountered fatal error during information printing of another fatal error. Exiting without printing more info.\n"); + exit(1); + __builtin_abort(); + } + inErr = true; puts(s); fflush(stdout); vm_pstLive(); fflush(stdout); print_vmStack(); fflush(stdout); diff --git a/src/nfns.c b/src/nfns.c index 3fa707e7..5e1c0149 100644 --- a/src/nfns.c +++ b/src/nfns.c @@ -42,7 +42,7 @@ DEF_FREE(nfnDesc) { err("nfnDesc shouldn't be freed!"); } void nfnDesc_visit(Value* x) { mm_visit(((NFnDesc*)x)->name); } void nfnDesc_print(B x) { printf("(native function description)"); } -void nfn_gcFn() { +void nfn_gcRoot() { mm_visit(nfn_list); } void nfn_init() { @@ -51,5 +51,5 @@ void nfn_init() { TIi(t_nfn,freeF) = nfn_freeF; TIi(t_nfnDesc,freeF) = nfnDesc_freeF; TIi(t_nfn,visit) = nfn_visit; TIi(t_nfnDesc,visit) = nfnDesc_visit; TIi(t_nfn,print) = nfn_print; TIi(t_nfnDesc,print) = nfnDesc_print; - gc_addFn(nfn_gcFn); + gc_addFn(nfn_gcRoot); }