[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] emacs-26 e133b63: Avoid adverse side effects of fixing bug
From: |
Eli Zaretskii |
Subject: |
[Emacs-diffs] emacs-26 e133b63: Avoid adverse side effects of fixing bug#21824 |
Date: |
Sat, 15 Sep 2018 05:22:34 -0400 (EDT) |
branch: emacs-26
commit e133b630625d6e5791c8b491c1cf3252cdb97080
Author: Eli Zaretskii <address@hidden>
Commit: Eli Zaretskii <address@hidden>
Avoid adverse side effects of fixing bug#21824
* test/src/buffer-tests.el
(overlay-modification-hooks-deleted-overlay): New test.
* src/buffer.c (report_overlay_modification): Don't bypass all
the overlay-modification hooks; instead, invoke each function
only if the buffer associated with the overlay is the current
buffer. (Bug#30823)
---
src/buffer.c | 24 ++++++------------------
test/src/buffer-tests.el | 19 +++++++++++++++++++
2 files changed, 25 insertions(+), 18 deletions(-)
diff --git a/src/buffer.c b/src/buffer.c
index b0cee71..179360c 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -4543,23 +4543,6 @@ report_overlay_modification (Lisp_Object start,
Lisp_Object end, bool after,
Lisp_Object *copy;
ptrdiff_t i;
- if (size)
- {
- Lisp_Object ovl
- = XVECTOR (last_overlay_modification_hooks)->contents[1];
-
- /* If the buffer of the first overlay in the array doesn't
- match the current buffer, then these modification hooks
- should not be run in this buffer. This could happen when
- some code calls some insdel functions, such as del_range_1,
- with the PREPARE argument false -- in that case this
- function is never called to record the overlay modification
- hook functions in the last_overlay_modification_hooks
- array, so anything we find there is not ours. */
- if (XMARKER (OVERLAY_START (ovl))->buffer != current_buffer)
- return;
- }
-
USE_SAFE_ALLOCA;
SAFE_ALLOCA_LISP (copy, size);
memcpy (copy, XVECTOR (last_overlay_modification_hooks)->contents,
@@ -4570,7 +4553,12 @@ report_overlay_modification (Lisp_Object start,
Lisp_Object end, bool after,
Lisp_Object prop_i, overlay_i;
prop_i = copy[i++];
overlay_i = copy[i++];
- call_overlay_mod_hooks (prop_i, overlay_i, after, arg1, arg2, arg3);
+ /* It is possible that the recorded overlay has been deleted
+ (which makes it's markers' buffers be nil), or that (due to
+ some bug) it belongs to a different buffer. Only run this
+ hook if the overlay belongs to the current buffer. */
+ if (XMARKER (OVERLAY_START (overlay_i))->buffer == current_buffer)
+ call_overlay_mod_hooks (prop_i, overlay_i, after, arg1, arg2, arg3);
}
SAFE_FREE ();
diff --git a/test/src/buffer-tests.el b/test/src/buffer-tests.el
index f9c477f..8479bbd 100644
--- a/test/src/buffer-tests.el
+++ b/test/src/buffer-tests.el
@@ -45,6 +45,25 @@ with parameters from the *Messages* buffer modification."
(should (eq buf (current-buffer))))
(when msg-ov (delete-overlay msg-ov))))))
+(ert-deftest overlay-modification-hooks-deleted-overlay ()
+ "Test for bug#30823."
+ (let ((check-point nil)
+ (ov-delete nil)
+ (ov-set nil))
+ (with-temp-buffer
+ (insert "abc")
+ (setq ov-set (make-overlay 1 3))
+ (overlay-put ov-set 'modification-hooks
+ (list (lambda (_o after &rest _args)
+ (and after (setq check-point t)))))
+ (setq ov-delete (make-overlay 1 3))
+ (overlay-put ov-delete 'modification-hooks
+ (list (lambda (o after &rest _args)
+ (and (not after) (delete-overlay o)))))
+ (goto-char 2)
+ (insert "1")
+ (should (eq check-point t)))))
+
(ert-deftest test-generate-new-buffer-name-bug27966 ()
(should-not (string-equal "nil"
(progn (get-buffer-create "nil")
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] emacs-26 e133b63: Avoid adverse side effects of fixing bug#21824,
Eli Zaretskii <=