]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/mpc.el (mpc-format): Fix inf-loop in constructed predicate
authorStefan Monnier <monnier@iro.umontreal.ca>
Sat, 29 May 2021 18:24:23 +0000 (14:24 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Sat, 29 May 2021 18:24:23 +0000 (14:24 -0400)
lisp/mpc.el

index f7302750389afefab05f87db3fa313e3c73c1cfe..9addb70f56af43a19e70187153e5a2232026290b 100644 (file)
@@ -1027,10 +1027,14 @@ If PLAYLIST is t or nil or missing, use the main playlist."
                      (let ((dir (file-name-directory (cdr (assq 'file info)))))
                        ;; (debug)
                        (setq pred
-                             (lambda (info)
-                               (and (funcall pred info)
-                                    (equal dir (file-name-directory
-                                                (cdr (assq 'file info)))))))
+                             ;; We want the closure to capture the current
+                             ;; value of `pred' and not a reference to the
+                             ;; variable itself.
+                             (let ((oldpred pred))
+                               (lambda (info)
+                                 (and (funcall oldpred info)
+                                      (equal dir (file-name-directory
+                                                  (cdr (assq 'file info))))))))
                        (if-let* ((covers '(".folder.png" "cover.jpg" "folder.jpg"))
                                  (cover (cl-loop for file in (directory-files (mpc-file-local-copy dir))
                                                  if (member (downcase file) covers)
@@ -1057,9 +1061,13 @@ If PLAYLIST is t or nil or missing, use the main playlist."
                          (when (and (null val) (eq tag 'Title))
                            (setq val (cdr (assq 'file info))))
                          (setq pred
-                               (lambda (info)
-                                 (and (funcall pred info)
-                                      (equal val (cdr (assq ',tag info))))))
+                               ;; We want the closure to capture the current
+                               ;; value of `pred' and not a reference to the
+                               ;; variable itself.
+                               (let ((oldpred pred))
+                                 (lambda (info)
+                                   (and (funcall oldpred info)
+                                        (equal val (cdr (assq tag info)))))))
                          (cond
                           ((not (and (eq tag 'Date) (stringp val))) val)
                           ;; For "date", only keep the year!