summaryrefslogtreecommitdiff
path: root/src/eval.c
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1994-01-11 07:22:11 +0000
committerRichard M. Stallman <rms@gnu.org>1994-01-11 07:22:11 +0000
commit7340f02e228e7286307ce15e3ae63d4c42d03cc8 (patch)
treea6ef3851a4c8662e913aec47970a633852de78e3 /src/eval.c
parentbf2a8749d3242270ac7af79eb1d9c60998064413 (diff)
downloademacs-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.c35
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;
}