]> git.eshelyaron.com Git - emacs.git/commitdiff
Make with-buffer-unmodified-if-unchanged more resilient
authorLars Ingebrigtsen <larsi@gnus.org>
Tue, 3 May 2022 20:04:39 +0000 (22:04 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Tue, 3 May 2022 20:04:39 +0000 (22:04 +0200)
* lisp/emacs-lisp/subr-x.el (with-buffer-unmodified-if-unchanged):
Make more resilient.

lisp/emacs-lisp/subr-x.el
test/lisp/sort-tests.el

index 8e763b613eedc521db6c1378ebcf9996e00f783f..a416059df6262ba9330cd929b619bfa648fdc0ef 100644 (file)
@@ -426,22 +426,24 @@ modification status:
 
   (with-buffer-unmodified-if-unchanged
     (insert \"a\")
-    (delete-char -1))
-
-BODY must preserve the current buffer."
+    (delete-char -1))."
   (declare (debug t) (indent 0))
-  (let ((hash (gensym)))
+  (let ((hash (gensym))
+        (buffer (gensym)))
     `(let ((,hash (and (not (buffer-modified-p))
-                       (buffer-hash))))
+                       (buffer-hash)))
+           (,buffer (current-buffer)))
        (prog1
            (progn
              ,@body)
          ;; If we didn't change anything in the buffer (and the buffer
          ;; was previously unmodified), then flip the modification status
          ;; back to "unchanged".
-         (when (and ,hash (buffer-modified-p)
-                    (equal ,hash (buffer-hash)))
-           (restore-buffer-modified-p nil))))))
+         (when (buffer-live-p ,buffer)
+           (with-current-buffer ,buffer
+             (when (and ,hash (buffer-modified-p)
+                        (equal ,hash (buffer-hash)))
+               (restore-buffer-modified-p nil))))))))
 
 (provide 'subr-x)
 
index 7f49cc38d1b29ade5f697e63c00385b2d7d47d6b..5fcae308d6af7e460f2ebfe35e86e2fd92fe3411 100644 (file)
@@ -106,5 +106,38 @@ reversing the sort."
                            :generator (lambda (n) (concat (sort-tests-random-word n) " " (sort-tests-random-word n)))
                            :less-pred (lambda (a b) (string< (field-n a 2) (field-n b 2))))))
 
+(defun test-with-buffer-unmodified-if-unchanged ()
+  (with-temp-buffer
+    (with-buffer-unmodified-if-unchanged
+      (insert "t"))
+    (should (buffer-modified-p)))
+
+  (with-temp-buffer
+    (with-buffer-unmodified-if-unchanged
+      (insert "t")
+      (delete-char -1))
+    (should (not (buffer-modified-p))))
+
+  ;; Shouldn't error.
+  (should
+   (with-temp-buffer
+     (let ((inner (current-buffer)))
+       (with-buffer-unmodified-if-unchanged
+         (insert "t")
+         (delete-char -1)
+         (kill-buffer (current-buffer))
+         t))))
+
+  (with-temp-buffer
+    (let ((outer (current-buffer)))
+      (with-temp-buffer
+        (let ((inner (current-buffer)))
+        (with-buffer-unmodified-if-unchanged
+          (insert "t")
+          (delete-char -1)
+          (set-buffer outer))
+        (with-current-buffer inner
+          (should (not (buffer-modified-p)))))))))
+
 (provide 'sort-tests)
 ;;; sort-tests.el ends here