]> git.eshelyaron.com Git - emacs.git/commitdiff
Simplify copy_overlay.
authorDmitry Antipov <dmantipov@yandex.ru>
Tue, 24 Jul 2012 06:45:44 +0000 (10:45 +0400)
committerDmitry Antipov <dmantipov@yandex.ru>
Tue, 24 Jul 2012 06:45:44 +0000 (10:45 +0400)
* buffer.c (copy_overlay): Simplify, use build_marker.
* lisp.h (struct Lisp_Overlay): Restore comment with minor tweaks.

src/ChangeLog
src/buffer.c
src/lisp.h

index 40654e5a492c4ee40d4e7459d468d464e6c35cbf..833fd8cc3c48c32826e2105668225f517c274870 100644 (file)
@@ -1,3 +1,9 @@
+2012-07-24  Dmitry Antipov  <dmantipov@yandex.ru>
+
+       Simplify copy_overlay.
+       * buffer.c (copy_overlay): Simplify, use build_marker.
+       * lisp.h (struct Lisp_Overlay): Restore comment with minor tweaks.
+
 2012-07-23  Eli Zaretskii  <eliz@gnu.org>
 
        * print.c (print_object): Don't crash when a frame's name is nil
index 734ddb5a1c1b6162d75bb317b50d46140ec34ee9..c017db7b0349dca5c490d84bbfd30ac5fa3d3ad5 100644 (file)
@@ -410,32 +410,24 @@ even if it is dead.  The return value is never nil.  */)
 static struct Lisp_Overlay *
 copy_overlays (struct buffer *b, struct Lisp_Overlay *list)
 {
-  Lisp_Object buffer;
   struct Lisp_Overlay *result = NULL, *tail = NULL;
 
-  XSETBUFFER (buffer, b);
-
   for (; list; list = list->next)
     {
-      Lisp_Object overlay, start, end, old_overlay;
-      ptrdiff_t charpos;
-
-      XSETMISC (old_overlay, list);
-      charpos = marker_position (OVERLAY_START (old_overlay));
-      start = Fmake_marker ();
-      Fset_marker (start, make_number (charpos), buffer);
-      XMARKER (start)->insertion_type
-       = XMARKER (OVERLAY_START (old_overlay))->insertion_type;
+      Lisp_Object overlay, start, end;
+      struct Lisp_Marker *m;
 
-      charpos = marker_position (OVERLAY_END (old_overlay));
-      end = Fmake_marker ();
-      Fset_marker (end, make_number (charpos), buffer);
-      XMARKER (end)->insertion_type
-       = XMARKER (OVERLAY_END (old_overlay))->insertion_type;
+      eassert (MARKERP (list->start));
+      m = XMARKER (list->start);
+      start = build_marker (b, m->charpos, m->bytepos);
+      XMARKER (start)->insertion_type = m->insertion_type;
 
-      overlay = build_overlay
-       (start, end, Fcopy_sequence (OVERLAY_PLIST (old_overlay)));
+      eassert (MARKERP (list->end));
+      m = XMARKER (list->end);
+      end = build_marker (b, m->charpos, m->bytepos);
+      XMARKER (end)->insertion_type = m->insertion_type;
 
+      overlay = build_overlay (start, end, Fcopy_sequence (list->plist));
       if (tail)
        tail = tail->next = XOVERLAY (overlay);
       else
index e34a66af0c8d6ad1849bb5f49f88752f0a011070..7f6a2d72c89e388974fdc7073958dce9dd2a124c 100644 (file)
@@ -1286,6 +1286,17 @@ struct Lisp_Marker
 /* START and END are markers in the overlay's buffer, and
    PLIST is the overlay's property list.  */
 struct Lisp_Overlay
+/* An overlay's real data content is:
+   - plist
+   - buffer (really there are two buffer pointers, one per marker,
+     and both points to the same buffer)
+   - insertion type of both ends (per-marker fields)
+   - start & start byte (of start marker)
+   - end & end byte (of end marker)
+   - next (singly linked list of overlays)
+   - next fields of start and end markers (singly linked list of markers).
+   I.e. 9words plus 2 bits, 3words of which are for external linked lists.
+*/
   {
     ENUM_BF (Lisp_Misc_Type) type : 16;        /* = Lisp_Misc_Overlay */
     unsigned gcmarkbit : 1;