\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.
;; 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.