aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
authorDmitry Antipov2012-07-27 06:47:07 +0400
committerDmitry Antipov2012-07-27 06:47:07 +0400
commit6195f3845db9aa785e644f55c86270788b293740 (patch)
tree7c3d2d715fdf0edb4789e736d42ad3b893c73ef9 /src/alloc.c
parent562157c814037dcba58a20cd6908a95992c22283 (diff)
downloademacs-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.c53
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,
3672Lisp_Object 3665Lisp_Object
3673build_marker (struct buffer *buf, ptrdiff_t charpos, ptrdiff_t bytepos) 3666build_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