From: Mattias EngdegÄrd Date: Fri, 4 Dec 2020 17:37:21 +0000 (+0100) Subject: Speed up match-substitute-replacement X-Git-Tag: emacs-28.0.90~4924 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=7bdc40e8d10488745355376981793a4d1e823f19;p=emacs.git Speed up match-substitute-replacement * 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. --- diff --git a/lisp/subr.el b/lisp/subr.el index 0b92a4f9b55..4b75268c04d 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -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)))) diff --git a/src/search.c b/src/search.c index 4eb634a3c03..50d82fd289d 100644 --- a/src/search.c +++ b/src/search.c @@ -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) { diff --git a/test/lisp/subr-tests.el b/test/lisp/subr-tests.el index 019441d9a39..e275e4b1c89 100644 --- a/test/lisp/subr-tests.el +++ b/test/lisp/subr-tests.el @@ -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 "<\\&>") + "")) + (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) + "")) + (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)