From: Gerd Moellmann Date: Wed, 5 Jul 2000 17:24:19 +0000 (+0000) Subject: (Vsignaling_function): New variable. X-Git-Tag: emacs-pretest-21.0.90~2952 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=a2ff3819f64ba2d79b3fc92756a13332afd6a37e;p=emacs.git (Vsignaling_function): New variable. (Fsignal): Compute it. (syms_of_eval): Staticpro it. --- diff --git a/src/eval.c b/src/eval.c index 487b2d8e5b8..d59ceb38eac 100644 --- a/src/eval.c +++ b/src/eval.c @@ -163,6 +163,11 @@ int when_entered_debugger; 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 @@ See also the function `condition-case'.") 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 @@ See also the function `condition-case'.") 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 @@ If NFRAMES is more than the number of frames, the value is nil.") return Fcons (Qt, Fcons (*backlist->function, tem)); } } + void syms_of_eval () @@ -3197,6 +3212,8 @@ still determine whether to handle the particular condition."); staticpro (&Vautoload_queue); Vautoload_queue = Qnil; + staticpro (&Vsignaling_function); + Vsignaling_function = Qnil; defsubr (&Sor); defsubr (&Sand);