[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 57/86: Shuffle around inline C function implementation
From: |
Andy Wingo |
Subject: |
[Guile-commits] 57/86: Shuffle around inline C function implementation |
Date: |
Wed, 20 Jun 2018 14:09:40 -0400 (EDT) |
wingo pushed a commit to branch master
in repository guile.
commit d340a9709cf245cf3f12b213734f567c361d03e8
Author: Andy Wingo <address@hidden>
Date: Wed Jun 20 11:17:13 2018 +0200
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.
---
libguile/__scm.h | 58 ---------------------------------------------
libguile/_scm.h | 1 -
libguile/array-handle.h | 1 +
libguile/gc.h | 2 +-
libguile/inline.c | 2 +-
libguile/inline.h | 63 +++++++++++++++++++++++++++++++++++++++----------
libguile/pairs.h | 1 +
libguile/smob.h | 1 +
libguile/strings.h | 16 +++++++++++++
9 files changed, 71 insertions(+), 74 deletions(-)
diff --git a/libguile/__scm.h b/libguile/__scm.h
index 705642e..32d5de3 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 5c910b1..d7b0b93 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 a623b4e..0bca9b1 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 1b9adde..354c017 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 19888f3..e0c3dc9 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 999df36..57e0ecf 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 148f9ad..6b80a40 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 410abcb..addcdcb 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 1a8fbb6..5a1d459 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"); \
- [Guile-commits] 49/86: Move string-related snarfers to strings.h, (continued)
- [Guile-commits] 49/86: Move string-related snarfers to strings.h, Andy Wingo, 2018/06/20
- [Guile-commits] 25/86: Remove list.h from _scm.h, Andy Wingo, 2018/06/20
- [Guile-commits] 26/86: Devolve boolean.h include., Andy Wingo, 2018/06/20
- [Guile-commits] 39/86: Remove <stdio.h> from ports.h, Andy Wingo, 2018/06/20
- [Guile-commits] 55/86: Remove snarf.h from _scm.h, Andy Wingo, 2018/06/20
- [Guile-commits] 52/86: Remove mutex snarfers, Andy Wingo, 2018/06/20
- [Guile-commits] 58/86: Define scm_t_wchar in one place, Andy Wingo, 2018/06/20
- [Guile-commits] 54/86: Simplify SCM_IMMUTABLE_CELL macros, Andy Wingo, 2018/06/20
- [Guile-commits] 27/86: Devolve pairs.h, Andy Wingo, 2018/06/20
- [Guile-commits] 53/86: Devolve smob snarfers, Andy Wingo, 2018/06/20
- [Guile-commits] 57/86: Shuffle around inline C function implementation,
Andy Wingo <=
- [Guile-commits] 62/86: Devolve foreign.h from _scm.h, Andy Wingo, 2018/06/20
- [Guile-commits] 63/86: Devolve programs.h from _scm.h., Andy Wingo, 2018/06/20
- [Guile-commits] 22/86: Devolve more validate macros, Andy Wingo, 2018/06/20
- [Guile-commits] 23/86: Remove includes of validate.h., Andy Wingo, 2018/06/20
- [Guile-commits] 56/86: Devolve variable.h from _scm.h., Andy Wingo, 2018/06/20
- [Guile-commits] 69/86: Move SCM_C_INLINE_KEYWORD definition to inline.h, Andy Wingo, 2018/06/20
- [Guile-commits] 70/86: Fix include in test-ffi-lib, Andy Wingo, 2018/06/20
- [Guile-commits] 68/86: Remove unneeded memmove.c and strerror.c files, Andy Wingo, 2018/06/20
- [Guile-commits] 64/86: Devolve strings.h, Andy Wingo, 2018/06/20
- [Guile-commits] 72/86: Fix missing includes in tests., Andy Wingo, 2018/06/20