emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 53fb021: Better match-data handling in perform-repl


From: Juri Linkov
Subject: [Emacs-diffs] master 53fb021: Better match-data handling in perform-replace
Date: Thu, 11 Jul 2019 17:35:28 -0400 (EDT)

branch: master
commit 53fb021acc9cae6dcfc3cbe2004a070036e5c4e7
Author: Juri Linkov <address@hidden>
Commit: Juri Linkov <address@hidden>

    Better match-data handling in perform-replace
    
    * lisp/replace.el (perform-replace): Don't wrap replace-highlight
    in save-match-data.  Use `(nth 0 real-match-data)' instead of
    `(match-beginning 0)' after replace-highlight.  (Bug#36328)
---
 lisp/replace.el | 39 ++++++++++++++++++++-------------------
 1 file changed, 20 insertions(+), 19 deletions(-)

diff --git a/lisp/replace.el b/lisp/replace.el
index ab1ff32..7839bed 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -285,7 +285,7 @@ the original string if not."
              (string-match "\\(\\`\\|[^\\]\\)\\(\\\\\\\\\\)*\\\\[,#]" to)))
        (setq to (nreverse (delete "" (cons to list))))
        (replace-match-string-symbols to)
-       (cons 'replace-eval-replacement
+       (cons #'replace-eval-replacement
              (if (cdr to)
                  (cons 'concat to)
                (car to))))
@@ -543,7 +543,7 @@ for Lisp calls." "22.1"))
             (if (use-region-p) (region-beginning))
             (if (use-region-p) (region-end))
             (if (use-region-p) (region-noncontiguous-p))))))
-  (perform-replace regexp (cons 'replace-eval-replacement to-expr)
+  (perform-replace regexp (cons #'replace-eval-replacement to-expr)
                   t 'literal delimited nil nil start end nil 
region-noncontiguous-p))
 
 (defun map-query-replace-regexp (regexp to-strings &optional n start end 
region-noncontiguous-p)
@@ -2471,7 +2471,8 @@ characters."
             replacements     nil))
      ((stringp (car replacements)) ; If it isn't a string, it must be a cons
       (or repeat-count (setq repeat-count 1))
-      (setq replacements (cons 'replace-loop-through-replacements
+      ;; This is a hand-made `iterator'.
+      (setq replacements (cons #'replace-loop-through-replacements
                                (vector repeat-count repeat-count
                                        replacements replacements)))))
 
@@ -2578,14 +2579,10 @@ characters."
            (if (not query-flag)
                (progn
                  (unless (or literal noedit)
-                   (save-match-data
-                     ;; replace-highlight calls isearch-lazy-highlight-new-loop
-                     ;; and `sit-for' whose redisplay might clobber match data.
-                     ;; (Bug#36328)
-                     (replace-highlight
-                      (nth 0 real-match-data) (nth 1 real-match-data)
-                      start end search-string
-                      regexp-flag delimited-flag case-fold-search backward)))
+                   (replace-highlight
+                    (nth 0 real-match-data) (nth 1 real-match-data)
+                    start end search-string
+                    regexp-flag delimited-flag case-fold-search backward))
                  (setq noedit
                        (replace-match-maybe-edit
                         next-replacement nocasify literal
@@ -2600,27 +2597,31 @@ characters."
                ;; Commands not setting `done' need to adjust
                ;; `real-match-data'.
                (while (not done)
+                 ;; This sets match-data only for the next hook and
+                 ;; replace-highlight that calls `sit-for' from
+                 ;; isearch-lazy-highlight-new-loop whose redisplay
+                 ;; might clobber match-data. So subsequent code should
+                 ;; use only real-match-data, not match-data (bug#36328).
                  (set-match-data real-match-data)
                   (run-hooks 'replace-update-post-hook) ; Before 
`replace-highlight'.
-                 (save-match-data
-                   (replace-highlight
-                    (match-beginning 0) (match-end 0)
-                    start end search-string
-                    regexp-flag delimited-flag case-fold-search backward))
+                  (replace-highlight
+                  (match-beginning 0) (match-end 0)
+                  start end search-string
+                  regexp-flag delimited-flag case-fold-search backward)
                   ;; Obtain the matched groups: needed only when
                   ;; regexp-flag non nil.
                   (when (and last-was-undo regexp-flag)
                     (setq last-was-undo nil
                           real-match-data
                           (save-excursion
-                            (goto-char (match-beginning 0))
+                            (goto-char (nth 0 real-match-data))
                             (looking-at search-string)
                             (match-data t real-match-data))))
                   ;; Matched string and next-replacement-replaced
                   ;; stored in stack.
                   (setq search-string-replaced (buffer-substring-no-properties
-                                                (match-beginning 0)
-                                                (match-end 0))
+                                                (nth 0 real-match-data)
+                                                (nth 1 real-match-data))
                         next-replacement-replaced
                         (query-replace-descr
                          (save-match-data



reply via email to

[Prev in Thread] Current Thread [Next in Thread]