# HG changeset patch # User Gerd Moellmann # Date 962817859 0 # Node ID ed8f34a43649ee2b8501d3e0edf9a476179d293e # Parent da80009c3957e3d540512fe38de82e67e2c82c7a (Vsignaling_function): New variable. (Fsignal): Compute it. (syms_of_eval): Staticpro it. diff -r da80009c3957 -r ed8f34a43649 src/eval.c --- a/src/eval.c Wed Jul 05 17:23:15 2000 +0000 +++ b/src/eval.c Wed Jul 05 17:24:19 2000 +0000 @@ -163,6 +163,11 @@ Lisp_Object Vdebugger; +/* The function from which the last `signal' was called. Set in + Fsignal. */ + +Lisp_Object Vsignaling_function; + void specbind (), record_unwind_protect (); Lisp_Object run_hook_with_args (); @@ -1274,6 +1279,7 @@ Lisp_Object string; Lisp_Object real_error_symbol; extern int display_busy_cursor_p; + struct backtrace *bp; immediate_quit = 0; if (gc_in_progress || waiting_for_input) @@ -1297,6 +1303,14 @@ conditions = Fget (real_error_symbol, Qerror_conditions); + /* Remember from where signal was called. Skip over the frame for + `signal' itself. If a frame for `error' follows, skip that, + too. */ + bp = backtrace_list->next; + if (bp && bp->function && EQ (*bp->function, Qerror)) + bp = bp->next; + Vsignaling_function = bp && bp->function ? *bp->function : Qnil; + for (; handlerlist; handlerlist = handlerlist->next) { register Lisp_Object clause; @@ -3066,6 +3080,7 @@ return Fcons (Qt, Fcons (*backlist->function, tem)); } } + void syms_of_eval () @@ -3197,6 +3212,8 @@ staticpro (&Vautoload_queue); Vautoload_queue = Qnil; + staticpro (&Vsignaling_function); + Vsignaling_function = Qnil; defsubr (&Sor); defsubr (&Sand);