summaryrefslogtreecommitdiff
path: root/src/editfns.c
diff options
context:
space:
mode:
authorDmitry Antipov <dmantipov@yandex.ru>2013-01-15 12:38:07 +0400
committerDmitry Antipov <dmantipov@yandex.ru>2013-01-15 12:38:07 +0400
commit1b971ac155006504b6b1c2688199747f976723af (patch)
tree0e5f4dc8243cec3591ce8ee659b5babc0a6639f9 /src/editfns.c
parentcb9c0a53bc4a6d67f10d4674472b2884a71852c8 (diff)
downloademacs-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.c51
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,