aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDmitry Antipov2012-07-06 11:34:37 +0400
committerDmitry Antipov2012-07-06 11:34:37 +0400
commit7b7ae96547e53a8ba059186fd0b3fd583e8d41cd (patch)
tree5b5bc00564e76ac9c278ac1978f655fca0d148b7 /src
parenta358bac20f90ddbcb46304c77322f07323b9b25d (diff)
downloademacs-7b7ae96547e53a8ba059186fd0b3fd583e8d41cd.tar.gz
emacs-7b7ae96547e53a8ba059186fd0b3fd583e8d41cd.zip
* buffer.c (unchain_overlay): Simplify. Add comment.
* marker.c (unchain_marker): Simplify. Fix comments.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog5
-rw-r--r--src/buffer.c15
-rw-r--r--src/marker.c80
3 files changed, 46 insertions, 54 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 460bdaa198c..72355fc682f 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,10 @@
12012-07-06 Dmitry Antipov <dmantipov@yandex.ru> 12012-07-06 Dmitry Antipov <dmantipov@yandex.ru>
2 2
3 * buffer.c (unchain_overlay): Simplify. Add comment.
4 * marker.c (unchain_marker): Simplify. Fix comments.
5
62012-07-06 Dmitry Antipov <dmantipov@yandex.ru>
7
3 Introduce fast path for the widely used marker operation. 8 Introduce fast path for the widely used marker operation.
4 * alloc.c (build_marker): New function. 9 * alloc.c (build_marker): New function.
5 * lisp.h (build_marker): New prototype. 10 * lisp.h (build_marker): New prototype.
diff --git a/src/buffer.c b/src/buffer.c
index a37a61c0fc8..a40270c945c 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -3672,18 +3672,17 @@ modify_overlay (struct buffer *buf, ptrdiff_t start, ptrdiff_t end)
3672 ++BUF_OVERLAY_MODIFF (buf); 3672 ++BUF_OVERLAY_MODIFF (buf);
3673} 3673}
3674 3674
3675 3675/* Remove OVERLAY from LIST. */
3676
3676static struct Lisp_Overlay * 3677static struct Lisp_Overlay *
3677unchain_overlay (struct Lisp_Overlay *list, struct Lisp_Overlay *overlay) 3678unchain_overlay (struct Lisp_Overlay *list, struct Lisp_Overlay *overlay)
3678{ 3679{
3679 struct Lisp_Overlay *tmp, *prev; 3680 register struct Lisp_Overlay *tail, **prev = &list;
3680 for (tmp = list, prev = NULL; tmp; prev = tmp, tmp = tmp->next) 3681
3681 if (tmp == overlay) 3682 for (tail = list; tail; prev = &tail->next, tail = *prev)
3683 if (tail == overlay)
3682 { 3684 {
3683 if (prev) 3685 *prev = overlay->next;
3684 prev->next = tmp->next;
3685 else
3686 list = tmp->next;
3687 overlay->next = NULL; 3686 overlay->next = NULL;
3688 break; 3687 break;
3689 } 3688 }
diff --git a/src/marker.c b/src/marker.c
index 3b0adc7de8d..0a1dd41b498 100644
--- a/src/marker.c
+++ b/src/marker.c
@@ -672,59 +672,47 @@ set_marker_restricted_both (Lisp_Object marker, Lisp_Object buffer, ptrdiff_t ch
672 return marker; 672 return marker;
673} 673}
674 674
675/* Remove MARKER from the chain of whatever buffer it is in. 675/* Remove MARKER from the chain of whatever buffer it is in,
676 Leave it "in no buffer". 676 leaving it points to nowhere. This is called during garbage
677 677 collection, so we must be careful to ignore and preserve
678 This is called during garbage collection, 678 mark bits, including those in chain fields of markers. */
679 so we must be careful to ignore and preserve mark bits,
680 including those in chain fields of markers. */
681 679
682void 680void
683unchain_marker (register struct Lisp_Marker *marker) 681unchain_marker (register struct Lisp_Marker *marker)
684{ 682{
685 register struct Lisp_Marker *tail, *prev, *next; 683 register struct buffer *b = marker->buffer;
686 register struct buffer *b;
687
688 b = marker->buffer;
689 if (b == 0)
690 return;
691
692 if (EQ (BVAR (b, name), Qnil))
693 abort ();
694 684
695 marker->buffer = 0; 685 if (b)
696
697 tail = BUF_MARKERS (b);
698 prev = NULL;
699 while (tail)
700 { 686 {
701 next = tail->next; 687 register struct Lisp_Marker *tail, **prev;
702 688
703 if (marker == tail) 689 /* No dead buffers here. */
704 { 690 eassert (!NILP (BVAR (b, name)));
705 if (!prev) 691
706 { 692 marker->buffer = NULL;
707 BUF_MARKERS (b) = next; 693 prev = &BUF_MARKERS (b);
708 /* Deleting first marker from the buffer's chain. Crash 694
709 if new first marker in chain does not say it belongs 695 for (tail = BUF_MARKERS (b); tail; prev = &tail->next, tail = *prev)
710 to the same buffer, or at least that they have the same 696 if (marker == tail)
711 base buffer. */ 697 {
712 if (next && b->text != next->buffer->text) 698 if (*prev == BUF_MARKERS (b))
713 abort (); 699 {
714 } 700 /* Deleting first marker from the buffer's chain. Crash
715 else 701 if new first marker in chain does not say it belongs
716 prev->next = next; 702 to the same buffer, or at least that they have the same
717 /* We have removed the marker from the chain; 703 base buffer. */
718 no need to scan the rest of the chain. */ 704 if (tail->next && b->text != tail->next->buffer->text)
719 return; 705 abort ();
720 } 706 }
721 else 707 *prev = tail->next;
722 prev = tail; 708 /* We have removed the marker from the chain;
723 tail = next; 709 no need to scan the rest of the chain. */
710 break;
711 }
712
713 /* Error if marker was not in it's chain. */
714 eassert (tail != NULL);
724 } 715 }
725
726 /* Marker was not in its chain. */
727 abort ();
728} 716}
729 717
730/* Return the char position of marker MARKER, as a C integer. */ 718/* Return the char position of marker MARKER, as a C integer. */