summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMattias EngdegÄrd <mattiase@acm.org>2019-03-19 13:06:20 +0100
committerMattias EngdegÄrd <mattiase@acm.org>2019-03-30 11:48:25 +0100
commit75ec1b1952633019f5afaf24dd87e7e4f7d31f9c (patch)
tree2e59acb674e825b2176709551123b46ee15fdef9
parent9c0fa1172fd987a8f23b115145270383a11c12fc (diff)
downloademacs-75ec1b1952633019f5afaf24dd87e7e4f7d31f9c.tar.gz
Fix spurious regexp reentrancy error
* src/search.c (compile_pattern): Don't give up if the last regexp cache entry is busy. Instead, use the last (least recently used) non-busy entry, and only signal a reentrancy error if there is no free entry at all (Bug#34910).
-rw-r--r--src/search.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/search.c b/src/search.c
index e15e2b94e5f..07ff0e47643 100644
--- a/src/search.c
+++ b/src/search.c
@@ -198,11 +198,13 @@ static struct regexp_cache *
compile_pattern (Lisp_Object pattern, struct re_registers *regp,
Lisp_Object translate, bool posix, bool multibyte)
{
- struct regexp_cache *cp, **cpp;
+ struct regexp_cache *cp, **cpp, **lru_nonbusy;
- for (cpp = &searchbuf_head; ; cpp = &cp->next)
+ for (cpp = &searchbuf_head, lru_nonbusy = NULL; ; cpp = &cp->next)
{
cp = *cpp;
+ if (!cp->busy)
+ lru_nonbusy = 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
string accessors in those cases. However, compile_pattern_1
@@ -222,13 +224,14 @@ compile_pattern (Lisp_Object pattern, struct re_registers *regp,
&& cp->buf.charset_unibyte == charset_unibyte)
break;
- /* 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 we're at the end of the cache, compile into the last
+ (least recently used) non-busy cell in the cache. */
if (cp->next == 0)
{
- if (cp->busy)
+ if (!lru_nonbusy)
error ("Too much matching reentrancy");
+ cpp = lru_nonbusy;
+ cp = *cpp;
compile_it:
eassert (!cp->busy);
compile_pattern_1 (cp, pattern, translate, posix);