summaryrefslogtreecommitdiff
path: root/libguile/backtrace.c
diff options
context:
space:
mode:
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"
}