aboutsummaryrefslogtreecommitdiffstats
path: root/src/editfns.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/editfns.c')
-rw-r--r--src/editfns.c51
1 files changed, 33 insertions, 18 deletions
diff --git a/src/editfns.c b/src/editfns.c
index bf19acb42a8..feac17f64b8 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -833,20 +833,30 @@ This function does not move point. */)
833Lisp_Object 833Lisp_Object
834save_excursion_save (void) 834save_excursion_save (void)
835{ 835{
836 Lisp_Object save, *data = xmalloc (word_size * 4); 836 Lisp_Object save = allocate_misc (Lisp_Misc_Save_Value);
837 register struct Lisp_Save_Value *v = XSAVE_VALUE (save);
838
839 /* Do not allocate extra space and pack everything in SAVE. */
840 v->area = 0;
841
842 v->type0 = SAVE_OBJECT;
843 v->data[0].object = Fpoint_marker ();
837 844
838 data[0] = Fpoint_marker ();
839 /* Do not copy the mark if it points to nowhere. */ 845 /* Do not copy the mark if it points to nowhere. */
840 data[1] = (XMARKER (BVAR (current_buffer, mark))->buffer 846 v->type1 = SAVE_OBJECT;
841 ? Fcopy_marker (BVAR (current_buffer, mark), Qnil) 847 v->data[1].object = (XMARKER (BVAR (current_buffer, mark))->buffer
842 : Qnil); 848 ? Fcopy_marker (BVAR (current_buffer, mark), Qnil)
849 : Qnil);
850
843 /* Selected window if current buffer is shown in it, nil otherwise. */ 851 /* Selected window if current buffer is shown in it, nil otherwise. */
844 data[2] = ((XBUFFER (XWINDOW (selected_window)->buffer) == current_buffer) 852 v->type2 = SAVE_OBJECT;
845 ? selected_window : Qnil); 853 v->data[2].object
846 data[3] = BVAR (current_buffer, mark_active); 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);
847 859
848 save = make_save_value (data, 4);
849 XSAVE_VALUE (save)->dogc = 1;
850 return save; 860 return save;
851} 861}
852 862
@@ -855,10 +865,15 @@ save_excursion_save (void)
855Lisp_Object 865Lisp_Object
856save_excursion_restore (Lisp_Object info) 866save_excursion_restore (Lisp_Object info)
857{ 867{
858 Lisp_Object tem, tem1, omark, nmark, *data = XSAVE_VALUE (info)->pointer; 868 Lisp_Object tem, tem1, omark, nmark;
859 struct gcpro gcpro1, gcpro2, gcpro3; 869 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);
860 875
861 tem = Fmarker_buffer (data[0]); 876 tem = Fmarker_buffer (v->data[0].object);
862 /* If we're unwinding to top level, saved buffer may be deleted. This 877 /* If we're unwinding to top level, saved buffer may be deleted. This
863 means that all of its markers are unchained and so tem is nil. */ 878 means that all of its markers are unchained and so tem is nil. */
864 if (NILP (tem)) 879 if (NILP (tem))
@@ -870,12 +885,12 @@ save_excursion_restore (Lisp_Object info)
870 Fset_buffer (tem); 885 Fset_buffer (tem);
871 886
872 /* Point marker. */ 887 /* Point marker. */
873 tem = data[0]; 888 tem = v->data[0].object;
874 Fgoto_char (tem); 889 Fgoto_char (tem);
875 unchain_marker (XMARKER (tem)); 890 unchain_marker (XMARKER (tem));
876 891
877 /* Mark marker. */ 892 /* Mark marker. */
878 tem = data[1]; 893 tem = v->data[1].object;
879 omark = Fmarker_position (BVAR (current_buffer, mark)); 894 omark = Fmarker_position (BVAR (current_buffer, mark));
880 if (NILP (tem)) 895 if (NILP (tem))
881 unchain_marker (XMARKER (BVAR (current_buffer, mark))); 896 unchain_marker (XMARKER (BVAR (current_buffer, mark)));
@@ -887,7 +902,7 @@ save_excursion_restore (Lisp_Object info)
887 } 902 }
888 903
889 /* Mark active. */ 904 /* Mark active. */
890 tem = data[3]; 905 tem = v->data[3].object;
891 tem1 = BVAR (current_buffer, mark_active); 906 tem1 = BVAR (current_buffer, mark_active);
892 bset_mark_active (current_buffer, tem); 907 bset_mark_active (current_buffer, tem);
893 908
@@ -911,7 +926,7 @@ save_excursion_restore (Lisp_Object info)
911 /* If buffer was visible in a window, and a different window was 926 /* If buffer was visible in a window, and a different window was
912 selected, and the old selected window is still showing this 927 selected, and the old selected window is still showing this
913 buffer, restore point in that window. */ 928 buffer, restore point in that window. */
914 tem = data[2]; 929 tem = v->data[2].object;
915 if (WINDOWP (tem) 930 if (WINDOWP (tem)
916 && !EQ (tem, selected_window) 931 && !EQ (tem, selected_window)
917 && (tem1 = XWINDOW (tem)->buffer, 932 && (tem1 = XWINDOW (tem)->buffer,
@@ -925,7 +940,7 @@ save_excursion_restore (Lisp_Object info)
925 940
926 out: 941 out:
927 942
928 free_save_value (info); 943 free_misc (info);
929 return Qnil; 944 return Qnil;
930} 945}
931 946
@@ -4258,7 +4273,7 @@ usage: (format STRING &rest OBJECTS) */)
4258 memcpy (buf, initial_buffer, used); 4273 memcpy (buf, initial_buffer, used);
4259 } 4274 }
4260 else 4275 else
4261 XSAVE_VALUE (buf_save_value)->pointer = buf = xrealloc (buf, bufsize); 4276 XSAVE_POINTER (buf_save_value) = buf = xrealloc (buf, bufsize);
4262 4277
4263 p = buf + used; 4278 p = buf + used;
4264 } 4279 }