changeset 73002:b3a72607819d

* search.c (struct regexp_cache): New entry syntax_table. (compile_pattern_1): Set it. (syms_of_search): Initialize it. (compile_pattern): Require the syntax_table entry of the cache element to match the current syntax table entry.
author Chong Yidong <cyd@stupidchicken.com>
date Tue, 19 Sep 2006 21:44:52 +0000
parents 2b055f644b75
children ec72ab6f5541
files src/ChangeLog src/search.c
diffstat 2 files changed, 18 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Tue Sep 19 21:36:44 2006 +0000
+++ b/src/ChangeLog	Tue Sep 19 21:44:52 2006 +0000
@@ -1,3 +1,11 @@
+2006-09-19  Chong Yidong  <cyd@stupidchicken.com>
+
+	* search.c (struct regexp_cache): New entry syntax_table.
+	(compile_pattern_1): Set it.
+	(syms_of_search): Initialize it.
+	(compile_pattern): Require the syntax_table entry of the cache
+	element to match the current syntax table entry.
+
 2006-09-19  Stefan Monnier  <monnier@iro.umontreal.ca>
 
 	* window.c (Fwindow_end): Fix recent change.
--- a/src/search.c	Tue Sep 19 21:36:44 2006 +0000
+++ b/src/search.c	Tue Sep 19 21:44:52 2006 +0000
@@ -42,6 +42,9 @@
 {
   struct regexp_cache *next;
   Lisp_Object regexp, whitespace_regexp;
+  /* Syntax table for which the regexp applies.  We need this because
+     of character classes.  */
+  Lisp_Object syntax_table;
   struct re_pattern_buffer buf;
   char fastmap[0400];
   /* Nonzero means regexp was compiled to do full POSIX backtracking.  */
@@ -167,6 +170,7 @@
   cp->posix = posix;
   cp->buf.multibyte = multibyte;
   cp->whitespace_regexp = Vsearch_spaces_regexp;
+  cp->syntax_table = current_buffer->syntax_table;
   /* Doing BLOCK_INPUT here has the effect that
      the debugger won't run if an error occurs.
      Why is BLOCK_INPUT needed here?  */
@@ -256,6 +260,10 @@
 	  && EQ (cp->buf.translate, (! NILP (translate) ? translate : make_number (0)))
 	  && cp->posix == posix
 	  && cp->buf.multibyte == multibyte
+	  /* TODO: Strictly speaking, we only need to match syntax
+	     tables when a character class like [[:space:]] occurs in
+	     the pattern. -- cyd*/
+	  && EQ (cp->syntax_table, current_buffer->syntax_table)
 	  && !NILP (Fequal (cp->whitespace_regexp, Vsearch_spaces_regexp)))
 	break;
 
@@ -3114,8 +3122,10 @@
       searchbufs[i].buf.fastmap = searchbufs[i].fastmap;
       searchbufs[i].regexp = Qnil;
       searchbufs[i].whitespace_regexp = Qnil;
+      searchbufs[i].syntax_table = Qnil;
       staticpro (&searchbufs[i].regexp);
       staticpro (&searchbufs[i].whitespace_regexp);
+      staticpro (&searchbufs[i].syntax_table);
       searchbufs[i].next = (i == REGEXP_CACHE_SIZE-1 ? 0 : &searchbufs[i+1]);
     }
   searchbuf_head = &searchbufs[0];