summaryrefslogtreecommitdiff
path: root/libguile/backtrace.c
diff options
context:
space:
mode:
authorMikael Djurfeldt <djurfeldt@nada.kth.se>1997-02-10 01:01:54 +0000
committerMikael Djurfeldt <djurfeldt@nada.kth.se>1997-02-10 01:01:54 +0000
commit5aab5d961cbe871a28e733fa21a3e7558c34f078 (patch)
tree4a2f1e96ba490bddf226ceeafb6bbd08354330bd /libguile/backtrace.c
parentb6b72ebaaaecb3a2ea54dd0c6bbfbc7f8e230f27 (diff)
downloadguile-5aab5d961cbe871a28e733fa21a3e7558c34f078.tar.gz
* symbols.c (scm_sysintern0): New function. Contains the core of
old scm_sysintern but doesn't take a second value argument. (scm_sysintern): Now uses scm_sysintern0. (scm_sysintern_no_module_lookup): Renamed to scm_sysintern0_no_module_lookup and doesn't take a second value argument any longer. * symbols.h (scm_sysintern0: Added declaration. * options.c (scm_init_opts): Use scm_sysintern0 instead of scm_sysintern when interning option keys. Otherwise we risk destroying the values of already interned variables. * symbols.c (scm_sym2vcell): Bugfix: Treat definedp as scheme-level boolean (use SCM_NFALSEP). * backtrace.c (scm_init_backtrace): Make Scheme-level variable `the-last-stack'. (scm_backtrace): New function. (C version of old function from boot-9.scm) Motivation: Make it possible to display backtraces without depending on boot-9.scm. (I'm uncertain if this motivation is good enough...) * root.h (scm_root_state): Add member the_last_stack_var. (scm_the_stack_var): Defined to scm_root->the_last_stack_var. * root.c (mark_root): Mark scm_the_last_stack_var. * init.c (scm_start_stack): Initialize scm_the_last_stack_var to SCM_BOOL_F.
Diffstat (limited to 'libguile/backtrace.c')
-rw-r--r--libguile/backtrace.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/libguile/backtrace.c b/libguile/backtrace.c
index 365b6ca58..aec7c1622 100644
--- a/libguile/backtrace.c
+++ b/libguile/backtrace.c
@@ -427,10 +427,45 @@ scm_display_backtrace (stack, port, first, depth)
return SCM_UNSPECIFIED;
}
+SCM_GLOBAL (scm_has_shown_backtrace_hint_p_var, "has-shown-backtrace-hint?");
+
+SCM_PROC(s_backtrace, "backtrace", 0, 0, 0, scm_backtrace);
+SCM
+scm_backtrace ()
+{
+ if (SCM_NFALSEP (SCM_CDR (scm_the_last_stack_var)))
+ {
+ scm_newline (scm_cur_outp);
+ scm_display_backtrace (SCM_CDR (scm_the_last_stack_var),
+ scm_cur_outp,
+ SCM_UNDEFINED,
+ SCM_UNDEFINED);
+ scm_newline (scm_cur_outp);
+ if (SCM_FALSEP (SCM_CDR (scm_has_shown_backtrace_hint_p_var))
+ && !SCM_BACKTRACE_P)
+ {
+ scm_gen_puts (scm_regular_string,
+ "Type \"(debug-enable 'backtrace)\" if you would like a backtrace
+automatically if an error occurs in the future.\n",
+ scm_cur_outp);
+ SCM_SETCDR (scm_has_shown_backtrace_hint_p_var, SCM_BOOL_T);
+ }
+ }
+ else
+ {
+ scm_gen_puts (scm_regular_string,
+ "No backtrace available.\n",
+ scm_cur_outp);
+ }
+ return SCM_UNSPECIFIED;
+}
+
void
scm_init_backtrace ()
{
+ scm_the_last_stack_var = scm_sysintern ("the-last-stack", SCM_BOOL_F);
+
#include "backtrace.x"
}