diff options
Diffstat (limited to 'src/editfns.c')
| -rw-r--r-- | src/editfns.c | 53 |
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. */) | |||
| 833 | Lisp_Object | 833 | Lisp_Object |
| 834 | save_excursion_save (void) | 834 | save_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 | } |