all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Pip Cet <pipcet@gmail.com>
To: Eli Zaretskii <eliz@gnu.org>
Cc: 36190@debbugs.gnu.org
Subject: bug#36190: 27.0.50; `put-text-property' etc. with buffer argument calls current buffer's `after-change-functions'
Date: Thu, 13 Jun 2019 21:37:40 +0000	[thread overview]
Message-ID: <CAOqdjBemrLfvNK_48wvLuP0hQH90p7LryrpiHjQ77z8SNMSLNQ@mail.gmail.com> (raw)
In-Reply-To: <CAOqdjBe-x3bQ0ZjjrOn9oYG2uJi9EAJD=VsXiQhAxtejVR_Ujg@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 103 bytes --]

Here's a simplified patch (I'm unsure about the right tab convention
to use; I hope I got this right).

[-- Attachment #2: 0001-Switch-to-correct-buffer-in-put-text-property-etc.patch --]
[-- Type: text/x-patch, Size: 8227 bytes --]

From 8664be1b0aa55731774fe2b010d8dd7259ca2d28 Mon Sep 17 00:00:00 2001
From: Pip Cet <pipcet@gmail.com>
Date: Thu, 13 Jun 2019 21:21:50 +0000
Subject: [PATCH] Switch to correct buffer in put-text-property etc.

* src/textprop.c (add_text_properties_1, set_text_properties)
(Fremove_text_properties, Fremove_list_of_text_properties):
use `signal_after_change_in_buffer'.

* src/insdel.c (signal_after_change_in_buffer): New function.
---
 src/insdel.c   | 19 +++++++++++++
 src/lisp.h     |  1 +
 src/textprop.c | 73 +++++++++++++++++++++++++++-----------------------
 3 files changed, 60 insertions(+), 33 deletions(-)

diff --git a/src/insdel.c b/src/insdel.c
index 85fffd8fd1..0552044447 100644
--- a/src/insdel.c
+++ b/src/insdel.c
@@ -2253,6 +2253,25 @@ signal_after_change (ptrdiff_t charpos, ptrdiff_t lendel, ptrdiff_t lenins)
   unbind_to (count, Qnil);
 }
 
+/* Signal a change immediately after it happens.
+   BUFFER is the buffer in which the change happened.
+   CHARPOS is the character position of the start of the changed text.
+   LENDEL is the number of characters of the text before the change.
+   (Not the whole buffer; just the part that was changed.)
+   LENINS is the number of characters in that part of the text
+   after the change.  */
+
+void
+signal_after_change_in_buffer (struct buffer *buffer, ptrdiff_t charpos, ptrdiff_t lendel, ptrdiff_t lenins)
+{
+  ptrdiff_t count = SPECPDL_INDEX ();
+
+  record_unwind_current_buffer ();
+  set_buffer_internal (buffer);
+  signal_after_change (charpos, lendel, lenins);
+  unbind_to (count, Qnil);
+}
+
 static void
 Fcombine_after_change_execute_1 (Lisp_Object val)
 {
diff --git a/src/lisp.h b/src/lisp.h
index 77fc22d118..4e05c9555b 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -3686,6 +3686,7 @@ #define CONS_TO_INTEGER(cons, type, var)				\
 extern void prepare_to_modify_buffer_1 (ptrdiff_t, ptrdiff_t, ptrdiff_t *);
 extern void invalidate_buffer_caches (struct buffer *, ptrdiff_t, ptrdiff_t);
 extern void signal_after_change (ptrdiff_t, ptrdiff_t, ptrdiff_t);
+extern void signal_after_change_in_buffer (struct buffer *, ptrdiff_t, ptrdiff_t, ptrdiff_t);
 extern void adjust_after_insert (ptrdiff_t, ptrdiff_t, ptrdiff_t,
 				 ptrdiff_t, ptrdiff_t);
 extern void adjust_markers_for_delete (ptrdiff_t, ptrdiff_t,
diff --git a/src/textprop.c b/src/textprop.c
index ae42c44185..1781440b10 100644
--- a/src/textprop.c
+++ b/src/textprop.c
@@ -1215,8 +1215,8 @@ add_text_properties_1 (Lisp_Object start, Lisp_Object end,
 	  if (interval_has_all_properties (properties, i))
 	    {
 	      if (BUFFERP (object))
-		signal_after_change (XFIXNUM (start), XFIXNUM (end) - XFIXNUM (start),
-				     XFIXNUM (end) - XFIXNUM (start));
+		signal_after_change_in_buffer (XBUFFER (object), XFIXNUM (start), XFIXNUM (end) - XFIXNUM (start),
+					       XFIXNUM (end) - XFIXNUM (start));
 
 	      eassert (modified);
 	      return Qt;
@@ -1226,8 +1226,8 @@ add_text_properties_1 (Lisp_Object start, Lisp_Object end,
 	    {
 	      add_properties (properties, i, object, set_type);
 	      if (BUFFERP (object))
-		signal_after_change (XFIXNUM (start), XFIXNUM (end) - XFIXNUM (start),
-				     XFIXNUM (end) - XFIXNUM (start));
+		signal_after_change_in_buffer (XBUFFER (object), XFIXNUM (start), XFIXNUM (end) - XFIXNUM (start),
+					       XFIXNUM (end) - XFIXNUM (start));
 	      return Qt;
 	    }
 
@@ -1237,8 +1237,8 @@ add_text_properties_1 (Lisp_Object start, Lisp_Object end,
 	  copy_properties (unchanged, i);
 	  add_properties (properties, i, object, set_type);
 	  if (BUFFERP (object))
-	    signal_after_change (XFIXNUM (start), XFIXNUM (end) - XFIXNUM (start),
-				 XFIXNUM (end) - XFIXNUM (start));
+	    signal_after_change_in_buffer (XBUFFER (object), XFIXNUM (start), XFIXNUM (end) - XFIXNUM (start),
+					   XFIXNUM (end) - XFIXNUM (start));
 	  return Qt;
 	}
 
@@ -1398,8 +1398,9 @@ set_text_properties (Lisp_Object start, Lisp_Object end, Lisp_Object properties,
   set_text_properties_1 (start, end, properties, object, i);
 
   if (BUFFERP (object) && !NILP (coherent_change_p))
-    signal_after_change (XFIXNUM (start), XFIXNUM (end) - XFIXNUM (start),
-			 XFIXNUM (end) - XFIXNUM (start));
+    signal_after_change_in_buffer (XBUFFER (object),
+				   XFIXNUM (start), XFIXNUM (end) - XFIXNUM (start),
+				   XFIXNUM (end) - XFIXNUM (start));
   return Qt;
 }
 
@@ -1565,8 +1566,9 @@ DEFUN ("remove-text-properties", Fremove_text_properties,
 	    {
 	      eassert (modified);
 	      if (BUFFERP (object))
-		signal_after_change (XFIXNUM (start), XFIXNUM (end) - XFIXNUM (start),
-				     XFIXNUM (end) - XFIXNUM (start));
+		signal_after_change_in_buffer (XBUFFER (object),
+					       XFIXNUM (start), XFIXNUM (end) - XFIXNUM (start),
+					       XFIXNUM (end) - XFIXNUM (start));
 	      return Qt;
 	    }
 
@@ -1574,8 +1576,9 @@ DEFUN ("remove-text-properties", Fremove_text_properties,
 	    {
 	      remove_properties (properties, Qnil, i, object);
 	      if (BUFFERP (object))
-		signal_after_change (XFIXNUM (start), XFIXNUM (end) - XFIXNUM (start),
-				     XFIXNUM (end) - XFIXNUM (start));
+		signal_after_change_in_buffer (XBUFFER (object),
+					       XFIXNUM (start), XFIXNUM (end) - XFIXNUM (start),
+					       XFIXNUM (end) - XFIXNUM (start));
 	      return Qt;
 	    }
 
@@ -1585,8 +1588,9 @@ DEFUN ("remove-text-properties", Fremove_text_properties,
 	  copy_properties (unchanged, i);
 	  remove_properties (properties, Qnil, i, object);
 	  if (BUFFERP (object))
-	    signal_after_change (XFIXNUM (start), XFIXNUM (end) - XFIXNUM (start),
-				 XFIXNUM (end) - XFIXNUM (start));
+	    signal_after_change_in_buffer (XBUFFER (object),
+					   XFIXNUM (start), XFIXNUM (end) - XFIXNUM (start),
+					   XFIXNUM (end) - XFIXNUM (start));
 	  return Qt;
 	}
 
@@ -1663,9 +1667,10 @@ DEFUN ("remove-list-of-text-properties", Fremove_list_of_text_properties,
 	      if (modified)
 		{
 		  if (BUFFERP (object))
-		    signal_after_change (XFIXNUM (start),
-					 XFIXNUM (end) - XFIXNUM (start),
-					 XFIXNUM (end) - XFIXNUM (start));
+		    signal_after_change_in_buffer (XBUFFER (object),
+						   XFIXNUM (start),
+						   XFIXNUM (end) - XFIXNUM (start),
+						   XFIXNUM (end) - XFIXNUM (start));
 		  return Qt;
 		}
 	      else
@@ -1677,8 +1682,9 @@ DEFUN ("remove-list-of-text-properties", Fremove_list_of_text_properties,
 		modify_text_properties (object, start, end);
 	      remove_properties (Qnil, properties, i, object);
 	      if (BUFFERP (object))
-		signal_after_change (XFIXNUM (start), XFIXNUM (end) - XFIXNUM (start),
-				     XFIXNUM (end) - XFIXNUM (start));
+		signal_after_change_in_buffer (XBUFFER (object),
+					       XFIXNUM (start), XFIXNUM (end) - XFIXNUM (start),
+					       XFIXNUM (end) - XFIXNUM (start));
 	      return Qt;
 	    }
 	  else
@@ -1690,8 +1696,9 @@ DEFUN ("remove-list-of-text-properties", Fremove_list_of_text_properties,
 		modify_text_properties (object, start, end);
 	      remove_properties (Qnil, properties, i, object);
 	      if (BUFFERP (object))
-		signal_after_change (XFIXNUM (start), XFIXNUM (end) - XFIXNUM (start),
-				     XFIXNUM (end) - XFIXNUM (start));
+		signal_after_change_in_buffer (XBUFFER (object),
+					       XFIXNUM (start), XFIXNUM (end) - XFIXNUM (start),
+					       XFIXNUM (end) - XFIXNUM (start));
 	      return Qt;
 	    }
 	}
@@ -1705,18 +1712,18 @@ DEFUN ("remove-list-of-text-properties", Fremove_list_of_text_properties,
       len -= LENGTH (i);
       i = next_interval (i);
       if (!i)
-        {
-          if (modified)
-            {
-              if (BUFFERP (object))
-                signal_after_change (XFIXNUM (start),
-                                     XFIXNUM (end) - XFIXNUM (start),
-                                     XFIXNUM (end) - XFIXNUM (start));
-              return Qt;
-            }
-          else
-            return Qnil;
-        }
+	{
+	  if (modified)
+	    {
+	      if (BUFFERP (object))
+		signal_after_change_in_buffer (XBUFFER (object), XFIXNUM (start),
+					       XFIXNUM (end) - XFIXNUM (start),
+					       XFIXNUM (end) - XFIXNUM (start));
+	      return Qt;
+	    }
+	  else
+	    return Qnil;
+	}
     }
 }
 \f
-- 
2.20.1


  reply	other threads:[~2019-06-13 21:37 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-13 13:48 bug#36190: 27.0.50; `put-text-property' etc. with buffer argument calls current buffer's `after-change-functions' Pip Cet
2019-06-13 16:36 ` Eli Zaretskii
2019-06-13 18:48   ` Pip Cet
2019-06-13 19:05     ` Eli Zaretskii
2019-06-13 19:27       ` Eli Zaretskii
2019-06-13 19:42       ` Pip Cet
2019-06-13 20:01         ` Eli Zaretskii
2019-06-13 20:57           ` Pip Cet
2019-06-13 21:37             ` Pip Cet [this message]
2019-06-14  7:41               ` Eli Zaretskii
2019-06-14 11:14                 ` Pip Cet
2019-06-14 12:10                   ` Eli Zaretskii
2019-06-15 15:14                     ` Pip Cet
2019-06-15 15:23                       ` Eli Zaretskii
2019-06-15 19:27                         ` Pip Cet
2019-07-06  8:08                           ` Eli Zaretskii
2019-07-06 15:27                             ` Pip Cet
2019-07-06 16:22                               ` Eli Zaretskii
2019-06-14  7:36             ` Eli Zaretskii
2019-06-17 11:38               ` Pip Cet
2019-06-17 15:59                 ` Eli Zaretskii
2019-06-18 17:14                   ` Pip Cet

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAOqdjBemrLfvNK_48wvLuP0hQH90p7LryrpiHjQ77z8SNMSLNQ@mail.gmail.com \
    --to=pipcet@gmail.com \
    --cc=36190@debbugs.gnu.org \
    --cc=eliz@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.