guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] [wip] c99 inline


From: daniel . llorens
Subject: [PATCH] [wip] c99 inline
Date: Wed, 31 Aug 2016 13:34:37 +0200

From: Daniel Llorens <address@hidden>

---
 libguile.h              |  1 -
 libguile/Makefile.am    |  2 --
 libguile/__scm.h        | 69 -------------------------------------------------
 libguile/_scm.h         |  1 -
 libguile/array-handle.c |  3 +++
 libguile/array-handle.h | 12 ++-------
 libguile/gc.c           |  6 +++++
 libguile/gc.h           | 15 +++--------
 libguile/inline.c       | 30 ---------------------
 libguile/inline.h       | 57 ----------------------------------------
 libguile/numbers.c      |  2 +-
 libguile/pairs.c        |  5 ++++
 libguile/pairs.h        | 15 +++--------
 libguile/smob.c         |  4 +++
 libguile/smob.h         | 11 ++------
 libguile/socket.c       |  2 +-
 libguile/strings.c      |  2 ++
 libguile/strings.h      |  6 +++++
 libguile/strorder.c     |  2 +-
 19 files changed, 40 insertions(+), 205 deletions(-)
 delete mode 100644 libguile/inline.c
 delete mode 100644 libguile/inline.h

diff --git a/libguile.h b/libguile.h
index d2030eb..57e0e66 100644
--- a/libguile.h
+++ b/libguile.h
@@ -124,7 +124,6 @@ extern "C" {
 #include "libguile/debug.h"
 #include "libguile/stacks.h"
 #include "libguile/threads.h"
-#include "libguile/inline.h"
 
 #include "libguile/deprecated.h"
 
diff --git a/libguile/Makefile.am b/libguile/Makefile.am
index 8161ade..7fc6998 100644
--- a/libguile/Makefile.am
+++ b/libguile/Makefile.am
@@ -165,7 +165,6 @@ address@hidden@_la_SOURCES =                                
\
        hooks.c                                 \
        i18n.c                                  \
        init.c                                  \
-       inline.c                                \
        instructions.c                          \
        ioext.c                                 \
        keywords.c                              \
@@ -611,7 +610,6 @@ modinclude_HEADERS =                                \
        hooks.h                                 \
        i18n.h                                  \
        init.h                                  \
-       inline.h                                \
        instructions.h                          \
        ioext.h                                 \
        iselect.h                               \
diff --git a/libguile/__scm.h b/libguile/__scm.h
index 31e3952..8e56fb8 100644
--- a/libguile/__scm.h
+++ b/libguile/__scm.h
@@ -162,64 +162,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
@@ -504,17 +446,6 @@ typedef long SCM_STACKITEM;
 
 
 
-/* Define SCM_C_INLINE_KEYWORD so that it can be used as a replacement
-   for the "inline" keyword, expanding to nothing when "inline" is not
-   available.
-*/
-
-#ifdef SCM_C_INLINE
-#define SCM_C_INLINE_KEYWORD SCM_C_INLINE
-#else
-#define SCM_C_INLINE_KEYWORD
-#endif
-
 /* Handling thread-local storage (TLS).  */
 
 #ifdef SCM_HAVE_THREAD_STORAGE_CLASS
diff --git a/libguile/_scm.h b/libguile/_scm.h
index 60ad082..363f299 100644
--- a/libguile/_scm.h
+++ b/libguile/_scm.h
@@ -85,7 +85,6 @@
 #include "libguile/programs.h" /* ... and program.h. */
 #include "libguile/variable.h"
 #include "libguile/modules.h"
-#include "libguile/inline.h"
 #include "libguile/strings.h"
 
 /* ASYNC_TICK after finding EINTR in order to handle pending signals, if
diff --git a/libguile/array-handle.c b/libguile/array-handle.c
index 89277d9..ade01f2 100644
--- a/libguile/array-handle.c
+++ b/libguile/array-handle.c
@@ -261,6 +261,9 @@ scm_array_handle_pos (scm_t_array_handle *h, SCM indices)
   return pos;
 }
 
+extern inline SCM scm_array_handle_ref (scm_t_array_handle *h, ssize_t pos);
+extern inline void scm_array_handle_set (scm_t_array_handle *h, ssize_t pos, 
SCM val);
+
 static void
 check_array_index_bounds (scm_t_array_dim *dim, ssize_t idx)
 {
diff --git a/libguile/array-handle.h b/libguile/array-handle.h
index a623b4e..6835c47 100644
--- a/libguile/array-handle.h
+++ b/libguile/array-handle.h
@@ -100,13 +100,7 @@ SCM_API const SCM* scm_array_handle_elements 
(scm_t_array_handle *h);
 SCM_API SCM* scm_array_handle_writable_elements (scm_t_array_handle *h);
 
 
-SCM_INLINE SCM scm_array_handle_ref (scm_t_array_handle *h, ssize_t pos);
-SCM_INLINE void scm_array_handle_set (scm_t_array_handle *h, ssize_t pos, SCM 
val);
-
-#if SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES
-/* Either inlining, or being included from inline.c.  */
-
-SCM_INLINE_IMPLEMENTATION SCM
+inline SCM
 scm_array_handle_ref (scm_t_array_handle *h, ssize_t p)
 {
   if (SCM_UNLIKELY (p < 0 && ((size_t)-p) > h->base))
@@ -116,7 +110,7 @@ scm_array_handle_ref (scm_t_array_handle *h, ssize_t p)
   return h->vref (h->vector, h->base + p);
 }
 
-SCM_INLINE_IMPLEMENTATION void
+inline void
 scm_array_handle_set (scm_t_array_handle *h, ssize_t p, SCM v)
 {
   if (SCM_UNLIKELY (p < 0 && ((size_t)-p) > h->base))
@@ -126,8 +120,6 @@ scm_array_handle_set (scm_t_array_handle *h, ssize_t p, SCM 
v)
   h->vset (h->vector, h->base + p, v);
 }
 
-#endif
-
 
 SCM_INTERNAL void scm_init_array_handle (void);
 
diff --git a/libguile/gc.c b/libguile/gc.c
index b75a688..8274678 100644
--- a/libguile/gc.c
+++ b/libguile/gc.c
@@ -89,6 +89,12 @@ int scm_debug_cells_gc_interval = 0;
 static SCM scm_protects;
 
 
+extern inline SCM scm_cell (scm_t_bits car, scm_t_bits cdr);
+extern inline SCM scm_double_cell (scm_t_bits car, scm_t_bits cbr,
+                                   scm_t_bits ccr, scm_t_bits cdr);
+extern inline SCM scm_words (scm_t_bits car, scm_t_uint32 n_words);
+
+
 #if (SCM_DEBUG_CELL_ACCESSES == 1)
 
 
diff --git a/libguile/gc.h b/libguile/gc.h
index 8b3ae79..a31a8fd 100644
--- a/libguile/gc.h
+++ b/libguile/gc.h
@@ -192,14 +192,7 @@ SCM_API char *scm_gc_strndup (const char *str, size_t n, 
const char *what)
 #endif
 
 
-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);
-
-#if SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES
-
-SCM_INLINE_IMPLEMENTATION SCM
+inline SCM
 scm_cell (scm_t_bits car, scm_t_bits cdr)
 {
   SCM cell = SCM_PACK_POINTER (SCM_GC_MALLOC (sizeof (scm_t_cell)));
@@ -214,7 +207,7 @@ scm_cell (scm_t_bits car, scm_t_bits cdr)
   return cell;
 }
 
