diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-06-20 06:41:57 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-06-20 06:41:57 -0700 |
commit | 2a9b3bca2622a54434cc16e7c70dce37b1c4d205 (patch) | |
tree | 526260b719b0fe007ee3f27421ca3c5d7c4222bd /eval.c | |
parent | d8e75887b3d2bc103bd66238d250a596eae83092 (diff) | |
download | txr-2a9b3bca2622a54434cc16e7c70dce37b1c4d205.tar.gz txr-2a9b3bca2622a54434cc16e7c70dce37b1c4d205.tar.bz2 txr-2a9b3bca2622a54434cc16e7c70dce37b1c4d205.zip |
Improve error reporting.
* eval.c (eval_error): Use last_form_evaled if form is null.
(apply): Substitute apply symbol if ctx_form is null.
(apply_intrinsic): Do not pass fake (apply) context form to
apply, just pass nil.
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 20 |
1 files changed, 12 insertions, 8 deletions
@@ -135,6 +135,10 @@ noreturn static val eval_error(val form, val fmt, ...) val stream = make_string_output_stream(); va_start (vl, fmt); + + if (!form) + form = last_form_evaled; + if (form) format(stream, lit("(~a) "), source_loc_str(form), nao); (void) vformat(stream, fmt, vl); @@ -512,11 +516,12 @@ val apply(val fun, val arglist, val ctx_form) { val arg[32], *p = arg; int variadic, fixparam, reqargs, nargs; + val ctx = if3(ctx_form, car(ctx_form), apply_s); if (fun && symbolp(fun)) { val binding = gethash(top_fb, fun); if (!binding) - eval_error(ctx_form, lit("~s: no such function ~s"), car(ctx_form), fun, nao); + eval_error(ctx_form, lit("~s: no such function ~s"), ctx, fun, nao); fun = cdr(binding); } @@ -535,7 +540,7 @@ val apply(val fun, val arglist, val ctx_form) if (!listp(arglist)) { val arglist_conv = tolist(arglist); type_assert (listp(arglist_conv), - (lit("~s: arglist ~s is not a list"), car(ctx_form), + (lit("~s: arglist ~s is not a list"), ctx, arglist, nao)); arglist = arglist_conv; } @@ -552,11 +557,11 @@ val apply(val fun, val arglist, val ctx_form) if (nargs < reqargs) eval_error(ctx_form, lit("~s: missing required arguments"), - car(ctx_form), nao); - + ctx, nao); + if (nargs > fixparam) eval_error(ctx_form, lit("~s: too many arguments"), - car(ctx_form), nao); + ctx, nao); for (; nargs < fixparam; nargs++) *p++ = colon_k; @@ -598,8 +603,7 @@ val apply(val fun, val arglist, val ctx_form) nargs = p - arg; if (nargs < reqargs) - eval_error(ctx_form, lit("~s: missing required arguments"), - car(ctx_form), nao); + eval_error(ctx_form, lit("~s: missing required arguments"), ctx, nao); for (; nargs < fixparam; nargs++) *p++ = colon_k; @@ -652,7 +656,7 @@ static val apply_frob_args(val args) val apply_intrinsic(val fun, val args) { - return apply(fun, apply_frob_args(args), cons(apply_s, nil)); + return apply(fun, apply_frob_args(args), nil); } static val call(val fun, val args) |