summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--unwind.c22
-rw-r--r--unwind.h2
2 files changed, 21 insertions, 3 deletions
diff --git a/unwind.c b/unwind.c
index 4f259e06..4d3b3902 100644
--- a/unwind.c
+++ b/unwind.c
@@ -59,7 +59,7 @@ static val sys_cont_free_s, sys_capture_cont_s;
static val frame_type, catch_frame_type, handle_frame_type;
-static val deferred_warnings;
+static val deferred_warnings, tentative_defs;
/* C99 inline instantiations. */
#if __STDC_VERSION__ >= 199901L
@@ -676,10 +676,23 @@ val type_mismatch(val fmt, ...)
val uw_defer_warning(val args)
{
- push(args, &deferred_warnings);
+ val tag = cdr(args);
+ if (!memqual(tag, tentative_defs))
+ push(args, &deferred_warnings);
return nil;
}
+val uw_register_tentative_def(val tag)
+{
+ push(tag, &tentative_defs);
+ return nil;
+}
+
+val uw_tentative_def_exists(val tag)
+{
+ return memqual(tag, tentative_defs);
+}
+
val uw_dump_deferred_warnings(val stream)
{
val wl = nreverse(zap(&deferred_warnings));
@@ -695,6 +708,7 @@ val uw_dump_deferred_warnings(val stream)
val uw_purge_deferred_warning(val tag)
{
deferred_warnings = remqual(tag, deferred_warnings, cdr_f);
+ tentative_defs = remqual(tag, tentative_defs, nil);
return nil;
}
@@ -998,7 +1012,7 @@ void uw_init(void)
void uw_late_init(void)
{
protect(&frame_type, &catch_frame_type, &handle_frame_type,
- &deferred_warnings, convert(val *, 0));
+ &deferred_warnings, &tentative_defs, convert(val *, 0));
types_s = intern(lit("types"), user_package);
jump_s = intern(lit("jump"), user_package);
sys_cont_s = intern(lit("cont"), system_package);
@@ -1024,6 +1038,8 @@ void uw_late_init(void)
reg_fun(error_s, func_n1v(uw_errorfv));
reg_fun(intern(lit("purge-deferred-warning"), user_package),
func_n1(uw_purge_deferred_warning));
+ reg_fun(intern(lit("register-tentative-def"), user_package), func_n1(uw_register_tentative_def));
+ reg_fun(intern(lit("tentative-def-exists"), user_package), func_n1(uw_tentative_def_exists));
reg_fun(intern(lit("register-exception-subtypes"), user_package),
func_n0v(register_exception_subtypes));
reg_fun(intern(lit("exception-subtype-p"), user_package),
diff --git a/unwind.h b/unwind.h
index 7131cbc7..08f595be 100644
--- a/unwind.h
+++ b/unwind.h
@@ -131,6 +131,8 @@ noreturn val uw_errorfv(val fmt, struct args *args);
val uw_defer_warning(val args);
val uw_dump_deferred_warnings(val stream);
val uw_purge_deferred_warning(val tag);
+val uw_register_tentative_def(val tag);
+val uw_tentative_def_exists(val tag);
val uw_register_subtype(val sub, val super);
val uw_exception_subtype_p(val sub, val sup);
void uw_continue(uw_frame_t *target);