diff options
| author | Dmitry Antipov | 2012-07-27 06:47:07 +0400 |
|---|---|---|
| committer | Dmitry Antipov | 2012-07-27 06:47:07 +0400 |
| commit | 6195f3845db9aa785e644f55c86270788b293740 (patch) | |
| tree | 7c3d2d715fdf0edb4789e736d42ad3b893c73ef9 /src/alloc.c | |
| parent | 562157c814037dcba58a20cd6908a95992c22283 (diff) | |
| download | emacs-6195f3845db9aa785e644f55c86270788b293740.tar.gz emacs-6195f3845db9aa785e644f55c86270788b293740.zip | |
Fast save_excursion_save and save_excursion_restore.
* lisp.h (struct Lisp_Excursion): New data type.
(PVEC_EXCURSION): New pseudovector type.
(XEXCURSION, XSETEXCURSION, EXCURSIONP): Convenient macros
to deal with it. Adjust comments.
(init_marker, attach_marker): New prototype.
(unchain_marker): Adjust prototype.
* marker.c (attach_marker): Change to global.
(init_marker): New function.
* alloc.c (Fmake_marker, build_marker): Use it.
(build_marker): More easserts.
(mark_object): Handle struct Lisp_Excursion.
* editfns.c (save_excursion_save, save_excursion_restore):
Reimplement to use struct Lisp_Excursion. Add comments.
Diffstat (limited to 'src/alloc.c')
| -rw-r--r-- | src/alloc.c | 53 |
1 files changed, 29 insertions, 24 deletions
diff --git a/src/alloc.c b/src/alloc.c index ac6cb861c4d..5377b27e329 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -3653,17 +3653,10 @@ DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0, | |||
| 3653 | doc: /* Return a newly allocated marker which does not point at any place. */) | 3653 | doc: /* Return a newly allocated marker which does not point at any place. */) |
| 3654 | (void) | 3654 | (void) |
| 3655 | { | 3655 | { |
| 3656 | register Lisp_Object val; | 3656 | register Lisp_Object marker = allocate_misc (Lisp_Misc_Marker); |
| 3657 | register struct Lisp_Marker *p; | ||
| 3658 | 3657 | ||
| 3659 | val = allocate_misc (Lisp_Misc_Marker); | 3658 | init_marker (XMARKER (marker), NULL, 0, 0, 0); |
| 3660 | p = XMARKER (val); | 3659 | return marker; |
| 3661 | p->buffer = 0; | ||
| 3662 | p->bytepos = 0; | ||
| 3663 | p->charpos = 0; | ||
| 3664 | p->next = NULL; | ||
| 3665 | p->insertion_type = 0; | ||
| 3666 | return val; | ||
| 3667 | } | 3660 | } |
| 3668 | 3661 | ||
| 3669 | /* Return a newly allocated marker which points into BUF | 3662 | /* Return a newly allocated marker which points into BUF |
| @@ -3672,24 +3665,23 @@ DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0, | |||
| 3672 | Lisp_Object | 3665 | Lisp_Object |
| 3673 | build_marker (struct buffer *buf, ptrdiff_t charpos, ptrdiff_t bytepos) | 3666 | build_marker (struct buffer *buf, ptrdiff_t charpos, ptrdiff_t bytepos) |
| 3674 | { | 3667 | { |
| 3675 | Lisp_Object obj; | 3668 | register Lisp_Object marker = allocate_misc (Lisp_Misc_Marker); |
| 3676 | struct Lisp_Marker *m; | 3669 | |
| 3670 | /* Use Fmake_marker to create marker points to nowhere. */ | ||
| 3671 | eassert (buf != NULL); | ||
| 3677 | 3672 | ||
| 3678 | /* No dead buffers here. */ | 3673 | /* No dead buffers here. */ |
| 3679 | eassert (!NILP (BVAR (buf, name))); | 3674 | eassert (!NILP (BVAR (buf, name))); |
| 3680 | 3675 | ||
| 3681 | /* Every character is at least one byte. */ | 3676 | /* In a single-byte buffer, two positions must be equal. |
| 3682 | eassert (charpos <= bytepos); | 3677 | Otherwise, every character is at least one byte. */ |
| 3683 | 3678 | if (BUF_Z (buf) == BUF_Z_BYTE (buf)) | |
| 3684 | obj = allocate_misc (Lisp_Misc_Marker); | 3679 | eassert (charpos == bytepos); |
| 3685 | m = XMARKER (obj); | 3680 | else |
| 3686 | m->buffer = buf; | 3681 | eassert (charpos <= bytepos); |
| 3687 | m->charpos = charpos; | 3682 | |
| 3688 | m->bytepos = bytepos; | 3683 | init_marker (XMARKER (marker), buf, charpos, bytepos, 0); |
| 3689 | m->insertion_type = 0; | 3684 | return marker; |
| 3690 | m->next = BUF_MARKERS (buf); | ||
| 3691 | BUF_MARKERS (buf) = m; | ||
| 3692 | return obj; | ||
| 3693 | } | 3685 | } |
| 3694 | 3686 | ||
| 3695 | /* Put MARKER back on the free list after using it temporarily. */ | 3687 | /* Put MARKER back on the free list after using it temporarily. */ |
| @@ -6057,6 +6049,19 @@ mark_object (Lisp_Object arg) | |||
| 6057 | case PVEC_SUBR: | 6049 | case PVEC_SUBR: |
| 6058 | break; | 6050 | break; |
| 6059 | 6051 | ||
| 6052 | case PVEC_EXCURSION: | ||
| 6053 | { | ||
| 6054 | struct Lisp_Excursion *e = (struct Lisp_Excursion *) ptr; | ||
| 6055 | /* No Lisp_Objects but two special pointers to mark here. */ | ||
| 6056 | eassert (e->buffer != NULL); | ||
| 6057 | eassert (e->window != NULL); | ||
| 6058 | if (!VECTOR_MARKED_P (e->buffer)) | ||
| 6059 | mark_buffer (e->buffer); | ||
| 6060 | if (!VECTOR_MARKED_P (e->window)) | ||
| 6061 | mark_vectorlike ((struct Lisp_Vector *) e->window); | ||
| 6062 | } | ||
| 6063 | break; | ||
| 6064 | |||
| 6060 | case PVEC_FREE: | 6065 | case PVEC_FREE: |
| 6061 | abort (); | 6066 | abort (); |
| 6062 | 6067 | ||