diff options
Diffstat (limited to 'src/editfns.c')
| -rw-r--r-- | src/editfns.c | 27 |
1 files changed, 11 insertions, 16 deletions
diff --git a/src/editfns.c b/src/editfns.c index e672c0eb74d..3147f9d1466 100644 --- a/src/editfns.c +++ b/src/editfns.c | |||
| @@ -995,30 +995,24 @@ This function does not move point. */) | |||
| 995 | Qnil, Qt, Qnil); | 995 | Qnil, Qt, Qnil); |
| 996 | } | 996 | } |
| 997 | 997 | ||
| 998 | /* Save current buffer state for `save-excursion' special form. | 998 | /* Save current buffer state for save-excursion special form. */ |
| 999 | We (ab)use Lisp_Misc_Save_Value to allow explicit free and so | ||
| 1000 | offload some work from GC. */ | ||
| 1001 | 999 | ||
| 1002 | Lisp_Object | 1000 | void |
| 1003 | save_excursion_save (void) | 1001 | save_excursion_save (union specbinding *pdl) |
| 1004 | { | 1002 | { |
| 1005 | return make_save_obj_obj_obj_obj | 1003 | eassert (pdl->unwind_excursion.kind == SPECPDL_UNWIND_EXCURSION); |
| 1006 | (Fpoint_marker (), | 1004 | pdl->unwind_excursion.marker = Fpoint_marker (); |
| 1007 | Qnil, | 1005 | /* Selected window if current buffer is shown in it, nil otherwise. */ |
| 1008 | /* Selected window if current buffer is shown in it, nil otherwise. */ | 1006 | pdl->unwind_excursion.window |
| 1009 | (EQ (XWINDOW (selected_window)->contents, Fcurrent_buffer ()) | 1007 | = (EQ (XWINDOW (selected_window)->contents, Fcurrent_buffer ()) |
| 1010 | ? selected_window : Qnil), | 1008 | ? selected_window : Qnil); |
| 1011 | Qnil); | ||
| 1012 | } | 1009 | } |
| 1013 | 1010 | ||
| 1014 | /* Restore saved buffer before leaving `save-excursion' special form. */ | 1011 | /* Restore saved buffer before leaving `save-excursion' special form. */ |
| 1015 | 1012 | ||
| 1016 | void | 1013 | void |
| 1017 | save_excursion_restore (Lisp_Object info) | 1014 | save_excursion_restore (Lisp_Object marker, Lisp_Object window) |
| 1018 | { | 1015 | { |
| 1019 | Lisp_Object marker = XSAVE_OBJECT (info, 0); | ||
| 1020 | Lisp_Object window = XSAVE_OBJECT (info, 2); | ||
| 1021 | free_misc (info); | ||
| 1022 | Lisp_Object buffer = Fmarker_buffer (marker); | 1016 | Lisp_Object buffer = Fmarker_buffer (marker); |
| 1023 | /* If we're unwinding to top level, saved buffer may be deleted. This | 1017 | /* If we're unwinding to top level, saved buffer may be deleted. This |
| 1024 | means that all of its markers are unchained and so BUFFER is nil. */ | 1018 | means that all of its markers are unchained and so BUFFER is nil. */ |
| @@ -1027,6 +1021,7 @@ save_excursion_restore (Lisp_Object info) | |||
| 1027 | 1021 | ||
| 1028 | Fset_buffer (buffer); | 1022 | Fset_buffer (buffer); |
| 1029 | 1023 | ||
| 1024 | /* Point marker. */ | ||
| 1030 | Fgoto_char (marker); | 1025 | Fgoto_char (marker); |
| 1031 | unchain_marker (XMARKER (marker)); | 1026 | unchain_marker (XMARKER (marker)); |
| 1032 | 1027 | ||