aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.c
diff options
context:
space:
mode:
authorDmitry Antipov2012-07-06 09:07:44 +0400
committerDmitry Antipov2012-07-06 09:07:44 +0400
commit657924ff58fc22a6e57dc8366a20dadf97324c63 (patch)
tree94e256617a34f005119bcf7481bbbaa41c19a63f /src/buffer.c
parent6edc3d285d0495d69888018758371abfa4752327 (diff)
downloademacs-657924ff58fc22a6e57dc8366a20dadf97324c63.tar.gz
emacs-657924ff58fc22a6e57dc8366a20dadf97324c63.zip
Introduce fast path for the widely used marker operation.
* alloc.c (build_marker): New function. * lisp.h (build_marker): New prototype. * buffer.c (clone_per_buffer_values, Fmake_indirect_buffer): Use it. * composite.c (autocmp_chars): Likewise. * editfns.c (buildmark): Remove. (Fpoint_marker, Fpoint_min_marker, Fpoint_max_marker) (save_restriction_save): Use build_marker. * marker.c (buf_charpos_to_bytepos, buf_bytepos_to_charpos): Likewise. * window.c (save_window_save): Likewise.
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c35
1 files changed, 12 insertions, 23 deletions
diff --git a/src/buffer.c b/src/buffer.c
index f73d2d07537..a37a61c0fc8 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -458,11 +458,8 @@ copy_overlays (struct buffer *b, struct Lisp_Overlay *list)
458static void 458static void
459clone_per_buffer_values (struct buffer *from, struct buffer *to) 459clone_per_buffer_values (struct buffer *from, struct buffer *to)
460{ 460{
461 Lisp_Object to_buffer;
462 int offset; 461 int offset;
463 462
464 XSETBUFFER (to_buffer, to);
465
466 for_each_per_buffer_object_at (offset) 463 for_each_per_buffer_object_at (offset)
467 { 464 {
468 Lisp_Object obj; 465 Lisp_Object obj;
@@ -475,9 +472,9 @@ clone_per_buffer_values (struct buffer *from, struct buffer *to)
475 if (MARKERP (obj) && XMARKER (obj)->buffer == from) 472 if (MARKERP (obj) && XMARKER (obj)->buffer == from)
476 { 473 {
477 struct Lisp_Marker *m = XMARKER (obj); 474 struct Lisp_Marker *m = XMARKER (obj);
478 obj = Fmake_marker (); 475
476 obj = build_marker (to, m->charpos, m->bytepos);
479 XMARKER (obj)->insertion_type = m->insertion_type; 477 XMARKER (obj)->insertion_type = m->insertion_type;
480 set_marker_both (obj, to_buffer, m->charpos, m->bytepos);
481 } 478 }
482 479
483 PER_BUFFER_VALUE (to, offset) = obj; 480 PER_BUFFER_VALUE (to, offset) = obj;
@@ -615,32 +612,24 @@ CLONE nil means the indirect buffer's state is reset to default values. */)
615 eassert (NILP (BVAR (b->base_buffer, begv_marker))); 612 eassert (NILP (BVAR (b->base_buffer, begv_marker)));
616 eassert (NILP (BVAR (b->base_buffer, zv_marker))); 613 eassert (NILP (BVAR (b->base_buffer, zv_marker)));
617 614
618 BVAR (b->base_buffer, pt_marker) = Fmake_marker (); 615 BVAR (b->base_buffer, pt_marker)
619 set_marker_both (BVAR (b->base_buffer, pt_marker), base_buffer, 616 = build_marker (b->base_buffer, b->base_buffer->pt, b->base_buffer->pt_byte);
620 b->base_buffer->pt, 617
621 b->base_buffer->pt_byte); 618 BVAR (b->base_buffer, begv_marker)
619 = build_marker (b->base_buffer, b->base_buffer->begv, b->base_buffer->begv_byte);
622 620
623 BVAR (b->base_buffer, begv_marker) = Fmake_marker (); 621 BVAR (b->base_buffer, zv_marker)
624 set_marker_both (BVAR (b->base_buffer, begv_marker), base_buffer, 622 = build_marker (b->base_buffer, b->base_buffer->zv, b->base_buffer->zv_byte);
625 b->base_buffer->begv,
626 b->base_buffer->begv_byte);
627 623
628 BVAR (b->base_buffer, zv_marker) = Fmake_marker ();
629 set_marker_both (BVAR (b->base_buffer, zv_marker), base_buffer,
630 b->base_buffer->zv,
631 b->base_buffer->zv_byte);
632 XMARKER (BVAR (b->base_buffer, zv_marker))->insertion_type = 1; 624 XMARKER (BVAR (b->base_buffer, zv_marker))->insertion_type = 1;
633 } 625 }
634 626
635 if (NILP (clone)) 627 if (NILP (clone))
636 { 628 {
637 /* Give the indirect buffer markers for its narrowing. */ 629 /* Give the indirect buffer markers for its narrowing. */
638 BVAR (b, pt_marker) = Fmake_marker (); 630 BVAR (b, pt_marker) = build_marker (b, b->pt, b->pt_byte);
639 set_marker_both (BVAR (b, pt_marker), buf, b->pt, b->pt_byte); 631 BVAR (b, begv_marker) = build_marker (b, b->begv, b->begv_byte);
640 BVAR (b, begv_marker) = Fmake_marker (); 632 BVAR (b, zv_marker) = build_marker (b, b->zv, b->zv_byte);
641 set_marker_both (BVAR (b, begv_marker), buf, b->begv, b->begv_byte);
642 BVAR (b, zv_marker) = Fmake_marker ();
643 set_marker_both (BVAR (b, zv_marker), buf, b->zv, b->zv_byte);
644 XMARKER (BVAR (b, zv_marker))->insertion_type = 1; 633 XMARKER (BVAR (b, zv_marker))->insertion_type = 1;
645 } 634 }
646 else 635 else