aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorStefan Monnier2015-11-21 22:05:28 -0500
committerStefan Monnier2015-11-21 22:05:28 -0500
commit702d76dbee8447f56d01009142983f09e7507d6f (patch)
treec4bb2e544ae9e87ff14f1254d64537b92868384b /src
parent8e84823f3f06714d0668060d62456cf7e3100e6c (diff)
downloademacs-702d76dbee8447f56d01009142983f09e7507d6f.tar.gz
emacs-702d76dbee8447f56d01009142983f09e7507d6f.zip
Unrevert most of regexp reentrancy abort patch
The problem was in: * src/syntax.c (update_syntax_table_forward): Propertize even when truncated which is hence not unreverted. The rest is: * src/syntax.h (UPDATE_SYNTAX_TABLE_FORWARD_FAST): (UPDATE_SYNTAX_TABLE_FAST): Re-introduce. All callers in regex.c changed back to the _FAST versions. * test/automated/message-mode-tests.el: Tweak the test to rely on auto propertization in backward-sexp.
Diffstat (limited to 'src')
-rw-r--r--src/regex.c18
-rw-r--r--src/syntax.h14
2 files changed, 23 insertions, 9 deletions
diff --git a/src/regex.c b/src/regex.c
index dcf286454b3..4e00fd15dc9 100644
--- a/src/regex.c
+++ b/src/regex.c
@@ -5945,12 +5945,12 @@ re_match_2_internal (struct re_pattern_buffer *bufp, const_re_char *string1,
5945#ifdef emacs 5945#ifdef emacs
5946 ssize_t offset = PTR_TO_OFFSET (d - 1); 5946 ssize_t offset = PTR_TO_OFFSET (d - 1);
5947 ssize_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset); 5947 ssize_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset);
5948 UPDATE_SYNTAX_TABLE (charpos); 5948 UPDATE_SYNTAX_TABLE_FAST (charpos);
5949#endif 5949#endif
5950 GET_CHAR_BEFORE_2 (c1, d, string1, end1, string2, end2); 5950 GET_CHAR_BEFORE_2 (c1, d, string1, end1, string2, end2);
5951 s1 = SYNTAX (c1); 5951 s1 = SYNTAX (c1);
5952#ifdef emacs 5952#ifdef emacs
5953 UPDATE_SYNTAX_TABLE_FORWARD (charpos + 1); 5953 UPDATE_SYNTAX_TABLE_FORWARD_FAST (charpos + 1);
5954#endif 5954#endif
5955 PREFETCH_NOLIMIT (); 5955 PREFETCH_NOLIMIT ();
5956 GET_CHAR_AFTER (c2, d, dummy); 5956 GET_CHAR_AFTER (c2, d, dummy);
@@ -5987,7 +5987,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp, const_re_char *string1,
5987#ifdef emacs 5987#ifdef emacs
5988 ssize_t offset = PTR_TO_OFFSET (d); 5988 ssize_t offset = PTR_TO_OFFSET (d);
5989 ssize_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset); 5989 ssize_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset);
5990 UPDATE_SYNTAX_TABLE (charpos); 5990 UPDATE_SYNTAX_TABLE_FAST (charpos);
5991#endif 5991#endif
5992 PREFETCH (); 5992 PREFETCH ();
5993 GET_CHAR_AFTER (c2, d, dummy); 5993 GET_CHAR_AFTER (c2, d, dummy);
@@ -6032,7 +6032,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp, const_re_char *string1,
6032#ifdef emacs 6032#ifdef emacs
6033 ssize_t offset = PTR_TO_OFFSET (d) - 1; 6033 ssize_t offset = PTR_TO_OFFSET (d) - 1;
6034 ssize_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset); 6034 ssize_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset);
6035 UPDATE_SYNTAX_TABLE (charpos); 6035 UPDATE_SYNTAX_TABLE_FAST (charpos);
6036#endif 6036#endif
6037 GET_CHAR_BEFORE_2 (c1, d, string1, end1, string2, end2); 6037 GET_CHAR_BEFORE_2 (c1, d, string1, end1, string2, end2);
6038 s1 = SYNTAX (c1); 6038 s1 = SYNTAX (c1);
@@ -6047,7 +6047,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp, const_re_char *string1,
6047 PREFETCH_NOLIMIT (); 6047 PREFETCH_NOLIMIT ();
6048 GET_CHAR_AFTER (c2, d, dummy); 6048 GET_CHAR_AFTER (c2, d, dummy);
6049#ifdef emacs 6049#ifdef emacs
6050 UPDATE_SYNTAX_TABLE_FORWARD (charpos); 6050 UPDATE_SYNTAX_TABLE_FORWARD_FAST (charpos);
6051#endif 6051#endif
6052 s2 = SYNTAX (c2); 6052 s2 = SYNTAX (c2);
6053 6053
@@ -6076,7 +6076,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp, const_re_char *string1,
6076#ifdef emacs 6076#ifdef emacs
6077 ssize_t offset = PTR_TO_OFFSET (d); 6077 ssize_t offset = PTR_TO_OFFSET (d);
6078 ssize_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset); 6078 ssize_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset);
6079 UPDATE_SYNTAX_TABLE (charpos); 6079 UPDATE_SYNTAX_TABLE_FAST (charpos);
6080#endif 6080#endif
6081 PREFETCH (); 6081 PREFETCH ();
6082 c2 = RE_STRING_CHAR (d, target_multibyte); 6082 c2 = RE_STRING_CHAR (d, target_multibyte);
@@ -6119,7 +6119,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp, const_re_char *string1,
6119#ifdef emacs 6119#ifdef emacs
6120 ssize_t offset = PTR_TO_OFFSET (d) - 1; 6120 ssize_t offset = PTR_TO_OFFSET (d) - 1;
6121 ssize_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset); 6121 ssize_t charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset);
6122 UPDATE_SYNTAX_TABLE (charpos); 6122 UPDATE_SYNTAX_TABLE_FAST (charpos);
6123#endif 6123#endif
6124 GET_CHAR_BEFORE_2 (c1, d, string1, end1, string2, end2); 6124 GET_CHAR_BEFORE_2 (c1, d, string1, end1, string2, end2);
6125 s1 = SYNTAX (c1); 6125 s1 = SYNTAX (c1);
@@ -6134,7 +6134,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp, const_re_char *string1,
6134 PREFETCH_NOLIMIT (); 6134 PREFETCH_NOLIMIT ();
6135 c2 = RE_STRING_CHAR (d, target_multibyte); 6135 c2 = RE_STRING_CHAR (d, target_multibyte);
6136#ifdef emacs 6136#ifdef emacs
6137 UPDATE_SYNTAX_TABLE_FORWARD (charpos + 1); 6137 UPDATE_SYNTAX_TABLE_FORWARD_FAST (charpos + 1);
6138#endif 6138#endif
6139 s2 = SYNTAX (c2); 6139 s2 = SYNTAX (c2);
6140 6140
@@ -6157,7 +6157,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp, const_re_char *string1,
6157 { 6157 {
6158 ssize_t offset = PTR_TO_OFFSET (d); 6158 ssize_t offset = PTR_TO_OFFSET (d);
6159 ssize_t pos1 = SYNTAX_TABLE_BYTE_TO_CHAR (offset); 6159 ssize_t pos1 = SYNTAX_TABLE_BYTE_TO_CHAR (offset);
6160 UPDATE_SYNTAX_TABLE (pos1); 6160 UPDATE_SYNTAX_TABLE_FAST (pos1);
6161 } 6161 }
6162#endif 6162#endif
6163 { 6163 {
diff --git a/src/syntax.h b/src/syntax.h
index 06ce0ec55df..eb154e088c9 100644
--- a/src/syntax.h
+++ b/src/syntax.h
@@ -186,6 +186,13 @@ UPDATE_SYNTAX_TABLE_FORWARD (ptrdiff_t charpos)
186 false, gl_state.object); 186 false, gl_state.object);
187} 187}
188 188
189INLINE void
190UPDATE_SYNTAX_TABLE_FORWARD_FAST (ptrdiff_t charpos)
191{
192 if (parse_sexp_lookup_properties && charpos >= gl_state.e_property)
193 update_syntax_table (charpos + gl_state.offset, 1, false, gl_state.object);
194}
195
189/* Make syntax table state (gl_state) good for CHARPOS, assuming it is 196/* Make syntax table state (gl_state) good for CHARPOS, assuming it is
190 currently good for a position after CHARPOS. */ 197 currently good for a position after CHARPOS. */
191 198
@@ -205,6 +212,13 @@ UPDATE_SYNTAX_TABLE (ptrdiff_t charpos)
205 UPDATE_SYNTAX_TABLE_FORWARD (charpos); 212 UPDATE_SYNTAX_TABLE_FORWARD (charpos);
206} 213}
207 214
215INLINE void
216UPDATE_SYNTAX_TABLE_FAST (ptrdiff_t charpos)
217{
218 UPDATE_SYNTAX_TABLE_BACKWARD (charpos);
219 UPDATE_SYNTAX_TABLE_FORWARD_FAST (charpos);
220}
221
208/* Set up the buffer-global syntax table. */ 222/* Set up the buffer-global syntax table. */
209 223
210INLINE void 224INLINE void