diff options
| author | Dmitry Antipov | 2012-07-06 09:07:44 +0400 |
|---|---|---|
| committer | Dmitry Antipov | 2012-07-06 09:07:44 +0400 |
| commit | 657924ff58fc22a6e57dc8366a20dadf97324c63 (patch) | |
| tree | 94e256617a34f005119bcf7481bbbaa41c19a63f /src/buffer.c | |
| parent | 6edc3d285d0495d69888018758371abfa4752327 (diff) | |
| download | emacs-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.c | 35 |
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) | |||
| 458 | static void | 458 | static void |
| 459 | clone_per_buffer_values (struct buffer *from, struct buffer *to) | 459 | clone_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 |