bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#73041: 30.0.90; track-changes-mode logs warnings (#70541 regression?


From: Stefan Monnier
Subject: bug#73041: 30.0.90; track-changes-mode logs warnings (#70541 regression? not actually fixed?)
Date: Fri, 27 Sep 2024 10:55:58 -0400
User-agent: Gnus/5.13 (Gnus v5.13)

> 1. Run 'cargo new foo' to create a new cargo project
> 2. emacs -Q foo/src/main.rs
> 3. M-x rust-ts-mode RET
> 4. M-x eglot RET
> 5. C-x k RET
>
> Expected:
> Buffer main.rs is killed.
>
> Actual:
> (cl-assert (track-changes--sane-state-p)) assertion triggered.

Duh, sorry.  Try this patch instead.


        Stefan
diff --git a/lisp/emacs-lisp/track-changes.el b/lisp/emacs-lisp/track-changes.el
index 92d14959763..24df0aac6bb 100644
--- a/lisp/emacs-lisp/track-changes.el
+++ b/lisp/emacs-lisp/track-changes.el
@@ -213,6 +213,7 @@ track-changes-register
 that may block, do as little work as possible, ...
 When IMMEDIATE is non-nil, the SIGNAL should probably not always call
 `track-changes-fetch', since that would defeat the purpose of this library."
+  (cl-assert (track-changes--sane-state-p))
   (when (and nobefore disjoint)
     ;; FIXME: Without `before-change-functions', we can discover
     ;; a disjoint change only after the fact, which is not good enough.
@@ -229,6 +230,7 @@ track-changes-register
     (push tracker track-changes--clean-trackers)
     (when disjoint
       (push tracker track-changes--disjoint-trackers))
+    (cl-assert (track-changes--sane-state-p))
     tracker))
 
 (defun track-changes-unregister (id)
@@ -236,6 +238,7 @@ track-changes-unregister
 Trackers can consume resources (especially if `track-changes-fetch' is
 not called), so it is good practice to unregister them when you don't
 need them any more."
+  (cl-assert (track-changes--sane-state-p))
   (unless (memq id track-changes--trackers)
     (error "Unregistering a non-registered tracker: %S" id))
   (setq track-changes--trackers (delq id track-changes--trackers))
@@ -253,7 +256,8 @@ track-changes-unregister
             track-changes--buffer-size
             track-changes--before-clean
             track-changes--state))
-    (remove-hook 'after-change-functions  #'track-changes--after  t)))
+    (remove-hook 'after-change-functions  #'track-changes--after  t))
+  (cl-assert (track-changes--sane-state-p)))
 
 (defun track-changes-fetch (id func)
   "Fetch the pending changes for tracker ID pass them to FUNC.
@@ -372,7 +376,8 @@ track-changes-fetch
           (funcall func beg end (or before lenbefore)))
       ;; Re-enable the tracker's signal only after running `func', so
       ;; as to avoid nested invocations.
-      (cl-pushnew id track-changes--clean-trackers))))
+      (cl-pushnew id track-changes--clean-trackers)
+      (cl-assert (track-changes--sane-state-p)))))
 
 (defun track-changes-inconsistent-state-p ()
   "Return whether the current buffer is in an inconsistent state.
@@ -387,6 +392,26 @@ track-changes-inconsistent-state-p
 
 ;;;; Auxiliary functions.
 
+(defun track-changes--sane-state-p ()
+  (if (null track-changes--trackers)
+      (and (zerop track-changes--before-beg)
+           (zerop track-changes--before-end)
+           (equal track-changes--before-string "")
+           (null track-changes--buffer-size)
+           (eq track-changes--before-clean 'unset)
+           (null track-changes--state))
+    (and (equal track-changes--buffer-size (buffer-size))
+         (or track-changes--before-no
+             (pcase track-changes--before-clean
+               ('unset t)
+               ('set (<= track-changes--before-beg track-changes--before-end))
+               ('nil
+                (<= track-changes--before-beg
+                    (track-changes--state-beg track-changes--state)
+                    (track-changes--state-end track-changes--state)
+                    track-changes--before-end))
+               (_ nil))))))
+
 (defun track-changes--clean-state ()
   (cond
    ((null track-changes--state)
@@ -551,7 +576,8 @@ track-changes--before
                                      (length track-changes--before-string))))))
               (setf track-changes--before-end new-bend)
               (cl-callf concat track-changes--before-string
-                (buffer-substring-no-properties old-bend new-bend)))))))))
+                (buffer-substring-no-properties old-bend new-bend))))))))
+  (cl-assert (track-changes--sane-state-p)))
 
 (defun track-changes--after (beg end len)
   (cl-assert track-changes--state)
@@ -576,10 +602,26 @@ track-changes--after
         ;; BEG..END is not covered by previous `before-change-functions'!!
         (track-changes--recover-from-error `(unexpected-after ,beg ,end ,len))
       ;; Note the new changes.
+      (let ((orig-beg (track-changes--state-beg track-changes--state))
+            (orig-end (track-changes--state-end track-changes--state)))
       (when (< beg (track-changes--state-beg track-changes--state))
         (setf (track-changes--state-beg track-changes--state) beg))
       (cl-callf (lambda (old-end) (max end (+ old-end offset)))
           (track-changes--state-end track-changes--state))
+      (cl-assert (or track-changes--before-no
+                     (<= track-changes--before-beg
+                         (track-changes--state-beg track-changes--state)))
+                 nil "<=? %S %S (was %S)"
+                 track-changes--before-beg
+                 (track-changes--state-beg track-changes--state)
+                 orig-beg)
+      (cl-assert (or track-changes--before-no
+                     (<= (track-changes--state-end track-changes--state)
+                         track-changes--before-end))
+                 nil "<=? %S %S (was %S)"
+                 (track-changes--state-end track-changes--state)
+                 track-changes--before-end
+                 orig-end))
       (cl-assert (or track-changes--before-no
                      (<= track-changes--before-beg
                          (track-changes--state-beg track-changes--state)
@@ -591,7 +633,8 @@ track-changes--after
       (if (track-changes--tracker-immediate tracker)
           (funcall (track-changes--tracker-signal tracker) tracker)
         (run-with-timer 0 nil #'track-changes--call-signal
-                        (current-buffer) tracker)))))
+         (current-buffer) tracker))))
+  (cl-assert (track-changes--sane-state-p)))
 
 (defun track-changes--call-signal (buf tracker)
   (when (buffer-live-p buf)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]