diff options
author | Richard M. Stallman <rms@gnu.org> | 1994-01-11 07:22:11 +0000 |
---|---|---|
committer | Richard M. Stallman <rms@gnu.org> | 1994-01-11 07:22:11 +0000 |
commit | 7340f02e228e7286307ce15e3ae63d4c42d03cc8 (patch) | |
tree | a6ef3851a4c8662e913aec47970a633852de78e3 /src/eval.c | |
parent | bf2a8749d3242270ac7af79eb1d9c60998064413 (diff) | |
download | emacs-7340f02e228e7286307ce15e3ae63d4c42d03cc8.tar.gz |
(Fcondition_case): Allow a list of condition names in a handler.
(find_handler_clause): Likewise.
Diffstat (limited to 'src/eval.c')
-rw-r--r-- | src/eval.c | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/src/eval.c b/src/eval.c index 1a5fc45004f..5f72b7a07c2 100644 --- a/src/eval.c +++ b/src/eval.c @@ -1013,8 +1013,10 @@ See also the function `signal' for more info.") { Lisp_Object tem; tem = Fcar (val); - if ((!NILP (tem)) && - (!CONSP (tem) || (XTYPE (XCONS (tem)->car) != Lisp_Symbol))) + if (! (NILP (tem) + || (CONSP (tem) + && (SYMBOLP (XCONS (tem)->car) + || CONSP (XCONS (tem)->car))))) error ("Invalid condition handler", tem); } @@ -1195,7 +1197,6 @@ find_handler_clause (handlers, conditions, sig, data, debugger_value_ptr) { register Lisp_Object h; register Lisp_Object tem; - register Lisp_Object tem1; if (EQ (handlers, Qt)) /* t is used by handlers for all conditions, set up by C code. */ return Qt; @@ -1220,12 +1221,30 @@ find_handler_clause (handlers, conditions, sig, data, debugger_value_ptr) } for (h = handlers; CONSP (h); h = Fcdr (h)) { - tem1 = Fcar (h); - if (!CONSP (tem1)) + Lisp_Object handler, condit; + + handler = Fcar (h); + if (!CONSP (handler)) continue; - tem = Fmemq (Fcar (tem1), conditions); - if (!NILP (tem)) - return tem1; + condit = Fcar (handler); + /* Handle a single condition name in handler HANDLER. */ + if (SYMBOLP (condit)) + { + tem = Fmemq (Fcar (handler), conditions); + if (!NILP (tem)) + return handler; + } + /* Handle a list of condition names in handler HANDLER. */ + else if (CONSP (condit)) + { + while (CONSP (condit)) + { + tem = Fmemq (Fcar (condit), conditions); + if (!NILP (tem)) + return handler; + condit = XCONS (condit)->cdr; + } + } } return Qnil; } |