diff src/extents.c @ 5879:77d7b77909c2

Move extents.c to working in byte positions only; fix a bug, extent_detach() src/ChangeLog addition: 2015-03-27 Aidan Kehoe <kehoea@parhasard.net> Fix a small bug, extent_detach(); minimise needless char-byte conversion, extents.c, sticking to byte positions in general in this file. * extents.c: * extents.c (signal_single_extent_changed): Pass byte endpoints to gutter_extent_signal_changed_region_maybe(), buffer_extent_signal_changed_region(). * extents.c (extent_detach): Call signal_extent_changed() correctly, pass both extent endpoints rather than just the byte and character variants of the start. * extents.c (struct report_extent_modification_closure): Do this in terms of byte positions. * extents.c (report_extent_modification_mapper): Use byte positions, only converting to characters when we are definitely calling Lisp. * extents.c (report_extent_modification): Use byte positions in this API, move the byte-char conversion to our callers, simplifying extents.c (it all now works in byte positions). * extents.h: Update report_extent_modification's prototype. * gutter.c (gutter_extent_signal_changed_region_maybe): Use byte positions here, avoids needless byte-char conversion. * gutter.h: Update the prototype here. * insdel.c: * insdel.c (buffer_extent_signal_changed_region): Implement this in terms of byte positions. * insdel.c (signal_before_change): * insdel.c (signal_after_change): Call report_extent_modification() with byte positions, doing the char->byte conversion here rather than leaving it to extents.c. * insdel.h: * insdel.h (struct each_buffer_change_data): The extent unchanged info now describes bytecounts.
author Aidan Kehoe <kehoea@parhasard.net>
date Fri, 27 Mar 2015 23:39:49 +0000
parents 56144c8593a8
children
line wrap: on
line diff
--- a/src/extents.c	Thu Mar 26 20:47:12 2015 -0400
+++ b/src/extents.c	Fri Mar 27 23:39:49 2015 +0000
@@ -1473,8 +1473,8 @@
 	  if (!in_modeline_generation)
 	    MARK_EXTENTS_CHANGED;
 	  gutter_extent_signal_changed_region_maybe
-	    (object, extent_endpoint_char (extent, 0),
-	     extent_endpoint_char (extent, 1));
+            (object, extent_endpoint_byte (extent, 0),
+	     extent_endpoint_byte (extent, 1));
 	}
       else if (BUFFERP (object))
 	{
@@ -1486,8 +1486,8 @@
 	      EQ (property, Qinvisible))
 	    MARK_CLIP_CHANGED;
 	  buffer_extent_signal_changed_region
-	    (b, extent_endpoint_char (extent, 0),
-	     extent_endpoint_char (extent, 1));
+            (b, extent_endpoint_byte (extent, 0),
+	     extent_endpoint_byte (extent, 1));
 	}
     }
 
@@ -1696,10 +1696,8 @@
   el = extent_extent_list (extent);
 
   /* call this before messing with the extent. */
-  signal_extent_changed (extent, Qnil,
-			 extent_endpoint_byte (extent, 0),
-			 extent_endpoint_char (extent, 0),
-			 0);
+  signal_extent_changed (extent, Qnil, extent_endpoint_byte (extent, 0),
+			 extent_endpoint_byte (extent, 1), 0);
   extent_list_delete (el, extent);
   soe_delete (extent_object (extent), extent);
   set_extent_start (extent, -1);
@@ -4632,7 +4630,7 @@
 struct report_extent_modification_closure
 {
   Lisp_Object buffer;
-  Charxpos start, end;
+  Bytexpos start, end;
   int afterp;
   int speccount;
 };
@@ -4658,8 +4656,12 @@
     return 0;
 
   exobj = wrap_extent (extent);
-  startobj = make_fixnum (closure->start);
-  endobj = make_fixnum (closure->end);
+  startobj
+    = make_fixnum (buffer_or_string_bytexpos_to_charxpos
+                   (extent_object (extent), closure->start));
+  endobj
+    = make_fixnum (buffer_or_string_bytexpos_to_charxpos
+                   (extent_object (extent), closure->end));
 
   /* Now that we are sure to call elisp, set up an unwind-protect so
      inside_change_hook gets restored in case we throw.  Also record
@@ -4704,7 +4706,7 @@
 }
 
 void
-report_extent_modification (Lisp_Object buffer, Charbpos start, Charbpos end,
+report_extent_modification (Lisp_Object buffer, Bytexpos start, Bytexpos end,
 			    int afterp)
 {
   struct report_extent_modification_closure closure;
@@ -4715,10 +4717,8 @@
   closure.afterp = afterp;
   closure.speccount = -1;
 
-  map_extents (charbpos_to_bytebpos (XBUFFER (buffer), start),
-	       charbpos_to_bytebpos (XBUFFER (buffer), end),
-	       report_extent_modification_mapper, (void *)&closure,
-	       buffer, NULL, ME_MIGHT_CALL_ELISP);
+  map_extents (start, end, report_extent_modification_mapper,
+               (void *)&closure, buffer, NULL, ME_MIGHT_CALL_ELISP);
 }