From b51d6c92fd5567e37d43f4ccd9a575c48d9ebbb3 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 16 Nov 2007 22:16:01 +0000 Subject: [PATCH] (Fset_match_data): Remove the `evaporate' feature. (unwind_set_match_data): Don't use the `evaporate' feature. --- src/ChangeLog | 9 +++++++-- src/search.c | 28 +++++++++++++--------------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index e620d1e9e9..0fb4f189fb 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,7 +1,12 @@ +2007-11-16 Stefan Monnier + + * search.c (Fset_match_data): Remove the `evaporate' feature. + (unwind_set_match_data): Don't use the `evaporate' feature. + 2007-11-15 Andreas Schwab - * editfns.c (Fformat): Correctly format EMACS_INT values. Also - take precision into account when formatting an integer. + * editfns.c (Fformat): Correctly format EMACS_INT values. + Also take precision into account when formatting an integer. 2007-11-15 Juanma Barranquero diff --git a/src/search.c b/src/search.c index 3a9fabeb3c..ad4fbc4546 100644 --- a/src/search.c +++ b/src/search.c @@ -2892,11 +2892,15 @@ Return value is undefined if the last search failed. */) return reuse; } -/* Internal usage only: - If RESEAT is `evaporate', put the markers back on the free list - immediately. No other references to the markers must exist in this case, - so it is used only internally on the unwind stack and save-match-data from - Lisp. */ +/* We used to have an internal use variant of `reseat' described as: + + If RESEAT is `evaporate', put the markers back on the free list + immediately. No other references to the markers must exist in this + case, so it is used only internally on the unwind stack and + save-match-data from Lisp. + + But it was ill-conceived: those supposedly-internal markers get exposed via + the undo-list, so freeing them here is unsafe. */ DEFUN ("set-match-data", Fset_match_data, Sset_match_data, 1, 2, 0, doc: /* Set internal data on last search match from elements of LIST. @@ -2981,10 +2985,7 @@ If optional arg RESEAT is non-nil, make markers on LIST point nowhere. */) if (!NILP (reseat) && MARKERP (m)) { - if (EQ (reseat, Qevaporate)) - free_marker (m); - else - unchain_marker (XMARKER (m)); + unchain_marker (XMARKER (m)); XSETCAR (list, Qnil); } @@ -3002,10 +3003,7 @@ If optional arg RESEAT is non-nil, make markers on LIST point nowhere. */) if (!NILP (reseat) && MARKERP (m)) { - if (EQ (reseat, Qevaporate)) - free_marker (m); - else - unchain_marker (XMARKER (m)); + unchain_marker (XMARKER (m)); XSETCAR (list, Qnil); } } @@ -3069,8 +3067,8 @@ static Lisp_Object unwind_set_match_data (list) Lisp_Object list; { - /* It is safe to free (evaporate) the markers immediately. */ - return Fset_match_data (list, Qevaporate); + /* It is NOT ALWAYS safe to free (evaporate) the markers immediately. */ + return Fset_match_data (list, Qt); } /* Called to unwind protect the match data. */ -- 2.20.1