]> git.eshelyaron.com Git - emacs.git/commitdiff
Speed up match-substitute-replacement
authorMattias Engdegård <mattiase@acm.org>
Fri, 4 Dec 2020 17:37:21 +0000 (18:37 +0100)
committerMattias Engdegård <mattiase@acm.org>
Fri, 4 Dec 2020 17:39:13 +0000 (18:39 +0100)
* lisp/subr.el (match-substitute-replacement): Use match-data--translate.
* src/search.c (Fmatch_data__translate): Remove string restriction.
* test/lisp/subr-tests.el (subr-match-substitute-replacement): New test.

lisp/subr.el
src/search.c
test/lisp/subr-tests.el

index 0b92a4f9b554c64deab4d0e23c3f0fea019dd983..4b75268c04d636f4146d6fe32c2afd945f2d1b13 100644 (file)
@@ -4259,11 +4259,7 @@ Optional FIXEDCASE, LITERAL, STRING and SUBEXP have the same
 meaning as for `replace-match'."
   (let ((match (match-string 0 string)))
     (save-match-data
-      (set-match-data (mapcar (lambda (x)
-                               (if (numberp x)
-                                   (- x (match-beginning 0))
-                                 x))
-                             (match-data t)))
+      (match-data--translate (- (match-beginning 0)))
       (replace-match replacement fixedcase literal match subexp))))
 
 
index 4eb634a3c03567713181a1128e52fa703548b8de..50d82fd289d24671203f1965fb88e80056311676 100644 (file)
@@ -3033,12 +3033,12 @@ If optional arg RESEAT is non-nil, make markers on LIST point nowhere.  */)
 
 DEFUN ("match-data--translate", Fmatch_data__translate, Smatch_data__translate,
        1, 1, 0,
-       doc: /* Add N to all string positions in the match data.  Internal.  */)
+       doc: /* Add N to all positions in the match data.  Internal.  */)
   (Lisp_Object n)
 {
   CHECK_FIXNUM (n);
   EMACS_INT delta = XFIXNUM (n);
-  if (EQ (last_thing_searched, Qt))   /* String match data only.  */
+  if (!NILP (last_thing_searched))
     for (ptrdiff_t i = 0; i < search_regs.num_regs; i++)
       if (search_regs.start[i] >= 0)
         {
index 019441d9a3938b25114020d5d77119e784e0a92d..e275e4b1c894ed74df23411507345082ab0b420b 100644 (file)
@@ -551,6 +551,30 @@ See https://debbugs.gnu.org/cgi/bugreport.cgi?bug=19350."
   (should (equal (replace-regexp-in-string "\\`\\|x" "z" "--xx--")
                  "z--zz--")))
 
+(ert-deftest subr-match-substitute-replacement ()
+  (with-temp-buffer
+    (insert "Alpha Beta Gamma Delta Epsilon")
+    (goto-char (point-min))
+    (re-search-forward "B\\(..\\)a")
+    (should (equal (match-substitute-replacement "carrot")
+                   "Carrot"))
+    (should (equal (match-substitute-replacement "<\\&>")
+                   "<Beta>"))
+    (should (equal (match-substitute-replacement "m\\1a")
+                   "Meta"))
+    (should (equal (match-substitute-replacement "ernin" nil nil nil 1)
+                   "Bernina")))
+  (let ((s "Tau Beta Gamma Delta Epsilon"))
+    (string-match "B\\(..\\)a" s)
+    (should (equal (match-substitute-replacement "carrot" nil nil s)
+                   "Carrot"))
+    (should (equal (match-substitute-replacement "<\\&>" nil nil s)
+                   "<Beta>"))
+    (should (equal (match-substitute-replacement "m\\1a" nil nil s)
+                   "Meta"))
+    (should (equal (match-substitute-replacement "ernin" nil nil s 1)
+                   "Bernina"))))
+
 (ert-deftest subr-tests--change-group-33341 ()
   (with-temp-buffer
     (buffer-enable-undo)