From 7bcd35fa7204a8bf1a043a2587f2e0f252764364 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sun, 15 Jan 2017 19:59:28 -0800 Subject: Dump deferred warnings in eval_intrinsic. * eval.c (eval_intrinsic): Dump deferred warnings after expansion, unless in the middle of a load. * parser.c (read_eval_ret_last): Bind *load-recursive* around all evaluations to t, then dump warnings if prior value of *load-recursive* is nil. Thus the repl's :read feature behaves like load. (repl_warning): We can now unconditionally defer deferrable warnings here now, whether or not in a load. --- eval.c | 4 +++- parser.c | 11 +++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/eval.c b/eval.c index 0a9ad60e..0aea1d2f 100644 --- a/eval.c +++ b/eval.c @@ -1263,7 +1263,9 @@ val eval_intrinsic(val form, val env) val lfx_save = last_form_expanded; val form_ex = (last_form_expanded = last_form_evaled = nil, expand(form, nil)); - val ret = eval(form_ex, default_bool_arg(env), form); + val loading = cdr(lookup_var(dyn_env, load_recursive_s)); + val ret = ((void) (loading || uw_dump_deferred_warnings(std_error)), + eval(form_ex, default_bool_arg(env), form)); last_form_expanded = lfx_save; last_form_evaled = lfe_save; return ret; diff --git a/parser.c b/parser.c index 756b6fae..53e20eb4 100644 --- a/parser.c +++ b/parser.c @@ -873,6 +873,9 @@ static val read_eval_ret_last(val env, val counter, val error_val = gensym(nil); val name = format(nil, lit("paste-~a"), counter, nao); val value = nil; + val loading = cdr(lookup_var(dyn_env, load_recursive_s)); + val saved_dyn_env = set_dyn_env(make_env(nil, nil, dyn_env)); + env_vbind(dyn_env, load_recursive_s, t); for (;; lineno = succ(lineno)) { val form = lisp_parse(in_stream, out_stream, error_val, name, lineno); @@ -890,6 +893,11 @@ static val read_eval_ret_last(val env, val counter, break; } + dyn_env = saved_dyn_env; + + if (!loading) + uw_dump_deferred_warnings(out_stream); + prinl(value, out_stream); return t; } @@ -910,9 +918,8 @@ static val get_home_path(void) static val repl_warning(val out_stream, val exc, struct args *rest) { val args = args_get_list(rest); - val loading = cdr(lookup_var(dyn_env, load_recursive_s)); - if (loading && cdr(args)) + if (cdr(args)) uw_defer_warning(args); else format(out_stream, lit("** warning: ~!~a\n"), car(args), nao); -- cgit v1.2.3