]> git.eshelyaron.com Git - emacs.git/commitdiff
Add tiny optimization for string-search
authorLars Ingebrigtsen <larsi@gnus.org>
Sat, 26 Sep 2020 22:35:11 +0000 (00:35 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Sat, 26 Sep 2020 22:35:11 +0000 (00:35 +0200)
* src/fns.c (Fstring_search): Add tiny optimization for needles
that are longer than the haystack (bug#43598).

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

index 2f64d955760d907e5c69d4331b94d5a8a6d2cd1b..2fcc282dcb319a159ea9ab1ba4de1b6aa01a5991 100644 (file)
--- a/src/fns.c
+++ b/src/fns.c
@@ -5468,6 +5468,7 @@ Case is always significant and text properties are ignored. */)
 {
   ptrdiff_t start_byte = 0, haybytes;
   char *res, *haystart;
+  EMACS_INT start = 0;
 
   CHECK_STRING (needle);
   CHECK_STRING (haystack);
@@ -5475,12 +5476,17 @@ Case is always significant and text properties are ignored. */)
   if (!NILP (start_pos))
     {
       CHECK_FIXNUM (start_pos);
-      EMACS_INT start = XFIXNUM (start_pos);
+      start = XFIXNUM (start_pos);
       if (start < 0 || start > SCHARS (haystack))
         xsignal1 (Qargs_out_of_range, start_pos);
       start_byte = string_char_to_byte (haystack, start);
     }
 
+  /* If NEEDLE is longer than (the remaining length of) haystack, then
+     we can't have a match, and return early.  */
+  if (SCHARS (needle) > SCHARS (haystack) - start)
+    return Qnil;
+
   haystart = SSDATA (haystack) + start_byte;
   haybytes = SBYTES (haystack) - start_byte;
 
index a3e9c426db5a4a4c6a8eeba6bc2d835b18ee6d4d..42dcf382e4040dbb15559021822604ac326262b1 100644 (file)
@@ -461,6 +461,9 @@ See https://debbugs.gnu.org/cgi/bugreport.cgi?bug=19350."
   (should (equal (string-replace "azot" "bar" "foozotbar")
                  "foozotbar"))
 
+  (should (equal (string-replace "fo" "bar" "lafofofozot")
+                 "labarbarbarzot"))
+
   (should (equal (string-replace "\377" "x" "a\377b")
                  "axb"))
   (should (equal (string-replace "\377" "x" "a\377ΓΈ")