]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix condition-case empty success handler misinterpretation
authorMattias Engdegård <mattiase@acm.org>
Sat, 24 Dec 2022 09:39:57 +0000 (10:39 +0100)
committerMattias Engdegård <mattiase@acm.org>
Sat, 24 Dec 2022 10:55:40 +0000 (11:55 +0100)
(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.

src/eval.c
test/lisp/emacs-lisp/bytecomp-tests.el

index 99f3650fc9b061d4c0fd885c18734ef29a13e52b..cff4b92477887a4c9e1ebfede9c1bdf63b52997f 100644 (file)
@@ -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;
 }
index 36f541e867cc6cebbdb50f6f2d253e13aae76399..47200de7a02b91470a89810830cf6479840a0d85 100644 (file)
@@ -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.")