]> code.delx.au - gnu-emacs/commitdiff
Fix syntax.h bug introduced by recent INLINE change.
authorPaul Eggert <eggert@cs.ucla.edu>
Sun, 22 Sep 2013 06:22:05 +0000 (23:22 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sun, 22 Sep 2013 06:22:05 +0000 (23:22 -0700)
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.

src/ChangeLog
src/regex.c
src/syntax.c
src/syntax.h

index 37e04f03c85f66b000a5c8d197b6d1e70c795585..084ae983b6f027d31d3121dffb1c59e7364290ca 100644 (file)
@@ -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,
index 1befececd22e1876b2fe43028ad603c3800bf53b..4ab98bbf0984435adba01eda7c21a25addb13792 100644 (file)
 # 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
index 3785bf4551576589729d13378d1814abf19702d5..e18db0293099d5fac1c06832ea2a2c96f3849f82 100644 (file)
@@ -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.
index 1350d87162bd8ba2d40eb4d13da5c36aaea3d0b6..73fbb15333859e147e9bcc9335d6cc8f6f5d2aab 100644 (file)
@@ -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);
 }