]> git.eshelyaron.com Git - emacs.git/commitdiff
* search.c (compile_pattern): If a cache entry has a nil regexp, fill in that
authorKen Raeburn <raeburn@raeburn.org>
Thu, 3 Feb 2000 07:54:12 +0000 (07:54 +0000)
committerKen Raeburn <raeburn@raeburn.org>
Thu, 3 Feb 2000 07:54:12 +0000 (07:54 +0000)
entry instead of clobbering a previously cached string regexp.

src/ChangeLog
src/search.c

index f3b41fcf188b9b630fa4428d41c7d66db2bd91b0..5251578b7107ac9504982f416b3e94a09997c939 100644 (file)
@@ -1,3 +1,9 @@
+2000-02-03  Ken Raeburn  <raeburn@raeburn.org>
+
+       * search.c (compile_pattern): If a cache entry has a nil regexp,
+       fill in that entry instead of clobbering a previously cached
+       string regexp.
+
 2000-02-02  Ken Raeburn  <raeburn@raeburn.org>
 
        * puresize.h (BASE_PURESIZE): Increase to 610000.
index 5bcbaa615b30d399b88c16041f262c8d0d56ccd7..3111548af58f20d7e20b5faeb0626d2d78bd361a 100644 (file)
@@ -219,6 +219,13 @@ compile_pattern (pattern, regp, translate, posix, multibyte)
   for (cpp = &searchbuf_head; ; cpp = &cp->next)
     {
       cp = *cpp;
+      /* Entries are initialized to nil, and may be set to nil by
+        compile_pattern_1 if the pattern isn't valid.  Don't apply
+        XSTRING in those cases.  However, compile_pattern_1 is only
+        applied to the cache entry we pick here to reuse.  So nil
+        should never appear before a non-nil entry.  */
+      if (cp->regexp == Qnil)
+       goto compile_it;
       if (XSTRING (cp->regexp)->size == XSTRING (pattern)->size
          && !NILP (Fstring_equal (cp->regexp, pattern))
          && EQ (cp->buf.translate, (! NILP (translate) ? translate : make_number (0)))
@@ -226,9 +233,12 @@ compile_pattern (pattern, regp, translate, posix, multibyte)
          && cp->buf.multibyte == multibyte)
        break;
 
-      /* If we're at the end of the cache, compile into the last cell.  */
+      /* If we're at the end of the cache, compile into the nil cell
+        we found, or the last (least recently used) cell with a
+        string value.  */
       if (cp->next == 0)
        {
+       compile_it:
          compile_pattern_1 (cp, pattern, translate, regp, posix, multibyte);
          break;
        }