summaryrefslogtreecommitdiff
path: root/libguile/inline.h
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2018-06-20 11:17:13 +0200
committerAndy Wingo <wingo@pobox.com>2018-06-20 11:17:13 +0200
commitd340a9709cf245cf3f12b213734f567c361d03e8 (patch)
tree24a13b60ac045b7399de872f9b964acaf7e47da2 /libguile/inline.h
parent3c48c8778466ba99acd167686a3793253b2806ef (diff)
downloadguile-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.
Diffstat (limited to 'libguile/inline.h')
-rw-r--r--libguile/inline.h63
1 files changed, 50 insertions, 13 deletions
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 */