-SCM_INLINE_IMPLEMENTATION SCM
+inline SCM
 scm_double_cell (scm_t_bits car, scm_t_bits cbr,
                 scm_t_bits ccr, scm_t_bits cdr)
 {
@@ -254,7 +247,7 @@ scm_double_cell (scm_t_bits car, scm_t_bits cbr,
   return z;
 }
 
-SCM_INLINE_IMPLEMENTATION SCM
+inline SCM
 scm_words (scm_t_bits car, scm_t_uint32 n_words)
 {
   SCM z;
@@ -287,8 +280,6 @@ scm_words (scm_t_bits car, scm_t_uint32 n_words)
   return z;
 }
 
-#endif /* SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES */
-
 SCM_API void scm_remember_upto_here_1 (SCM obj);
 SCM_API void scm_remember_upto_here_2 (SCM obj1, SCM obj2);
 SCM_API void scm_remember_upto_here (SCM obj1, ...);
diff --git a/libguile/inline.c b/libguile/inline.c
deleted file mode 100644
index 6e7688c..0000000
--- a/libguile/inline.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Copyright (C) 2001, 2006, 2008, 2011, 2012, 2013 Free Software Foundation, 
Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 3 of
- * the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#define SCM_IMPLEMENT_INLINES 1
-#define SCM_INLINE_C_IMPLEMENTING_INLINES 1
-#include "libguile/inline.h"
-#include "libguile/array-handle.h"
-#include "libguile/gc.h"
-#include "libguile/smob.h"
-#include "libguile/pairs.h"
-#include "libguile/ports.h"
diff --git a/libguile/inline.h b/libguile/inline.h
deleted file mode 100644
index 3c9b09b..0000000
--- a/libguile/inline.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* classes: h_files */
-
-#ifndef SCM_INLINE_H
-#define SCM_INLINE_H
-
-/* Copyright (C) 2001, 2002, 2003, 2004, 2006, 2008, 2009, 2010,
- *   2011, 2012, 2013 Free Software Foundation, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 3 of
- * the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA
- */
-
-/* This file is for inline functions.  On platforms that don't support
-   inlining functions, they are turned into ordinary functions.  On
-   platforms that do support inline functions, the definitions are still
-   compiled into the library, once, in inline.c.  */
-
-#include "libguile/__scm.h"
-
-#include "libguile/gc.h"
-#include "libguile/threads.h"
-#include "libguile/array-handle.h"
-#include "libguile/ports.h"
-#include "libguile/numbers.h"
-#include "libguile/error.h"
-
-
-SCM_INLINE int scm_is_string (SCM x);
-
-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);
-
-#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
-#endif
diff --git a/libguile/numbers.c b/libguile/numbers.c
index d0f6e62..dfc247c 100644
--- a/libguile/numbers.c
+++ b/libguile/numbers.c
@@ -418,7 +418,7 @@ scm_i_normbig (SCM b)
   return b;
 }
 
