pymacro.h: Inline _Py_ARRAY_LENGTH_CHECK() and add http://ccodearchive.net/

This commit is contained in:
Victor Stinner 2011-09-29 12:12:39 +02:00
parent 6f1ba077c0
commit 573696a9ca
1 changed files with 12 additions and 13 deletions

View File

@ -19,20 +19,10 @@
((char *)(foo) \ ((char *)(foo) \
+ Py_BUILD_ASSERT(offsetof(struct foo, string) == 0)) + Py_BUILD_ASSERT(offsetof(struct foo, string) == 0))
Written by Rusty Russell, public domain. */ Written by Rusty Russell, public domain, http://ccodearchive.net/ */
#define Py_BUILD_ASSERT(cond) \ #define Py_BUILD_ASSERT(cond) \
(sizeof(char [1 - 2*!(cond)]) - 1) (sizeof(char [1 - 2*!(cond)]) - 1)
#if defined(__GNUC__)
/* Two gcc extensions.
&a[0] degrades to a pointer: a different type from an array */
#define _Py_ARRAY_LENGTH_CHECK(array) \
Py_BUILD_ASSERT(!__builtin_types_compatible_p(typeof(array), \
typeof(&(array)[0])))
#else
#define _Py_ARRAY_LENGTH_CHECK(array) 0
#endif
/* Get the number of elements in a visible array /* Get the number of elements in a visible array
@ -40,9 +30,18 @@
parameters. With correct compiler support, such usage will cause a build parameters. With correct compiler support, such usage will cause a build
error (see Py_BUILD_ASSERT). error (see Py_BUILD_ASSERT).
Written by Rusty Russell, public domain. */ Written by Rusty Russell, public domain, http://ccodearchive.net/ */
#if defined(__GNUC__)
/* Two gcc extensions.
&a[0] degrades to a pointer: a different type from an array */
#define Py_ARRAY_LENGTH(array) \ #define Py_ARRAY_LENGTH(array) \
(sizeof(array) / sizeof((array)[0]) + _Py_ARRAY_LENGTH_CHECK(array)) (sizeof(array) / sizeof((array)[0]) \
+ Py_BUILD_ASSERT(!__builtin_types_compatible_p(typeof(array), \
typeof(&(array)[0]))))
#else
#define Py_ARRAY_LENGTH(array) \
(sizeof(array) / sizeof((array)[0]))
#endif
/* Define macros for inline documentation. */ /* Define macros for inline documentation. */