diff options
author | Dmitry Antipov <dmantipov@yandex.ru> | 2013-01-15 12:38:07 +0400 |
---|---|---|
committer | Dmitry Antipov <dmantipov@yandex.ru> | 2013-01-15 12:38:07 +0400 |
commit | 1b971ac155006504b6b1c2688199747f976723af (patch) | |
tree | 0e5f4dc8243cec3591ce8ee659b5babc0a6639f9 /src/editfns.c | |
parent | cb9c0a53bc4a6d67f10d4674472b2884a71852c8 (diff) | |
download | emacs-1b971ac155006504b6b1c2688199747f976723af.tar.gz emacs-1b971ac155006504b6b1c2688199747f976723af.tar.bz2 emacs-1b971ac155006504b6b1c2688199747f976723af.zip |
Some convenient bits to deal with Lisp_Save_Values.
* lisp.h (XSAVE_OBJECT): New macro to extract saved objects.
(allocate_misc): Remove prototype.
(format_save_value): New prototype.
* alloc.c (allocate_misc): Revert back to static.
(format_save_value): New function to build Lisp_Save_Value
object with the specified internal structure.
(make_save_value): Reimplement using format_save_value.
* editfns.c (save_excursion_save): Use format_save_value.
(save_excursion_restore): Use XSAVE_OBJECT.
Diffstat (limited to 'src/editfns.c')
-rw-r--r-- | src/editfns.c | 51 |
1 files changed, 16 insertions, 35 deletions
diff --git a/src/editfns.c b/src/editfns.c index feac17f64b8..3fe085caac8 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -833,31 +833,17 @@ This function does not move point. */) Lisp_Object save_excursion_save (void) { - Lisp_Object save = allocate_misc (Lisp_Misc_Save_Value); - register struct Lisp_Save_Value *v = XSAVE_VALUE (save); - - /* Do not allocate extra space and pack everything in SAVE. */ - v->area = 0; - - v->type0 = SAVE_OBJECT; - v->data[0].object = Fpoint_marker (); - - /* Do not copy the mark if it points to nowhere. */ - v->type1 = SAVE_OBJECT; - v->data[1].object = (XMARKER (BVAR (current_buffer, mark))->buffer - ? Fcopy_marker (BVAR (current_buffer, mark), Qnil) - : Qnil); - - /* Selected window if current buffer is shown in it, nil otherwise. */ - v->type2 = SAVE_OBJECT; - v->data[2].object - = ((XBUFFER (XWINDOW (selected_window)->buffer) == current_buffer) - ? selected_window : Qnil); - - v->type3 = SAVE_OBJECT; - v->data[3].object = BVAR (current_buffer, mark_active); - - return save; + return format_save_value + ("oooo", + Fpoint_marker (), + /* Do not copy the mark if it points to nowhere. */ + (XMARKER (BVAR (current_buffer, mark))->buffer + ? Fcopy_marker (BVAR (current_buffer, mark), Qnil) + : Qnil), + /* Selected window if current buffer is shown in it, nil otherwise. */ + ((XBUFFER (XWINDOW (selected_window)->buffer) == current_buffer) + ? selected_window : Qnil), + BVAR (current_buffer, mark_active)); } /* Restore saved buffer before leaving `save-excursion' special form. */ @@ -867,13 +853,8 @@ save_excursion_restore (Lisp_Object info) { Lisp_Object tem, tem1, omark, nmark; struct gcpro gcpro1, gcpro2, gcpro3; - register struct Lisp_Save_Value *v = XSAVE_VALUE (info); - - /* Paranoid. */ - eassert (v->type0 == SAVE_OBJECT && v->type1 == SAVE_OBJECT - && v->type2 == SAVE_OBJECT && v->type3 == SAVE_OBJECT); - tem = Fmarker_buffer (v->data[0].object); + tem = Fmarker_buffer (XSAVE_OBJECT (info, 0)); /* If we're unwinding to top level, saved buffer may be deleted. This means that all of its markers are unchained and so tem is nil. */ if (NILP (tem)) @@ -885,12 +866,12 @@ save_excursion_restore (Lisp_Object info) Fset_buffer (tem); /* Point marker. */ - tem = v->data[0].object; + tem = XSAVE_OBJECT (info, 0); Fgoto_char (tem); unchain_marker (XMARKER (tem)); /* Mark marker. */ - tem = v->data[1].object; + tem = XSAVE_OBJECT (info, 1); omark = Fmarker_position (BVAR (current_buffer, mark)); if (NILP (tem)) unchain_marker (XMARKER (BVAR (current_buffer, mark))); @@ -902,7 +883,7 @@ save_excursion_restore (Lisp_Object info) } /* Mark active. */ - tem = v->data[3].object; + tem = XSAVE_OBJECT (info, 3); tem1 = BVAR (current_buffer, mark_active); bset_mark_active (current_buffer, tem); @@ -926,7 +907,7 @@ save_excursion_restore (Lisp_Object info) /* If buffer was visible in a window, and a different window was selected, and the old selected window is still showing this buffer, restore point in that window. */ - tem = v->data[2].object; + tem = XSAVE_OBJECT (info, 2); if (WINDOWP (tem) && !EQ (tem, selected_window) && (tem1 = XWINDOW (tem)->buffer, |