浏览代码

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.
Ihor Radchenko 3 年之前
父节点
当前提交
79971b748d
共有 1 个文件被更改,包括 8 次插入2 次删除
  1. 8 2
      lisp/org-element.el

+ 8 - 2
lisp/org-element.el

@@ -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)