* allout.el (allout-hide-by-annotation, allout-flag-region): Reduce
authorKen Manheimer <ken.manheimer@gmail.com>
Tue, 29 Mar 2011 18:26:01 +0000 (14:26 -0400)
committerKen Manheimer <ken.manheimer@gmail.com>
Tue, 29 Mar 2011 18:26:01 +0000 (14:26 -0400)
possibility of overlay leakage by making them volatile.

* allout-widgets.el (allout-widgets-tally): Define as nil so the hash is
not shared between buffers.  Mode initialization is responsible for giving
it a useful starting value.
(allout-item-span): Reduce possibility of overlay leakage by making them
volatile.
(allout-widgets-count-buttons-in-region): Add diagnostic function for
tracking down overlay leaks.

lisp/ChangeLog
lisp/allout-widgets.el
lisp/allout.el

index dbd335b..8e6e78c 100644 (file)
@@ -1,3 +1,16 @@
+2011-03-29  Ken Manheimer  <ken.manheimer@gmail.com>
+
+       * allout.el (allout-hide-by-annotation, allout-flag-region):
+       Reduce possibility of overlay leakage by making them volatile.
+
+       * allout-widgets.el (allout-widgets-tally): Define as nil so the
+       hash is not shared between buffers.  Mode initialization is
+       responsible for giving it a useful starting value.
+       (allout-item-span): Reduce possibility of overlay leakage by
+       making them volatile.
+       (allout-widgets-count-buttons-in-region): Add diagnostic function
+       for tracking down button overlay leaks.
+
 2011-03-29  Leo Liu  <sdl.web@gmail.com>
 
        * ido.el (ido-read-internal): Use the default history var
index 47f181a..ae4265b 100644 (file)
@@ -238,7 +238,7 @@ buffer, and tracking increases as new widgets are added and
 decreases as obsolete widgets are garbage collected."
   :type 'boolean
   :group 'allout-widgets-developer)
-(defvar allout-widgets-tally (make-hash-table :test 'eq :weakness 'key)
+(defvar allout-widgets-tally nil
   "Hash-table of existing allout widgets, for debugging.
 
 Table is maintained iff `allout-widgets-maintain-tally' is non-nil.
@@ -2100,6 +2100,7 @@ previously established or is not moved."
     (cond ((not overlay) (when start
                            (setq overlay (make-overlay start end nil t nil))
                            (overlay-put overlay 'button item-widget)
+                           (overlay-put overlay 'evaporate t)
                            (widget-put item-widget :span-overlay overlay)
                            t))
           ;; report:
@@ -2343,6 +2344,19 @@ The elements of LIST are not copied, just the list structure itself."
        (while (consp list) (push (pop list) res))
        (prog1 (nreverse res) (setcdr res list)))
     (car list)))
+;;;_  . allout-widgets-count-buttons-in-region (start end)
+(defun allout-widgets-count-buttons-in-region (start end)
+  "Debugging/diagnostic tool - count overlays with 'button' property in region."
+  (interactive "r")
+  (setq start (or start (point-min))
+        end (or end (point-max)))
+  (if (> start end) (let ((interim start)) (setq start end end interim)))
+  (let ((button-overlays (delq nil
+                               (mapcar (function (lambda (o)
+                                                   (if (overlay-get o 'button)
+                                                       o)))
+                                       (overlays-in start end)))))
+    (length button-overlays)))
 
 ;;;_ : Run unit tests:
 (defun allout-widgets-run-unit-tests ()
index 3fb8ed7..736ec42 100644 (file)
@@ -4489,8 +4489,9 @@ Topic exposure is marked with text-properties, to be used by
             ;; advance to just after end of this annotation:
             (setq next (allout-next-single-char-property-change
                         (point) 'allout-was-hidden nil end))
-            (overlay-put (make-overlay prev next nil 'front-advance)
-                         'category 'allout-exposure-category)
+            (let ((o (make-overlay prev next nil 'front-advance)))
+              (overlay-put o 'category 'allout-exposure-category)
+              (overlay-put o 'evaporate t))
             (allout-deannotate-hidden prev next)
             (setq prev next)
             (if next (goto-char next)))))