summaryrefslogtreecommitdiff
path: root/src/lisp.h
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2013-06-21 13:11:44 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2013-06-21 13:11:44 -0700
commitfbe9e0b9fb6a250674e7619e9ba794e74ff5f0bc (patch)
tree7b1836faca02f39413afec531c2ae467898523f5 /src/lisp.h
parentcad5d1cb5af7210154814b60825576d14740158f (diff)
downloademacs-fbe9e0b9fb6a250674e7619e9ba794e74ff5f0bc.tar.gz
emacs-fbe9e0b9fb6a250674e7619e9ba794e74ff5f0bc.tar.bz2
emacs-fbe9e0b9fb6a250674e7619e9ba794e74ff5f0bc.zip
Use C99-style flexible array members if available.
This avoids some subtle aliasing issues, which typically aren't a problem with GCC but may be a problem elsewhere. * lib-src/ebrowse.c (struct member, struct alias, struct sym): Use FLEXIBLE_ARRAY_MEMBER. (add_sym, add_member, make_namespace, register_namespace_alias): Use offsetof (struct, flex_array_member), not sizeof (struct), as that ports better to pre-C99 non-GCC. * src/alloc.c (sdata): New typedef, replacing the old struct sdata. It is a struct if GC_CHECK_STRING_BYTES, a union otherwise. In either case, it uses a flexible array member rather than the old struct hack. All uses changed. (SDATA_NBYTES, sweep_strings) [!GC_CHECK_STRING_BYTES]: Adjust to sdata reorganization. * src/alloc.c (VBLOCK_BYTES_MIN, allocate_vectorlike, Fgarbage_collect): Use offsetof (struct, flex_array_member), not sizeof (struct), as that ports better to pre-C99 non-GCC. * src/chartab.c (Fmake_char_table, make_sub_char_table, copy_char_table): Use CHAR_TABLE_STANDARD_SLOTS rather than its definition, as the latter has changed. * src/conf_post.h (FLEXIBLE_ARRAY_MEMBER): Move here from w32.c, and port better to pre-C99 GCC. * src/image.c (struct xpm_cached_color): * src/lisp.h (struct Lisp_Vector, struct Lisp_Bool_Vector) (struct Lisp_Char_Table, struct Lisp_Sub_Char_Table): Use FLEXIBLE_ARRAY_MEMBER. * src/lisp.h (string_bytes) [GC_CHECK_STRING_BYTES]: Move decl to top level so it gets checked against implementation. (CHAR_TABLE_STANDARD_SLOTS): Adjust to struct Lisp_Char_Table change. * src/w32.c (FLEXIBLE_ARRAY_MEMBER): Move to conf_post.h.
Diffstat (limited to 'src/lisp.h')
-rw-r--r--src/lisp.h16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/lisp.h b/src/lisp.h
index e2d091e98f1..f4356cd140d 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -1073,16 +1073,20 @@ SCHARS (Lisp_Object string)
{
return XSTRING (string)->size;
}
+
+#ifdef GC_CHECK_STRING_BYTES
+extern ptrdiff_t string_bytes (struct Lisp_String *);
+#endif
LISP_INLINE ptrdiff_t
STRING_BYTES (struct Lisp_String *s)
{
#ifdef GC_CHECK_STRING_BYTES
- extern ptrdiff_t string_bytes (struct Lisp_String *);
return string_bytes (s);
#else
return s->size_byte < 0 ? s->size : s->size_byte;
#endif
}
+
LISP_INLINE ptrdiff_t
SBYTES (Lisp_Object string)
{
@@ -1136,7 +1140,7 @@ struct vectorlike_header
struct Lisp_Vector
{
struct vectorlike_header header;
- Lisp_Object contents[1];
+ Lisp_Object contents[FLEXIBLE_ARRAY_MEMBER];
};
/* A boolvector is a kind of vectorlike, with contents are like a string. */
@@ -1149,7 +1153,7 @@ struct Lisp_Bool_Vector
/* This is the size in bits. */
EMACS_INT size;
/* This contains the actual bits, packed into bytes. */
- unsigned char data[1];
+ unsigned char data[FLEXIBLE_ARRAY_MEMBER];
};
/* Some handy constants for calculating sizes
@@ -1272,7 +1276,7 @@ struct Lisp_Char_Table
Lisp_Object contents[(1 << CHARTAB_SIZE_BITS_0)];
/* These hold additional data. It is a vector. */
- Lisp_Object extras[1];
+ Lisp_Object extras[FLEXIBLE_ARRAY_MEMBER];
};
struct Lisp_Sub_Char_Table
@@ -1293,7 +1297,7 @@ struct Lisp_Sub_Char_Table
Lisp_Object min_char;
/* Use set_sub_char_table_contents to set this. */
- Lisp_Object contents[1];
+ Lisp_Object contents[FLEXIBLE_ARRAY_MEMBER];
};
LISP_INLINE Lisp_Object
@@ -1366,7 +1370,7 @@ struct Lisp_Subr
slots. */
enum CHAR_TABLE_STANDARD_SLOTS
{
- CHAR_TABLE_STANDARD_SLOTS = VECSIZE (struct Lisp_Char_Table) - 1
+ CHAR_TABLE_STANDARD_SLOTS = PSEUDOVECSIZE (struct Lisp_Char_Table, extras)
};
/* Return the number of "extra" slots in the char table CT. */