Fix condition-case empty success handler misinterpretation
(condition-case X E (:success)) should return nil; the compiler behaves correctly in this case. * src/eval.c (internal_lisp_condition_case): Evaluate an empty :success handler as nil instead of pretending it isn't there. * test/lisp/emacs-lisp/bytecomp-tests.el (bytecomp-tests--test-cases): Add test case.
This commit is contained in:
parent
8bb8cc5b49
commit
1748361c68
2 changed files with 8 additions and 3 deletions
|
@ -1367,7 +1367,7 @@ internal_lisp_condition_case (Lisp_Object var, Lisp_Object bodyform,
|
|||
error ("Invalid condition handler: %s",
|
||||
SDATA (Fprin1_to_string (tem, Qt, Qnil)));
|
||||
if (CONSP (tem) && EQ (XCAR (tem), QCsuccess))
|
||||
success_handler = XCDR (tem);
|
||||
success_handler = tem;
|
||||
else
|
||||
clausenb++;
|
||||
}
|
||||
|
@ -1430,7 +1430,7 @@ internal_lisp_condition_case (Lisp_Object var, Lisp_Object bodyform,
|
|||
if (!NILP (success_handler))
|
||||
{
|
||||
if (NILP (var))
|
||||
return Fprogn (success_handler);
|
||||
return Fprogn (XCDR (success_handler));
|
||||
|
||||
Lisp_Object handler_var = var;
|
||||
if (!NILP (Vinternal_interpreter_environment))
|
||||
|
@ -1442,7 +1442,7 @@ internal_lisp_condition_case (Lisp_Object var, Lisp_Object bodyform,
|
|||
|
||||
specpdl_ref count = SPECPDL_INDEX ();
|
||||
specbind (handler_var, result);
|
||||
return unbind_to (count, Fprogn (success_handler));
|
||||
return unbind_to (count, Fprogn (XCDR (success_handler)));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -752,6 +752,11 @@ inner loops respectively."
|
|||
(condition-case nil
|
||||
(characterp x) ; value (no :success, no var)
|
||||
(error 'bad)))
|
||||
|
||||
(condition-case nil
|
||||
(bytecomp-test-identity 3)
|
||||
(error 'bad)
|
||||
(:success)) ; empty handler
|
||||
)
|
||||
"List of expressions for cross-testing interpreted and compiled code.")
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue