mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-01 12:20:26 +02:00
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.
This commit is contained in:
parent
3c48c87784
commit
d340a9709c
9 changed files with 71 additions and 74 deletions
|
@ -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}
|
/* {Debugging Options}
|
||||||
*
|
*
|
||||||
* These compile time options determine whether to include code that is only
|
* These compile time options determine whether to include code that is only
|
||||||
|
|
|
@ -41,7 +41,6 @@
|
||||||
#include "libguile/foreign.h" /* Snarfing needs the foreign data structures. */
|
#include "libguile/foreign.h" /* Snarfing needs the foreign data structures. */
|
||||||
#include "libguile/programs.h" /* ... and program.h. */
|
#include "libguile/programs.h" /* ... and program.h. */
|
||||||
#include "libguile/modules.h"
|
#include "libguile/modules.h"
|
||||||
#include "libguile/inline.h"
|
|
||||||
#include "libguile/strings.h"
|
#include "libguile/strings.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
|
|
||||||
#include "libguile/__scm.h"
|
#include "libguile/__scm.h"
|
||||||
#include "libguile/error.h"
|
#include "libguile/error.h"
|
||||||
|
#include "libguile/inline.h"
|
||||||
#include "libguile/numbers.h"
|
#include "libguile/numbers.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
|
|
||||||
|
|
||||||
#include "libguile/__scm.h"
|
#include "libguile/__scm.h"
|
||||||
|
#include "libguile/inline.h"
|
||||||
#include "libguile/chooks.h"
|
#include "libguile/chooks.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -24,8 +24,8 @@
|
||||||
#define SCM_IMPLEMENT_INLINES 1
|
#define SCM_IMPLEMENT_INLINES 1
|
||||||
#define SCM_INLINE_C_IMPLEMENTING_INLINES 1
|
#define SCM_INLINE_C_IMPLEMENTING_INLINES 1
|
||||||
#include "libguile/gc.h"
|
#include "libguile/gc.h"
|
||||||
#include "libguile/inline.h"
|
|
||||||
#include "libguile/array-handle.h"
|
#include "libguile/array-handle.h"
|
||||||
#include "libguile/smob.h"
|
#include "libguile/smob.h"
|
||||||
#include "libguile/pairs.h"
|
#include "libguile/pairs.h"
|
||||||
#include "libguile/ports.h"
|
#include "libguile/ports.h"
|
||||||
|
#include "libguile/strings.h"
|
||||||
|
|
|
@ -29,22 +29,59 @@
|
||||||
|
|
||||||
#include "libguile/__scm.h"
|
#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);
|
With GCC 4.2, `__GNUC_STDC_INLINE__' is never defined (because C99 inline
|
||||||
SCM_INLINE SCM scm_double_cell (scm_t_bits car, scm_t_bits cbr,
|
semantics are not supported), but a warning is issued in C99 mode if
|
||||||
scm_t_bits ccr, scm_t_bits cdr);
|
`__gnu_inline__' is not used.
|
||||||
SCM_INLINE SCM scm_words (scm_t_bits car, scm_t_uint32 n_words);
|
|
||||||
|
|
||||||
#if SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES
|
Apple's GCC build >5400 (since Xcode 3.0) doesn't support GNU inline in
|
||||||
/* Either inlining, or being included from inline.c. */
|
C99 mode and doesn't define `__GNUC_STDC_INLINE__'. Fall back to "static
|
||||||
|
inline" in that case. */
|
||||||
|
|
||||||
SCM_INLINE_IMPLEMENTATION int
|
# if (defined __GNUC__) && (!(((defined __APPLE_CC__) && (__APPLE_CC__ > 5400)) && __STDC_VERSION__ >= 199901L))
|
||||||
scm_is_string (SCM x)
|
# if (defined __GNUC_STDC_INLINE__) || (__GNUC__ == 4 && __GNUC_MINOR__ == 2)
|
||||||
{
|
# define SCM_C_EXTERN_INLINE \
|
||||||
return SCM_HAS_TYP7 (x, scm_tc7_string);
|
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
|
|
||||||
|
#endif /* SCM_INLINE_H */
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
|
|
||||||
#include "libguile/error.h"
|
#include "libguile/error.h"
|
||||||
#include "libguile/gc.h"
|
#include "libguile/gc.h"
|
||||||
|
#include "libguile/inline.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include "libguile/__scm.h"
|
#include "libguile/__scm.h"
|
||||||
#include <libguile/error.h>
|
#include <libguile/error.h>
|
||||||
#include <libguile/gc.h>
|
#include <libguile/gc.h>
|
||||||
|
#include "libguile/inline.h"
|
||||||
#include "libguile/print.h"
|
#include "libguile/print.h"
|
||||||
#include <libguile/snarf.h>
|
#include <libguile/snarf.h>
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
|
|
||||||
#include "libguile/__scm.h"
|
#include "libguile/__scm.h"
|
||||||
#include <libguile/error.h>
|
#include <libguile/error.h>
|
||||||
|
#include "libguile/inline.h"
|
||||||
#include <libguile/snarf.h>
|
#include <libguile/snarf.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -106,6 +107,7 @@ SCM_INTERNAL SCM scm_nullstr;
|
||||||
SCM_INTERNAL scm_t_string_failed_conversion_handler
|
SCM_INTERNAL scm_t_string_failed_conversion_handler
|
||||||
scm_i_default_string_failed_conversion_handler (void);
|
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_p (SCM x);
|
||||||
SCM_API SCM scm_string (SCM chrs);
|
SCM_API SCM scm_string (SCM chrs);
|
||||||
SCM_API SCM scm_make_string (SCM k, SCM chr);
|
SCM_API SCM scm_make_string (SCM k, SCM chr);
|
||||||
|
@ -282,6 +284,20 @@ SCM_API SCM scm_sys_stringbuf_hist (void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#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) \
|
#define SCM_VALIDATE_STRING(pos, str) \
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue