Fix calls to modifications hooks in replace-buffer-contents

* src/editfns.c (Freplace_buffer_contents): Call the modification
hooks on the entire region where replacements could have taken
place.  The previous attempts of being more accurate just
introduced bugs.  (Bug#32278)
This commit is contained in:
Eli Zaretskii 2018-07-27 13:04:19 +03:00
parent 71a915153a
commit d24c5f26bf

View file

@ -3243,21 +3243,9 @@ differences between the two buffers. */)
Instead, we announce a single modification for the entire Instead, we announce a single modification for the entire
modified region. But don't do that if the caller inhibited modified region. But don't do that if the caller inhibited
modification hooks, because then they don't want that. */ modification hooks, because then they don't want that. */
ptrdiff_t from, to;
if (!inhibit_modification_hooks) if (!inhibit_modification_hooks)
{ {
ptrdiff_t k, l; prepare_to_modify_buffer (BEGV, ZV, NULL);
/* Find the first character position to be changed. */
for (k = 0; k < size_a && !bit_is_set (ctx.deletions, k); k++)
;
from = BEGV + k;
/* Find the last character position to be changed. */
for (l = size_a; l > k && !bit_is_set (ctx.deletions, l - 1); l--)
;
to = BEGV + l;
prepare_to_modify_buffer (from, to, NULL);
specbind (Qinhibit_modification_hooks, Qt); specbind (Qinhibit_modification_hooks, Qt);
modification_hooks_inhibited = true; modification_hooks_inhibited = true;
} }
@ -3310,9 +3298,8 @@ differences between the two buffers. */)
if (modification_hooks_inhibited) if (modification_hooks_inhibited)
{ {
ptrdiff_t updated_to = to + ZV - BEGV - size_a; signal_after_change (BEGV, size_a, ZV - BEGV);
signal_after_change (from, to - from, updated_to - from); update_compositions (BEGV, ZV, CHECK_INSIDE);
update_compositions (from, updated_to, CHECK_INSIDE);
} }
return Qnil; return Qnil;