summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Antipov <dmantipov@yandex.ru>2012-07-24 10:45:44 +0400
committerDmitry Antipov <dmantipov@yandex.ru>2012-07-24 10:45:44 +0400
commitfa691a83f0f67db762d8d8d9d05d9ff97f25841f (patch)
treea66fd4ee200f1ff0213fa5bee3a544a146659014
parentec1b09b12339df0920e8901c6bd355a7afd2bc11 (diff)
downloademacs-fa691a83f0f67db762d8d8d9d05d9ff97f25841f.tar.gz
emacs-fa691a83f0f67db762d8d8d9d05d9ff97f25841f.tar.bz2
emacs-fa691a83f0f67db762d8d8d9d05d9ff97f25841f.zip
Simplify copy_overlay.
* buffer.c (copy_overlay): Simplify, use build_marker. * lisp.h (struct Lisp_Overlay): Restore comment with minor tweaks.
-rw-r--r--src/ChangeLog6
-rw-r--r--src/buffer.c30
-rw-r--r--src/lisp.h11
3 files changed, 28 insertions, 19 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 40654e5a492..833fd8cc3c4 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -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
diff --git a/src/buffer.c b/src/buffer.c
index 734ddb5a1c1..c017db7b034 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -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
diff --git a/src/lisp.h b/src/lisp.h
index e34a66af0c8..7f6a2d72c89 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -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;