# HG changeset patch # User Ken Raeburn # Date 949564452 0 # Node ID 5cd59d1800addb3150050fa65654378a940b7170 # Parent 459744c91b53274429cc79f5e0d8ba97668bb915 * search.c (compile_pattern): If a cache entry has a nil regexp, fill in that entry instead of clobbering a previously cached string regexp. diff -r 459744c91b53 -r 5cd59d1800ad src/ChangeLog Binary file src/ChangeLog has changed diff -r 459744c91b53 -r 5cd59d1800ad src/search.c --- a/src/search.c Wed Feb 02 21:06:43 2000 +0000 +++ b/src/search.c Thu Feb 03 07:54:12 2000 +0000 @@ -219,6 +219,13 @@ 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 @@ && 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; }