aboutsummaryrefslogtreecommitdiffstats
path: root/src/editfns.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/editfns.c')
-rw-r--r--src/editfns.c53
1 files changed, 17 insertions, 36 deletions
diff --git a/src/editfns.c b/src/editfns.c
index feac17f64b8..8910b66e4d3 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -833,31 +833,17 @@ This function does not move point. */)
833Lisp_Object 833Lisp_Object
834save_excursion_save (void) 834save_excursion_save (void)
835{ 835{
836 Lisp_Object save = allocate_misc (Lisp_Misc_Save_Value); 836 return format_save_value
837 register struct Lisp_Save_Value *v = XSAVE_VALUE (save); 837 ("oooo",
838 838 Fpoint_marker (),
839 /* Do not allocate extra space and pack everything in SAVE. */ 839 /* Do not copy the mark if it points to nowhere. */
840 v->area = 0; 840 (XMARKER (BVAR (current_buffer, mark))->buffer
841 841 ? Fcopy_marker (BVAR (current_buffer, mark), Qnil)
842 v->type0 = SAVE_OBJECT; 842 : Qnil),
843 v->data[0].object = Fpoint_marker (); 843 /* Selected window if current buffer is shown in it, nil otherwise. */
844 844 ((XBUFFER (XWINDOW (selected_window)->buffer) == current_buffer)
845 /* Do not copy the mark if it points to nowhere. */ 845 ? selected_window : Qnil),
846 v->type1 = SAVE_OBJECT; 846 BVAR (current_buffer, mark_active));
847 v->data[1].object = (XMARKER (BVAR (current_buffer, mark))->buffer
848 ? Fcopy_marker (BVAR (current_buffer, mark), Qnil)
849 : Qnil);
850
851 /* Selected window if current buffer is shown in it, nil otherwise. */
852 v->type2 = SAVE_OBJECT;
853 v->data[2].object
854 = ((XBUFFER (XWINDOW (selected_window)->buffer) == current_buffer)
855 ? selected_window : Qnil);
856
857 v->type3 = SAVE_OBJECT;
858 v->data[3].object = BVAR (current_buffer, mark_active);
859
860 return save;
861} 847}
862 848
863/* Restore saved buffer before leaving `save-excursion' special form. */ 849/* Restore saved buffer before leaving `save-excursion' special form. */
@@ -867,13 +853,8 @@ save_excursion_restore (Lisp_Object info)
867{ 853{
868 Lisp_Object tem, tem1, omark, nmark; 854 Lisp_Object tem, tem1, omark, nmark;
869 struct gcpro gcpro1, gcpro2, gcpro3; 855 struct gcpro gcpro1, gcpro2, gcpro3;
870 register struct Lisp_Save_Value *v = XSAVE_VALUE (info);
871
872 /* Paranoid. */
873 eassert (v->type0 == SAVE_OBJECT && v->type1 == SAVE_OBJECT
874 && v->type2 == SAVE_OBJECT && v->type3 == SAVE_OBJECT);
875 856
876 tem = Fmarker_buffer (v->data[0].object); 857 tem = Fmarker_buffer (XSAVE_OBJECT (info, 0));
877 /* If we're unwinding to top level, saved buffer may be deleted. This 858 /* If we're unwinding to top level, saved buffer may be deleted. This
878 means that all of its markers are unchained and so tem is nil. */ 859 means that all of its markers are unchained and so tem is nil. */
879 if (NILP (tem)) 860 if (NILP (tem))
@@ -885,12 +866,12 @@ save_excursion_restore (Lisp_Object info)
885 Fset_buffer (tem); 866 Fset_buffer (tem);
886 867
887 /* Point marker. */ 868 /* Point marker. */
888 tem = v->data[0].object; 869 tem = XSAVE_OBJECT (info, 0);
889 Fgoto_char (tem); 870 Fgoto_char (tem);
890 unchain_marker (XMARKER (tem)); 871 unchain_marker (XMARKER (tem));
891 872
892 /* Mark marker. */ 873 /* Mark marker. */
893 tem = v->data[1].object; 874 tem = XSAVE_OBJECT (info, 1);
894 omark = Fmarker_position (BVAR (current_buffer, mark)); 875 omark = Fmarker_position (BVAR (current_buffer, mark));
895 if (NILP (tem)) 876 if (NILP (tem))
896 unchain_marker (XMARKER (BVAR (current_buffer, mark))); 877 unchain_marker (XMARKER (BVAR (current_buffer, mark)));
@@ -902,7 +883,7 @@ save_excursion_restore (Lisp_Object info)
902 } 883 }
903 884
904 /* Mark active. */ 885 /* Mark active. */
905 tem = v->data[3].object; 886 tem = XSAVE_OBJECT (info, 3);
906 tem1 = BVAR (current_buffer, mark_active); 887 tem1 = BVAR (current_buffer, mark_active);
907 bset_mark_active (current_buffer, tem); 888 bset_mark_active (current_buffer, tem);
908 889
@@ -926,7 +907,7 @@ save_excursion_restore (Lisp_Object info)
926 /* If buffer was visible in a window, and a different window was 907 /* If buffer was visible in a window, and a different window was
927 selected, and the old selected window is still showing this 908 selected, and the old selected window is still showing this
928 buffer, restore point in that window. */ 909 buffer, restore point in that window. */
929 tem = v->data[2].object; 910 tem = XSAVE_OBJECT (info, 2);
930 if (WINDOWP (tem) 911 if (WINDOWP (tem)
931 && !EQ (tem, selected_window) 912 && !EQ (tem, selected_window)
932 && (tem1 = XWINDOW (tem)->buffer, 913 && (tem1 = XWINDOW (tem)->buffer,
@@ -4273,7 +4254,7 @@ usage: (format STRING &rest OBJECTS) */)
4273 memcpy (buf, initial_buffer, used); 4254 memcpy (buf, initial_buffer, used);
4274 } 4255 }
4275 else 4256 else
4276 XSAVE_POINTER (buf_save_value) = buf = xrealloc (buf, bufsize); 4257 XSAVE_POINTER (buf_save_value, 0) = buf = xrealloc (buf, bufsize);
4277 4258
4278 p = buf + used; 4259 p = buf + used;
4279 } 4260 }