diff options
| -rw-r--r-- | src/ChangeLog | 18 | ||||
| -rw-r--r-- | src/regex.c | 6 | ||||
| -rw-r--r-- | src/syntax.c | 8 | ||||
| -rw-r--r-- | src/syntax.h | 36 | 
4 files changed, 51 insertions, 17 deletions
| diff --git a/src/ChangeLog b/src/ChangeLog index 37e04f03c85..084ae983b6f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,21 @@ +2013-09-22  Paul Eggert  <eggert@cs.ucla.edu> + +	Fix syntax.h bug introduced by recent INLINE change. +	syntax.h defined an extern inline function SYNTAX_ENTRY that was +	conditionally compiled one way in some modules, and a different +	way in others.  This doesn't work with extern inline functions, +	which must have the same definition in all modules, because the +	defining code might be shared across modules, depending on the +	implementation.  Symptoms reported by Martin Rudalics in: +	http://lists.gnu.org/archive/html/emacs-devel/2013-09/msg00414.html +	* regex.c, syntax.c (SYNTAX_ENTRY_VIA_PROPERTY): Remove. +	(SYNTAX, SYNTAX_ENTRY, SYNTAX_WITH_FLAGS): New macros, +	overriding the corresponding functions in syntax.h. +	* syntax.h (syntax_property_entry, syntax_property_with_flags) +	(syntax_property): New inline functions. +	(SYNTAX_ENTRY, SYNTAX_WITH_FLAGS, SYNTAX): +	Rewrite in terms of these new functions. +  2013-09-21  Eli Zaretskii  <eliz@gnu.org>  	* dired.c (directory_files_internal): Use multibyte_chars_in_text, diff --git a/src/regex.c b/src/regex.c index 1befececd22..4ab98bbf098 100644 --- a/src/regex.c +++ b/src/regex.c @@ -131,12 +131,12 @@  # include "character.h"  # include "buffer.h" -/* Make syntax table lookup grant data in gl_state.  */ -# define SYNTAX_ENTRY_VIA_PROPERTY -  # include "syntax.h"  # include "category.h" +/* Make syntax table lookup grant data in gl_state.  */ +# define SYNTAX(c) syntax_property (c, 1) +  # ifdef malloc  #  undef malloc  # endif diff --git a/src/syntax.c b/src/syntax.c index 3785bf45515..e18db029309 100644 --- a/src/syntax.c +++ b/src/syntax.c @@ -29,13 +29,15 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */  #include "keymap.h"  #include "regex.h" -/* Make syntax table lookup grant data in gl_state.  */ -#define SYNTAX_ENTRY_VIA_PROPERTY -  #include "syntax.h"  #include "intervals.h"  #include "category.h" +/* Make syntax table lookup grant data in gl_state.  */ +#define SYNTAX(c) syntax_property (c, 1) +#define SYNTAX_ENTRY(c) syntax_property_entry (c, 1) +#define SYNTAX_WITH_FLAGS(c) syntax_property_with_flags (c, 1) +  /* Eight single-bit flags have the following meanings:    1. This character is the first of a two-character comment-start sequence.    2. This character is the second of a two-character comment-start sequence. diff --git a/src/syntax.h b/src/syntax.h index 1350d87162b..73fbb153338 100644 --- a/src/syntax.h +++ b/src/syntax.h @@ -83,35 +83,49 @@ struct gl_state_s  extern struct gl_state_s gl_state;  /* Fetch the information from the entry for character C -   in syntax table TABLE, or from globally kept data (gl_state). +   in the current buffer's syntax table, +   or (if VIA_PROPERTY) from globally kept data (gl_state).     Does inheritance.  */  INLINE Lisp_Object -SYNTAX_ENTRY (int c) +syntax_property_entry (int c, bool via_property)  { -#ifdef SYNTAX_ENTRY_VIA_PROPERTY -  return (gl_state.use_global -	  ? gl_state.global_code -	  : CHAR_TABLE_REF (gl_state.current_syntax_table, c)); -#else +  if (via_property) +    return (gl_state.use_global +	    ? gl_state.global_code +	    : CHAR_TABLE_REF (gl_state.current_syntax_table, c));    return CHAR_TABLE_REF (BVAR (current_buffer, syntax_table), c); -#endif +} +INLINE Lisp_Object +SYNTAX_ENTRY (int c) +{ +  return syntax_property_entry (c, 0);  }  /* Extract the information from the entry for character C     in the current syntax table.  */  INLINE int -SYNTAX_WITH_FLAGS (int c) +syntax_property_with_flags (int c, bool via_property)  { -  Lisp_Object ent = SYNTAX_ENTRY (c); +  Lisp_Object ent = syntax_property_entry (c, via_property);    return CONSP (ent) ? XINT (XCAR (ent)) : Swhitespace;  } +INLINE int +SYNTAX_WITH_FLAGS (int c) +{ +  return syntax_property_with_flags (c, 0); +}  INLINE enum syntaxcode +syntax_property (int c, bool via_property) +{ +  return syntax_property_with_flags (c, via_property) & 0xff; +} +INLINE enum syntaxcode  SYNTAX (int c)  { -  return SYNTAX_WITH_FLAGS (c) & 0xff; +  return syntax_property (c, 0);  } | 
