summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2012-01-21 00:59:38 -0800
committerKaz Kylheku <kaz@kylheku.com>2012-01-21 00:59:38 -0800
commitb7bdc308cd6ce4dd4d3dd68c16eec792652f8c39 (patch)
tree07c7ebb1f183b60d2e838981fe2eaa6b307eebff /eval.c
parent3315a83172c4178176d1cf7634dfc69a8fd29edc (diff)
downloadtxr-b7bdc308cd6ce4dd4d3dd68c16eec792652f8c39.tar.gz
txr-b7bdc308cd6ce4dd4d3dd68c16eec792652f8c39.tar.bz2
txr-b7bdc308cd6ce4dd4d3dd68c16eec792652f8c39.zip
Improved debugging. Debug nesting depth counter maintained
and used for next/step/finish stepping. * Makefile (OBJS): debug.o moved to OBJS-y or OBJS-. (OBJS-y, OBJS-): New variables. $(PROG): Depends on OBJS-y also. clean: clean $(OBJS-y). depend: include $(OBJS-y) in dependency generation. * configure: Underscores and dashes are interchangeable in configure variables. (yaccname_given, yacc_given): Default value is y, not yes. (debug_support): New config variable. (CONFIG_DEBUG_SUPPORT): New config.h symbol. * debug.c (debug_depth): New global variable. (debug_block_s): New symbol variable. (next_depth): New static variable. (debug): Renamed some commands. Introduced separate next, step and finish. (debug_init): debug_block_s initialized. * debug.h (debug_depth, debug_block_s): Declared. (debug_enter, debug_leave, debug_return): New macros. (debug_check, debug_init): Conditionally defined based on if this is a debug build. * dep.mk: Regenerated. * eval.c (eval): Instrumented with debug_enter, debug_leave, debug_return. * match.c (match_line, v_fun, match_files): Likewise. * txr.c (txr_main): Bail if -d or --debug used in build that lacks debug support.
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/eval.c b/eval.c
index 0dbe952c..06a8d0f2 100644
--- a/eval.c
+++ b/eval.c
@@ -326,18 +326,20 @@ static val eval_intrinsic(val form, val env)
val eval(val form, val env, val ctx_form)
{
+ debug_enter;
+
type_check(env, ENV);
debug_check(consp(form) ? form : ctx_form, env, nil, nil, nil);
if (nullp(form)) {
- return nil;
+ debug_return (nil);
} else if (symbolp(form)) {
if (!bindable(form)) {
- return form;
+ debug_return (form);
} else {
val binding = lookup_var(env, form);
if (binding)
- return cdr(binding);
+ debug_return (cdr(binding));
eval_error(ctx_form, lit("unbound variable ~s"), form, nao);
abort();
}
@@ -345,15 +347,15 @@ val eval(val form, val env, val ctx_form)
val oper = car(form);
if (regexp(oper))
- return oper;
+ debug_return (oper);
{
val fbinding = lookup_fun(env, oper);
if (fbinding) {
- return apply(cdr(fbinding),
- eval_args(rest(form), env, form),
- form);
+ debug_return (apply(cdr(fbinding),
+ eval_args(rest(form), env, form),
+ form));
} else {
val entry = gethash(op_table, oper);
@@ -362,13 +364,15 @@ val eval(val form, val env, val ctx_form)
abort();
} else {
opfun_t fp = (opfun_t) cptr_get(entry);
- return fp(form, env);
+ debug_return (fp(form, env));
}
}
}
} else {
- return form;
+ debug_return (form);
}
+
+ debug_leave;
}
val bindable(val obj)