-static SCM_C_INLINE_KEYWORD SCM
+static inline SCM
 scm_i_mpz2num (mpz_t b)
 {
   /* convert a mpz number to a SCM number. */
diff --git a/libguile/pairs.c b/libguile/pairs.c
index 764458e..46a27c0 100644
--- a/libguile/pairs.c
+++ b/libguile/pairs.c
@@ -68,6 +68,11 @@ void scm_error_pair_access (SCM non_pair)
 
 #endif
 
+extern inline int scm_is_pair (SCM x);
+extern inline SCM scm_cons (SCM x, SCM y);
+extern inline SCM scm_car (SCM x);
+extern inline SCM scm_cdr (SCM x);
+
 SCM 
 scm_cons2 (SCM w, SCM x, SCM y)
 {
diff --git a/libguile/pairs.h b/libguile/pairs.h
index 130bf28..113e59b 100644
--- a/libguile/pairs.h
+++ b/libguile/pairs.h
@@ -117,22 +117,16 @@
 SCM_API void scm_error_pair_access (SCM);
 #endif
 
-SCM_INLINE int scm_is_pair (SCM x);
-SCM_INLINE SCM scm_cons (SCM x, SCM y);
-SCM_INLINE SCM scm_car (SCM x);
-SCM_INLINE SCM scm_cdr (SCM x);
-
-#if SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES
 /* Return a newly allocated pair whose car is @var{x} and whose cdr is
    @var{y}.  The pair is guaranteed to be different (in the sense of
    @code{eq?}) from every previously existing object.  */
-SCM_INLINE_IMPLEMENTATION SCM
+inline SCM
 scm_cons (SCM x, SCM y)
 {
   return scm_cell (SCM_UNPACK (x), SCM_UNPACK (y));
 }
 
-SCM_INLINE_IMPLEMENTATION int
+inline int
 scm_is_pair (SCM x)
 {
   /* The following "workaround_for_gcc_295" avoids bad code generated by
@@ -159,7 +153,7 @@ scm_is_pair (SCM x)
   return SCM_I_CONSP (x);
 }
 
-SCM_INLINE_IMPLEMENTATION SCM
+inline SCM
 scm_car (SCM x)
 {
   if (SCM_UNLIKELY (!scm_is_pair (x)))
@@ -167,14 +161,13 @@ scm_car (SCM x)
   return SCM_CAR (x);
 }
 
-SCM_INLINE_IMPLEMENTATION SCM
+inline SCM
 scm_cdr (SCM x)
 {
   if (SCM_UNLIKELY (!scm_is_pair (x)))
     scm_wrong_type_arg_msg ("cdr", 0, x, "pair");
   return SCM_CDR (x);
 }
-#endif
 
 SCM_API SCM scm_cons2 (SCM w, SCM x, SCM y);
 SCM_API SCM scm_pair_p (SCM x);
diff --git a/libguile/smob.c b/libguile/smob.c
index 43ea613..5723242 100644
--- a/libguile/smob.c
+++ b/libguile/smob.c
@@ -42,6 +42,10 @@
 
 
 
+extern inline SCM scm_new_smob (scm_t_bits tc, scm_t_bits);
+extern inline SCM scm_new_double_smob (scm_t_bits tc, scm_t_bits,
+                                       scm_t_bits, scm_t_bits);
+
 /* scm_smobs scm_numsmob
  * implement a fixed sized array of smob records.
  * Indexes into this table are used when generating type
diff --git a/libguile/smob.h b/libguile/smob.h
index 561a6d1..ea7b3dc 100644
--- a/libguile/smob.h
+++ b/libguile/smob.h
@@ -67,13 +67,7 @@ SCM_API SCM scm_i_new_smob (scm_t_bits tc, scm_t_bits);
 SCM_API SCM scm_i_new_double_smob (scm_t_bits tc, scm_t_bits,
                                    scm_t_bits, scm_t_bits);
 
-
-SCM_INLINE SCM scm_new_smob (scm_t_bits tc, scm_t_bits);
-SCM_INLINE SCM scm_new_double_smob (scm_t_bits tc, scm_t_bits,
-                                    scm_t_bits, scm_t_bits);
-
-#if SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES
-SCM_INLINE_IMPLEMENTATION SCM
+inline SCM
 scm_new_smob (scm_t_bits tc, scm_t_bits data)
 {
   scm_t_bits smobnum = SCM_TC2SMOBNUM (tc);
@@ -84,7 +78,7 @@ scm_new_smob (scm_t_bits tc, scm_t_bits data)
     return scm_cell (tc, data);
 }
 
-SCM_INLINE_IMPLEMENTATION SCM
+inline SCM
 scm_new_double_smob (scm_t_bits tc, scm_t_bits data1,
                      scm_t_bits data2, scm_t_bits data3)
 {
@@ -95,7 +89,6 @@ scm_new_double_smob (scm_t_bits tc, scm_t_bits data1,
   else
     return scm_double_cell (tc, data1, data2, data3);
 }
-#endif
 
 #define SCM_NEWSMOB(z, tc, data)                \
   z = scm_new_smob ((tc), (scm_t_bits)(data))
diff --git a/libguile/socket.c b/libguile/socket.c
index 37e9f52..aff4113 100644
--- a/libguile/socket.c
+++ b/libguile/socket.c
@@ -961,7 +961,7 @@ SCM_DEFINE (scm_listen, "listen", 2, 0, 0,
 #undef FUNC_NAME
 
 /* Put the components of a sockaddr into a new SCM vector.  */
-static SCM_C_INLINE_KEYWORD SCM
+static inline SCM
 _scm_from_sockaddr (const scm_t_max_sockaddr *address, unsigned addr_size,
                    const char *proc)
 {
diff --git a/libguile/strings.c b/libguile/strings.c
index 232ddf9..f5f5b18 100644
--- a/libguile/strings.c
+++ b/libguile/strings.c
@@ -78,6 +78,8 @@ SCM_SYMBOL (sym_error, "error");
  * strings.
  */
 
+inline int scm_is_string (SCM x);
+
 /* The size in words of the stringbuf header (type tag + size).  */
 #define STRINGBUF_HEADER_SIZE   2U
 
diff --git a/libguile/strings.h b/libguile/strings.h
index 882e7ce..4128807 100644
--- a/libguile/strings.h
+++ b/libguile/strings.h
@@ -90,6 +90,12 @@
      no wide version of this interface.
 */
 
+inline int
+scm_is_string (SCM x)
+{
+  return SCM_HAS_TYP7 (x, scm_tc7_string);
+}
+
 /* A type indicating what strategy to take when string locale
    conversion is unsuccessful.  */
 typedef enum
diff --git a/libguile/strorder.c b/libguile/strorder.c
index a51ce17..2695eb0 100644
--- a/libguile/strorder.c
+++ b/libguile/strorder.c
@@ -31,7 +31,7 @@
 #include "libguile/srfi-13.h"
 
 
-SCM_C_INLINE_KEYWORD static SCM
+static inline SCM
 srfi13_cmp (SCM s1, SCM s2, SCM (*cmp) (SCM, SCM, SCM, SCM, SCM, SCM))
 {
   if (scm_is_true (cmp (s1, s2,
-- 
2.9.3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]