diff options
author | Mikael Djurfeldt <djurfeldt@nada.kth.se> | 1997-02-10 01:01:54 +0000 |
---|---|---|
committer | Mikael Djurfeldt <djurfeldt@nada.kth.se> | 1997-02-10 01:01:54 +0000 |
commit | 5aab5d961cbe871a28e733fa21a3e7558c34f078 (patch) | |
tree | 4a2f1e96ba490bddf226ceeafb6bbd08354330bd /libguile/backtrace.c | |
parent | b6b72ebaaaecb3a2ea54dd0c6bbfbc7f8e230f27 (diff) | |
download | guile-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.c | 35 |
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" } |