org-element.el: Prevent cache key collisions

* lisp/org-element.el (org-element--cache-sync,
org-element-cache-reset): Do not use `buffer-chars-modified-tick' as
`org-element--cache-sync-keys-value'.  Instead, make sure that
`org-element--cache-sync-keys-value' is always changed upon completing
cache request sequence.  Using `buffer-chars-modified-tick' can
trigger using obsolete sync keys after we add elements to cache via
`org-element--parse-to' after cache sync is completed, but no other
changes were made in the buffer.  The newly added elements are then
not comparable with the obsolete sync keys.

(org-element--cache-persist-before-write): Cleanup
`:org-element--cache-sync-key' from elements before saving element
cache to file.  If we do not do it, obsolete keys may be reused
inintentionally during next Emacs session.
This commit is contained in:
Ihor Radchenko 2021-10-21 23:38:42 +08:00
parent 4eab5bd3f0
commit 79971b748d
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
1 changed files with 8 additions and 2 deletions

View File

@ -5843,7 +5843,7 @@ updated before current modification are actually submitted."
;; Otherwise, reset keys.
(if org-element--cache-sync-requests
(org-element--cache-set-timer buffer)
(setq org-element--cache-sync-keys-value (buffer-chars-modified-tick))))))))
(setq org-element--cache-sync-keys-value (1+ org-element--cache-sync-keys-value))))))))
(defun org-element--cache-process-request
(request next-request-key threshold time-limit future-change)
@ -6819,6 +6819,12 @@ Return non-nil when verification failed."
org-element-cache-persistent
(eq var 'org-element--cache))
(with-current-buffer buffer
;; Cleanup cache request keys to avoid collisions during next
;; Emacs session.
(avl-tree-mapc
(lambda (el)
(org-element-put-property el :org-element--cache-sync-key nil))
org-element--cache)
(org-with-wide-buffer
(org-element-at-point (point-max))))
nil))
@ -6872,7 +6878,7 @@ buffers."
(avl-tree-create #'org-element--cache-compare))
(setq-local org-element--cache-size 0)
(setq-local org-element--headline-cache-size 0)
(setq-local org-element--cache-sync-keys-value (buffer-chars-modified-tick))
(setq-local org-element--cache-sync-keys-value 0)
(setq-local org-element--cache-change-warning nil)
(setq-local org-element--cache-sync-requests nil)
(setq-local org-element--cache-sync-timer nil)