(track-changes--after): Fix problem found in bug#73041

When calling `track-changes--before` (e.g. because of a missing
b-f-c or for some other reason), it sets `track-changes--before-end`
to the right value so we shouldn't increment it right after.
Also, we should update `track-changes--buffer-size` before
calling `track-changes--before` so it doesn't risk signaling
a spurious inconsistency.

* lisp/emacs-lisp/track-changes.el (track-changes--after):
Update `track-changes--buffer-size` earlier, and don't increment
`track-changes--before-end` when we call `track-changes--before`.
This commit is contained in:
Stefan Monnier 2024-10-17 11:39:19 -04:00
parent d3c9410226
commit 90c6880a92

View file

@ -555,16 +555,16 @@ Details logged to `track-changes--error-log'")
(defun track-changes--after (beg end len)
(cl-assert track-changes--state)
(and (eq track-changes--before-clean 'unset)
(not track-changes--before-no)
;; This can be a sign that a `before-change-functions' went missing,
;; or that we called `track-changes--clean-state' between
;; a `before-change-functions' and `after-change-functions'.
(track-changes--before beg end))
(setq track-changes--before-clean nil)
(let ((offset (- (- end beg) len)))
(cl-incf track-changes--before-end offset)
(cl-incf track-changes--buffer-size offset)
(if (and (eq track-changes--before-clean 'unset)
(not track-changes--before-no))
;; This can be a sign that a `before-change-functions' went missing,
;; or that we called `track-changes--clean-state' between
;; a `before-change-functions' and `after-change-functions'.
(track-changes--before beg end)
(cl-incf track-changes--before-end offset))
(setq track-changes--before-clean nil)
(if (not (or track-changes--before-no
(save-restriction
(widen)