]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve save-match-data hygiene
authorMattias Engdegård <mattiase@acm.org>
Wed, 7 Sep 2022 15:55:44 +0000 (17:55 +0200)
committerMattias Engdegård <mattiase@acm.org>
Wed, 7 Sep 2022 16:02:26 +0000 (18:02 +0200)
* lisp/subr.el (save-match-data): Use uninterned variable symbol.
Remove outdated comments.

lisp/subr.el

index 03d678f20d7b53d013b6cecb2e19f03bf37b1ba9..c7b86c83e8ca0825c3450ac4bd39f76b08bfb00d 100644 (file)
@@ -4956,10 +4956,6 @@ If `default-directory' is already an existing directory, it's not changed."
 \f
 ;;; Matching and match data.
 
-;; We use save-match-data-internal as the local variable because
-;; that works ok in practice (people should not use that variable elsewhere).
-;; We used to use an uninterned symbol; the compiler handles that properly
-;; now, but it generates slower code.
 (defmacro save-match-data (&rest body)
   "Execute the BODY forms, restoring the global value of the match data.
 The value returned is the value of the last form in BODY.
@@ -4971,13 +4967,12 @@ rather than your caller's match data."
   ;; because that makes a bootstrapping problem
   ;; if you need to recompile all the Lisp files using interpreted code.
   (declare (indent 0) (debug t))
-  (list 'let
-       '((save-match-data-internal (match-data)))
-       (list 'unwind-protect
-             (cons 'progn body)
-             ;; It is safe to free (evaporate) markers immediately here,
-             ;; as Lisp programs should not copy from save-match-data-internal.
-             '(set-match-data save-match-data-internal 'evaporate))))
+  (let ((saved-match-data (make-symbol "saved-match-data")))
+    (list 'let
+         (list (list saved-match-data '(match-data)))
+         (list 'unwind-protect
+               (cons 'progn body)
+               (list 'set-match-data saved-match-data t)))))
 
 (defun match-string (num &optional string)
   "Return the string of text matched by the previous search or regexp operation.