]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix calls to insert-*-hooks when JIT font lock is active
authorEli Zaretskii <eliz@gnu.org>
Thu, 19 Sep 2019 14:10:00 +0000 (17:10 +0300)
committerEli Zaretskii <eliz@gnu.org>
Thu, 19 Sep 2019 14:10:00 +0000 (17:10 +0300)
* src/insdel.c (signal_after_change): Save and restore
interval_insert_behind_hooks and
interval_insert_in_front_hooks across calls to various other
hooks, to prevent their clobbering by those other hooks.
(Bug#37455)

src/buffer.h
src/insdel.c
src/textprop.c

index 82d9350bfc265d4adb374982fe11234b4ed4ab5b..280d4e9098e413ad7458af80e99fd081be219e73 100644 (file)
@@ -1139,6 +1139,12 @@ extern struct buffer buffer_local_flags;
    that don't have such names.  */
 
 extern struct buffer buffer_local_symbols;
+
+/* verify_interval_modification saves insertion hooks here
+   to be run later by report_interval_modification.  */
+extern Lisp_Object interval_insert_behind_hooks;
+extern Lisp_Object interval_insert_in_front_hooks;
+
 \f
 extern void delete_all_overlays (struct buffer *);
 extern void reset_buffer (struct buffer *);
index 1da8d551c73387298a2d081de1b0d3f2ea80b03d..093b841d6d653a8395438cee70ec34e6247c555b 100644 (file)
@@ -2201,7 +2201,7 @@ signal_after_change (ptrdiff_t charpos, ptrdiff_t lendel, ptrdiff_t lenins)
 {
   ptrdiff_t count = SPECPDL_INDEX ();
   struct rvoe_arg rvoe_arg;
-  Lisp_Object tmp;
+  Lisp_Object tmp, save_insert_behind_hooks, save_insert_in_from_hooks;
 
   if (inhibit_modification_hooks)
     return;
@@ -2237,6 +2237,12 @@ signal_after_change (ptrdiff_t charpos, ptrdiff_t lendel, ptrdiff_t lenins)
       return;
     }
 
+  /* Save and restore the insert-*-hooks, because other hooks like
+     after-change-functions, called below, could clobber them if they
+     manipulate text properties.  */
+  save_insert_behind_hooks = interval_insert_behind_hooks;
+  save_insert_in_from_hooks = interval_insert_in_front_hooks;
+
   if (!NILP (combine_after_change_list))
     Fcombine_after_change_execute ();
 
@@ -2259,6 +2265,9 @@ signal_after_change (ptrdiff_t charpos, ptrdiff_t lendel, ptrdiff_t lenins)
       rvoe_arg.errorp = 0;
     }
 
+  interval_insert_behind_hooks = save_insert_behind_hooks;
+  interval_insert_in_front_hooks = save_insert_in_from_hooks;
+
   if (buffer_has_overlays ())
     report_overlay_modification (make_fixnum (charpos),
                                 make_fixnum (charpos + lenins),
index 44c333256a6af53f39b5c47cb3b6f1e612869cc9..d36b9e14a69689b3ae61f471f43bde366253f644 100644 (file)
@@ -58,9 +58,8 @@ enum property_set_type
 
 /* verify_interval_modification saves insertion hooks here
    to be run later by report_interval_modification.  */
-static Lisp_Object interval_insert_behind_hooks;
-static Lisp_Object interval_insert_in_front_hooks;
-
+Lisp_Object interval_insert_behind_hooks;
+Lisp_Object interval_insert_in_front_hooks;
 
 /* Signal a `text-read-only' error.  This function makes it easier
    to capture that error in GDB by putting a breakpoint on it.  */