diff options
Diffstat (limited to 'libguile/inline.h')
-rw-r--r-- | libguile/inline.h | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/libguile/inline.h b/libguile/inline.h index 09a1b5a35..018e6c636 100644 --- a/libguile/inline.h +++ b/libguile/inline.h @@ -3,7 +3,7 @@ #ifndef SCM_INLINE_H #define SCM_INLINE_H -/* Copyright (C) 2001, 2002, 2003, 2004, 2006, 2008, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2002, 2003, 2004, 2006, 2008, 2009, 2010 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 @@ -87,6 +87,9 @@ SCM_API SCM scm_double_cell (scm_t_bits car, scm_t_bits cbr, scm_t_bits ccr, scm_t_bits cdr); SCM_API SCM scm_immutable_double_cell (scm_t_bits car, scm_t_bits cbr, scm_t_bits ccr, scm_t_bits cdr); +SCM_API SCM scm_words (scm_t_bits car, scm_t_uint16 n_words); +/* no immutable words for now, would require initialization at the same time as + allocation */ SCM_API SCM scm_array_handle_ref (scm_t_array_handle *h, ssize_t pos); SCM_API void scm_array_handle_set (scm_t_array_handle *h, ssize_t pos, SCM val); @@ -241,6 +244,42 @@ scm_immutable_double_cell (scm_t_bits car, scm_t_bits cbr, SCM_C_EXTERN_INLINE #endif SCM +scm_words (scm_t_bits car, scm_t_uint16 n_words) +{ + SCM z; + + z = SCM_PACK ((scm_t_bits) (GC_MALLOC (sizeof (scm_t_bits) * n_words))); + SCM_GC_SET_CELL_WORD (z, 0, car); + + /* FIXME: is the following concern even relevant with BDW-GC? */ + + /* When this function is inlined, it's possible that the last + SCM_GC_SET_CELL_WORD above will be adjacent to a following + initialization of z. E.g., it occurred in scm_make_real. GCC + from around version 3 (e.g., certainly 3.2) began taking + advantage of strict C aliasing rules which say that it's OK to + interchange the initialization above and the one below when the + pointer types appear to differ sufficiently. We don't want that, + of course. GCC allows this behaviour to be disabled with the + -fno-strict-aliasing option, but would also need to be supplied + by Guile users. Instead, the following statements prevent the + reordering. + */ +#ifdef __GNUC__ + __asm__ volatile ("" : : : "memory"); +#else + /* portable version, just in case any other compiler does the same + thing. */ + scm_remember_upto_here_1 (z); +#endif + + return z; +} + +#ifndef SCM_INLINE_C_INCLUDING_INLINE_H +SCM_C_EXTERN_INLINE +#endif +SCM scm_array_handle_ref (scm_t_array_handle *h, ssize_t p) { if (SCM_UNLIKELY (p < 0 && ((size_t)-p) > h->base)) |