Commit c6cfd910 authored by Paul Eggert's avatar Paul Eggert

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.
parent 3a4be55b
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,
......
......@@ -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
......
......@@ -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.
......
......@@ -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);
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment