diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-02-10 15:32:17 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-02-10 15:32:17 -0800 |
commit | 491d594929405dd79e020f68138a10dc9ac10ae7 (patch) | |
tree | 616d9d8116e7212e2b016bf0977b2872824cc674 /eval.c | |
parent | 39655edfb062034a76c0b880bf810d14d9047baa (diff) | |
download | txr-491d594929405dd79e020f68138a10dc9ac10ae7.tar.gz txr-491d594929405dd79e020f68138a10dc9ac10ae7.tar.bz2 txr-491d594929405dd79e020f68138a10dc9ac10ae7.zip |
Use non-hacky representation for deferrable warnings.
Deferrable warnings now get their own subtype, defr-warning.
The tag is a regular argument: no funny dotted argument list.
* eval.c (eval_defr_warn): Throw new style deferrable warning.
(me_op, no_warn_expand): Catch defr-warning rather than
warning. Use uw_muffle_warning to suppress it.
(gather_free_refs): Parse new representation of deferrable
warning.
(expand_with_free_refs): Catch defr-warning rather than
warning.
* lib.c (defr_warning_s): New symbol variable defined.
(obj_init): Initialize defr_warning_s.
* lib.h (defr_warning_s): Declared.
* share/txr/stdlib/error.tl (compile-defr-warning): Throw
new-style deferrable warning.
* unwind.c (uw_muffle_deferrable_warning): Function removed.
(uw_throw): Bugfix: handle warnings by checking by subtype
rather than exactly for the warning type. Distinguish
deferrable warnings by subtype rather than argument list
shape.
(uw_defer_warning): Take the new style args and reconstruct
the (msg . tag) representation for a deferred warning, so
the other functions don't have to change.
(uw_late_init): Register defr-warning as exception subtype
of warning.
* unwind.h (uw_muffle_deferrable_warning): Decl removed.
* txr.1: Adjusted all documentation touching on the subject
of the representation of deferrable warnings.
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 23 |
1 files changed, 13 insertions, 10 deletions
@@ -278,7 +278,8 @@ static val eval_defr_warn(val ctx, val tag, val fmt, ...) (void) vformat(stream, fmt, vl); - uw_throw(warning_s, cons(get_string_from_stream(stream), tag)); + uw_throw(defr_warning_s, + cons(get_string_from_stream(stream), cons(tag, nil))); } uw_catch(exsym, exvals) { (void) exsym; (void) exvals; } @@ -3439,8 +3440,8 @@ static val me_op(val form, val menv) cons_bind (sym, body, form); uw_frame_t uw_handler; val new_menv = make_var_shadowing_env(menv, cons(rest_s, nil)); - val body_ex = (uw_push_handler(&uw_handler, cons(warning_s, nil), - func_n1v(uw_muffle_deferrable_warning)), + val body_ex = (uw_push_handler(&uw_handler, cons(defr_warning_s, nil), + func_n1v(uw_muffle_warning)), if3(sym == op_s, expand_forms_lisp1(body, new_menv), expand(body, new_menv))); @@ -4315,8 +4316,8 @@ static val no_warn_expand(val form, val menv) { val ret; uw_frame_t uw_handler; - uw_push_handler(&uw_handler, cons(warning_s, nil), - func_n1v(uw_muffle_deferrable_warning)); + uw_push_handler(&uw_handler, cons(defr_warning_s, nil), + func_n1v(uw_muffle_warning)); ret = expand(form, menv); uw_pop_frame(&uw_handler); return ret; @@ -4326,15 +4327,17 @@ static val gather_free_refs(val info_cons, val exc, struct args *args) { (void) exc; + args_normalize(args, 2); + if (args_count(args) == 2) { - val sym = args_get_rest(args, 2); val tag = args_at(args, 1); + cons_bind (kind, sym, tag); - if (tag == var_s) { + if (kind == var_s) { loc al = car_l(info_cons); if (!memq(sym, deref(al))) mpush(sym, al); - } else if (tag == fun_s) { + } else if (kind == fun_s) { loc dl = cdr_l(info_cons); if (!memq(sym, deref(dl))) mpush(sym, dl); @@ -4360,11 +4363,11 @@ static val expand_with_free_refs(val form, val menv_in, val upto_menv_in) uw_frame_t uw_handler; val info_cons_free = cons(nil, nil); val info_cons_bound = cons(nil, nil); - uw_push_handler(&uw_handler, cons(warning_s, nil), + uw_push_handler(&uw_handler, cons(defr_warning_s, nil), func_f1v(info_cons_free, gather_free_refs)); ret = expand(form, menv); uw_pop_frame(&uw_handler); - uw_push_handler(&uw_handler, cons(warning_s, nil), + uw_push_handler(&uw_handler, cons(defr_warning_s, nil), func_f1v(info_cons_bound, gather_free_refs_nw)); (void) expand(ret, squash_menv_deleting_range(menv, upto_menv)); |