diff options
author | Andy Wingo <wingo@pobox.com> | 2018-06-20 11:17:13 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2018-06-20 11:17:13 +0200 |
commit | d340a9709cf245cf3f12b213734f567c361d03e8 (patch) | |
tree | 24a13b60ac045b7399de872f9b964acaf7e47da2 | |
parent | 3c48c8778466ba99acd167686a3793253b2806ef (diff) | |
download | guile-d340a9709cf245cf3f12b213734f567c361d03e8.tar.gz |
Shuffle around inline C function implementation
* libguile/__scm.h:
* libguile/inline.h (SCM_C_EXTERN_INLINE, SCM_CAN_INLINE, SCM_INLINE)
(SCM_INLINE_IMPLEMENTATION): Move definitions here, from __scm.h.
* libguile/strings.h (scm_is_string): Move implementation here, from
inline.h.
* libguile/inline.c: Add strings.h include.
* libguile/_scm.h: Remove inline.h include.
* libguile/array-handle.h:
* libguile/gc.h:
* libguile/pairs.h:
* libguile/smob.h: Add inline.h includes.
-rw-r--r-- | libguile/__scm.h | 58 | ||||
-rw-r--r-- | libguile/_scm.h | 1 | ||||
-rw-r--r-- | libguile/array-handle.h | 1 | ||||
-rw-r--r-- | libguile/gc.h | 2 | ||||
-rw-r--r-- | libguile/inline.c | 2 | ||||
-rw-r--r-- | libguile/inline.h | 63 | ||||
-rw-r--r-- | libguile/pairs.h | 1 | ||||
-rw-r--r-- | libguile/smob.h | 1 | ||||
-rw-r--r-- | libguile/strings.h | 16 |
9 files changed, 71 insertions, 74 deletions
diff --git a/libguile/__scm.h b/libguile/__scm.h index 705642e02..32d5de354 100644 --- a/libguile/__scm.h +++ b/libguile/__scm.h @@ -153,64 +153,6 @@ -/* We would like gnu89 extern inline semantics, not C99 extern inline - semantics, so that we can be sure to avoid reifying definitions of - inline functions in all compilation units, which is a possibility at - low optimization levels, or if a user takes the address of an inline - function. - - Hence the `__gnu_inline__' attribute, in accordance with: - http://gcc.gnu.org/gcc-4.3/porting_to.html . - - With GCC 4.2, `__GNUC_STDC_INLINE__' is never defined (because C99 inline - semantics are not supported), but a warning is issued in C99 mode if - `__gnu_inline__' is not used. - - Apple's GCC build >5400 (since Xcode 3.0) doesn't support GNU inline in - C99 mode and doesn't define `__GNUC_STDC_INLINE__'. Fall back to "static - inline" in that case. */ - -# if (defined __GNUC__) && (!(((defined __APPLE_CC__) && (__APPLE_CC__ > 5400)) && __STDC_VERSION__ >= 199901L)) -# if (defined __GNUC_STDC_INLINE__) || (__GNUC__ == 4 && __GNUC_MINOR__ == 2) -# define SCM_C_EXTERN_INLINE \ - extern __inline__ __attribute__ ((__gnu_inline__)) -# else -# define SCM_C_EXTERN_INLINE extern __inline__ -# endif -# endif - -/* SCM_INLINE is a macro prepended to all public inline function - declarations. Implementations of those functions should also be in - the header file, prefixed by SCM_INLINE_IMPLEMENTATION, and protected - by SCM_CAN_INLINE and a CPP define for the C file in question, like - SCM_INLINE_C_INCLUDING_INLINE_H. See inline.h for an example - usage. */ - -#if defined SCM_IMPLEMENT_INLINES -/* Reifying functions to a file, whether or not inlining is available. */ -# define SCM_CAN_INLINE 0 -# define SCM_INLINE SCM_API -# define SCM_INLINE_IMPLEMENTATION -#elif defined SCM_C_INLINE -/* Declarations when inlining is available. */ -# define SCM_CAN_INLINE 1 -# ifdef SCM_C_EXTERN_INLINE -# define SCM_INLINE SCM_C_EXTERN_INLINE -# else -/* Fall back to static inline if GNU "extern inline" is unavailable. */ -# define SCM_INLINE static SCM_C_INLINE -# endif -# define SCM_INLINE_IMPLEMENTATION SCM_INLINE -#else -/* Declarations when inlining is not available. */ -# define SCM_CAN_INLINE 0 -# define SCM_INLINE SCM_API -/* Don't define SCM_INLINE_IMPLEMENTATION; it should never be seen in - this case. */ -#endif - - - /* {Debugging Options} * * These compile time options determine whether to include code that is only diff --git a/libguile/_scm.h b/libguile/_scm.h index 5c910b16e..d7b0b93fe 100644 --- a/libguile/_scm.h +++ b/libguile/_scm.h @@ -41,7 +41,6 @@ #include "libguile/foreign.h" /* Snarfing needs the foreign data structures. */ #include "libguile/programs.h" /* ... and program.h. */ #include "libguile/modules.h" -#include "libguile/inline.h" #include "libguile/strings.h" diff --git a/libguile/array-handle.h b/libguile/array-handle.h index a623b4e2e..0bca9b1e0 100644 --- a/libguile/array-handle.h +++ b/libguile/array-handle.h @@ -26,6 +26,7 @@ #include "libguile/__scm.h" #include "libguile/error.h" +#include "libguile/inline.h" #include "libguile/numbers.h" diff --git a/libguile/gc.h b/libguile/gc.h index 1b9adde79..354c017f1 100644 --- a/libguile/gc.h +++ b/libguile/gc.h @@ -25,7 +25,7 @@ #include "libguile/__scm.h" - +#include "libguile/inline.h" #include "libguile/chooks.h" diff --git a/libguile/inline.c b/libguile/inline.c index 19888f31b..e0c3dc9ab 100644 --- a/libguile/inline.c +++ b/libguile/inline.c @@ -24,8 +24,8 @@ #define SCM_IMPLEMENT_INLINES 1 #define SCM_INLINE_C_IMPLEMENTING_INLINES 1 #include "libguile/gc.h" -#include "libguile/inline.h" #include "libguile/array-handle.h" #include "libguile/smob.h" #include "libguile/pairs.h" #include "libguile/ports.h" +#include "libguile/strings.h" diff --git a/libguile/inline.h b/libguile/inline.h index 999df361e..57e0ecfba 100644 --- a/libguile/inline.h +++ b/libguile/inline.h @@ -29,22 +29,59 @@ #include "libguile/__scm.h" +/* We would like gnu89 extern inline semantics, not C99 extern inline + semantics, so that we can be sure to avoid reifying definitions of + inline functions in all compilation units, which is a possibility at + low optimization levels, or if a user takes the address of an inline + function. -SCM_INLINE int scm_is_string (SCM x); + Hence the `__gnu_inline__' attribute, in accordance with: + http://gcc.gnu.org/gcc-4.3/porting_to.html . -SCM_INLINE SCM scm_cell (scm_t_bits car, scm_t_bits cdr); -SCM_INLINE SCM scm_double_cell (scm_t_bits car, scm_t_bits cbr, - scm_t_bits ccr, scm_t_bits cdr); -SCM_INLINE SCM scm_words (scm_t_bits car, scm_t_uint32 n_words); + With GCC 4.2, `__GNUC_STDC_INLINE__' is never defined (because C99 inline + semantics are not supported), but a warning is issued in C99 mode if + `__gnu_inline__' is not used. -#if SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES -/* Either inlining, or being included from inline.c. */ + Apple's GCC build >5400 (since Xcode 3.0) doesn't support GNU inline in + C99 mode and doesn't define `__GNUC_STDC_INLINE__'. Fall back to "static + inline" in that case. */ -SCM_INLINE_IMPLEMENTATION int -scm_is_string (SCM x) -{ - return SCM_HAS_TYP7 (x, scm_tc7_string); -} +# if (defined __GNUC__) && (!(((defined __APPLE_CC__) && (__APPLE_CC__ > 5400)) && __STDC_VERSION__ >= 199901L)) +# if (defined __GNUC_STDC_INLINE__) || (__GNUC__ == 4 && __GNUC_MINOR__ == 2) +# define SCM_C_EXTERN_INLINE \ + extern __inline__ __attribute__ ((__gnu_inline__)) +# else +# define SCM_C_EXTERN_INLINE extern __inline__ +# endif +# endif +/* SCM_INLINE is a macro prepended to all public inline function + declarations. Implementations of those functions should also be in + the header file, prefixed by SCM_INLINE_IMPLEMENTATION, and protected + by SCM_CAN_INLINE. Non-inline definitions will be reified into + inline.c. See strings.h for an example usage, for scm_is_string. */ + +#if defined SCM_IMPLEMENT_INLINES +/* Reifying functions to a file, whether or not inlining is available. */ +# define SCM_CAN_INLINE 0 +# define SCM_INLINE SCM_API +# define SCM_INLINE_IMPLEMENTATION +#elif defined SCM_C_INLINE +/* Declarations when inlining is available. */ +# define SCM_CAN_INLINE 1 +# ifdef SCM_C_EXTERN_INLINE +# define SCM_INLINE SCM_C_EXTERN_INLINE +# else +/* Fall back to static inline if GNU "extern inline" is unavailable. */ +# define SCM_INLINE static SCM_C_INLINE +# endif +# define SCM_INLINE_IMPLEMENTATION SCM_INLINE +#else +/* Declarations when inlining is not available. */ +# define SCM_CAN_INLINE 0 +# define SCM_INLINE SCM_API +/* Don't define SCM_INLINE_IMPLEMENTATION; it should never be seen in + this case. */ #endif -#endif + +#endif /* SCM_INLINE_H */ diff --git a/libguile/pairs.h b/libguile/pairs.h index 148f9ad1b..6b80a4012 100644 --- a/libguile/pairs.h +++ b/libguile/pairs.h @@ -28,6 +28,7 @@ #include "libguile/error.h" #include "libguile/gc.h" +#include "libguile/inline.h" diff --git a/libguile/smob.h b/libguile/smob.h index 410abcba5..addcdcbc4 100644 --- a/libguile/smob.h +++ b/libguile/smob.h @@ -27,6 +27,7 @@ #include "libguile/__scm.h" #include <libguile/error.h> #include <libguile/gc.h> +#include "libguile/inline.h" #include "libguile/print.h" #include <libguile/snarf.h> diff --git a/libguile/strings.h b/libguile/strings.h index 1a8fbb631..5a1d4592f 100644 --- a/libguile/strings.h +++ b/libguile/strings.h @@ -26,6 +26,7 @@ #include "libguile/__scm.h" #include <libguile/error.h> +#include "libguile/inline.h" #include <libguile/snarf.h> @@ -106,6 +107,7 @@ SCM_INTERNAL SCM scm_nullstr; SCM_INTERNAL scm_t_string_failed_conversion_handler scm_i_default_string_failed_conversion_handler (void); +SCM_INLINE int scm_is_string (SCM x); SCM_API SCM scm_string_p (SCM x); SCM_API SCM scm_string (SCM chrs); SCM_API SCM scm_make_string (SCM k, SCM chr); @@ -284,6 +286,20 @@ SCM_API SCM scm_sys_stringbuf_hist (void); +#if SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES +/* Either inlining, or being included from inline.c. */ + +SCM_INLINE_IMPLEMENTATION int +scm_is_string (SCM x) +{ + return SCM_HAS_TYP7 (x, scm_tc7_string); +} + +#endif + + + + #define SCM_VALIDATE_STRING(pos, str) \ do { \ SCM_ASSERT_TYPE (scm_is_string (str), str, pos, FUNC_NAME, "string"); \ |