]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix recently introduced bug in `byte-compile-lambda'
authorLars Ingebrigtsen <larsi@gnus.org>
Wed, 17 Feb 2021 16:12:27 +0000 (17:12 +0100)
committerLars Ingebrigtsen <larsi@gnus.org>
Wed, 17 Feb 2021 16:12:31 +0000 (17:12 +0100)
* lisp/emacs-lisp/bytecomp.el (byte-compile-lambda): Fix recently
introduced error when compiling non-lexical commands (bug#46589).

lisp/emacs-lisp/bytecomp.el

index 5c6b9c2e39aded6019b3233756dc9e91342fd591..9d80afd774fd83fd4895e8adfc4b86eef800eb6c 100644 (file)
@@ -2951,7 +2951,9 @@ for symbols generated by the byte compiler itself."
       ;; Skip (interactive) if it is in front (the most usual location).
       (if (eq int (car body))
          (setq body (cdr body)))
-      (cond ((consp (cdr int))
+      (cond ((consp (cdr int))       ; There is an `interactive' spec.
+             ;; Check that the bit after the `interactive' spec is
+             ;; just a list of symbols (i.e., modes).
             (unless (seq-every-p #'symbolp (cdr (cdr int)))
               (byte-compile-warn "malformed interactive specc: %s"
                                  (prin1-to-string int)))
@@ -2966,16 +2968,14 @@ for symbols generated by the byte compiler itself."
                 (while (consp (cdr form))
                   (setq form (cdr form)))
                 (setq form (car form)))
-              (setq int
-                    (if (and (eq (car-safe form) 'list)
-                              ;; For code using lexical-binding, form is not
-                              ;; valid lisp, but rather an intermediate form
-                              ;; which may include "calls" to
-                              ;; internal-make-closure (Bug#29988).
-                              (not lexical-binding))
-                         `(interactive ,form)
-                       `(interactive ,newform)))))
-           ((cdr int)
+              (when (or (not (eq (car-safe form) 'list))
+                         ;; For code using lexical-binding, form is not
+                         ;; valid lisp, but rather an intermediate form
+                         ;; which may include "calls" to
+                         ;; internal-make-closure (Bug#29988).
+                         lexical-binding)
+                 (setq int `(interactive ,newform)))))
+            ((cdr int)                  ; Invalid (interactive . something).
             (byte-compile-warn "malformed interactive spec: %s"
                                (prin1-to-string int)))))
     ;; Process the body.