mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 03:40:34 +02:00
Currently failing some guardian tests. * libguile/tags.h: Refactor tagging so that tc3 bits for a pair live in the SCM value, not in the heap words. Do the same for structs. This more rational tagging strategy will make native code generation easier. Note that this means that to check a heap pointer for its type, you first have to ensure that it has the expected tc3, as not all the type bits are on the heap. (SCM_TYP3): Check the SCM tag type, not the bits in the cell. (SCM_HAS_TYP3): New helper. (SCM_I_CONSP): Redefine to just check the typ3. (scm_tcs_cons_imcar, scm_tcs_cons_nimcar, scm_tcs_struct): Remove, as they are no longer necessary. * libguile/array-handle.c (scm_i_array_implementation_for_obj): Check for heap objects before checking type bits, so we don't check pairs. * libguile/evalext.c (scm_self_evaluating_p): * libguile/gc.c (scm_i_tag_name): * libguile/goops.c (scm_class_of) * libguile/hash.c (scm_hasher): * libguile/print.c (iprin1): Adapt to tagging changes. * libguile/gc.c (scm_storage_prehistory): Register all displacements here. There are the same displacements as before, unfortunately. * libguile/list.c (SCM_I_CONS): * libguile/pairs.c (scm_cons): * libguile/pairs.h (scm_is_pair): * libguile/vm-engine.h (CONS): Tag pairs with scm_tc3_pair. * libguile/modules.c (scm_post_boot_init_modules): * libguile/modules.h (SCM_MODULEP): * libguile/struct.c (struct_finalizer_trampoline, scm_i_alloc_struct): (scm_make_vtable_vtable): * libguile/struct.h (SCM_STRUCTP, SCM_STRUCT_VTABLE_DATA): (SCM_STRUCT_VTABLE_SLOTS): * libguile/vm-i-scheme.c (make-struct): Adapt to struct tagging changes. * libguile/numbers.h (SCM_I_INUMP): * module/rnrs/arithmetic/fixnums.scm (fixnum?, inline-fixnum?): Adapt to the new fixnum tag. * libguile/numbers.h (SCM_INEXACTP): Make sure of the tc3 before looking at the cell type.
165 lines
4.6 KiB
C
165 lines
4.6 KiB
C
/* Copyright (C) 1995,1996,1997,1998,2000,2001,2002,2003,2004, 2005, 2006, 2009, 2011 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
|
||
|
||
#include "libguile/_scm.h"
|
||
#include "libguile/__scm.h"
|
||
|
||
#include "libguile/array-handle.h"
|
||
|
||
|
||
SCM scm_i_array_element_types[SCM_ARRAY_ELEMENT_TYPE_LAST + 1];
|
||
|
||
|
||
#define ARRAY_IMPLS_N_STATIC_ALLOC 7
|
||
static scm_t_array_implementation array_impls[ARRAY_IMPLS_N_STATIC_ALLOC];
|
||
static int num_array_impls_registered = 0;
|
||
|
||
|
||
void
|
||
scm_i_register_array_implementation (scm_t_array_implementation *impl)
|
||
{
|
||
if (num_array_impls_registered >= ARRAY_IMPLS_N_STATIC_ALLOC)
|
||
/* need to increase ARRAY_IMPLS_N_STATIC_ALLOC, buster */
|
||
abort ();
|
||
else
|
||
array_impls[num_array_impls_registered++] = *impl;
|
||
}
|
||
|
||
scm_t_array_implementation*
|
||
scm_i_array_implementation_for_obj (SCM obj)
|
||
{
|
||
int i;
|
||
|
||
if (!(SCM_HAS_TYP3 (obj, scm_tc3_heap)
|
||
|| SCM_HAS_TYP3 (obj, scm_tc3_struct)))
|
||
return NULL;
|
||
|
||
for (i = 0; i < num_array_impls_registered; i++)
|
||
if ((SCM_CELL_TYPE (obj) & array_impls[i].mask) == array_impls[i].tag)
|
||
return &array_impls[i];
|
||
return NULL;
|
||
}
|
||
|
||
void
|
||
scm_array_get_handle (SCM array, scm_t_array_handle *h)
|
||
{
|
||
scm_t_array_implementation *impl = scm_i_array_implementation_for_obj (array);
|
||
if (!impl)
|
||
scm_wrong_type_arg_msg (NULL, 0, array, "array");
|
||
h->array = array;
|
||
h->impl = impl;
|
||
h->base = 0;
|
||
h->ndims = 0;
|
||
h->dims = NULL;
|
||
h->element_type = SCM_ARRAY_ELEMENT_TYPE_SCM; /* have to default to
|
||
something... */
|
||
h->elements = NULL;
|
||
h->writable_elements = NULL;
|
||
h->impl->get_handle (array, h);
|
||
}
|
||
|
||
ssize_t
|
||
scm_array_handle_pos (scm_t_array_handle *h, SCM indices)
|
||
{
|
||
scm_t_array_dim *s = scm_array_handle_dims (h);
|
||
ssize_t pos = 0, i;
|
||
size_t k = scm_array_handle_rank (h);
|
||
|
||
while (k > 0 && scm_is_pair (indices))
|
||
{
|
||
i = scm_to_signed_integer (SCM_CAR (indices), s->lbnd, s->ubnd);
|
||
pos += (i - s->lbnd) * s->inc;
|
||
k--;
|
||
s++;
|
||
indices = SCM_CDR (indices);
|
||
}
|
||
if (k > 0 || !scm_is_null (indices))
|
||
scm_misc_error (NULL, "wrong number of indices, expecting ~a",
|
||
scm_list_1 (scm_from_size_t (scm_array_handle_rank (h))));
|
||
return pos;
|
||
}
|
||
|
||
SCM
|
||
scm_array_handle_element_type (scm_t_array_handle *h)
|
||
{
|
||
if (h->element_type < 0 || h->element_type > SCM_ARRAY_ELEMENT_TYPE_LAST)
|
||
abort (); /* guile programming error */
|
||
return scm_i_array_element_types[h->element_type];
|
||
}
|
||
|
||
void
|
||
scm_array_handle_release (scm_t_array_handle *h)
|
||
{
|
||
/* Nothing to do here until arrays need to be reserved for real.
|
||
*/
|
||
}
|
||
|
||
const SCM *
|
||
scm_array_handle_elements (scm_t_array_handle *h)
|
||
{
|
||
if (h->element_type != SCM_ARRAY_ELEMENT_TYPE_SCM)
|
||
scm_wrong_type_arg_msg (NULL, 0, h->array, "non-uniform array");
|
||
return ((const SCM*)h->elements) + h->base;
|
||
}
|
||
|
||
SCM *
|
||
scm_array_handle_writable_elements (scm_t_array_handle *h)
|
||
{
|
||
if (h->element_type != SCM_ARRAY_ELEMENT_TYPE_SCM)
|
||
scm_wrong_type_arg_msg (NULL, 0, h->array, "non-uniform array");
|
||
return ((SCM*)h->elements) + h->base;
|
||
}
|
||
|
||
void
|
||
scm_init_array_handle (void)
|
||
{
|
||
#define DEFINE_ARRAY_TYPE(tag, TAG) \
|
||
scm_i_array_element_types[SCM_ARRAY_ELEMENT_TYPE_##TAG] = scm_from_utf8_symbol (#tag)
|
||
|
||
scm_i_array_element_types[SCM_ARRAY_ELEMENT_TYPE_SCM] = SCM_BOOL_T;
|
||
DEFINE_ARRAY_TYPE (a, CHAR);
|
||
DEFINE_ARRAY_TYPE (b, BIT);
|
||
DEFINE_ARRAY_TYPE (vu8, VU8);
|
||
DEFINE_ARRAY_TYPE (u8, U8);
|
||
DEFINE_ARRAY_TYPE (s8, S8);
|
||
DEFINE_ARRAY_TYPE (u16, U16);
|
||
DEFINE_ARRAY_TYPE (s16, S16);
|
||
DEFINE_ARRAY_TYPE (u32, U32);
|
||
DEFINE_ARRAY_TYPE (s32, S32);
|
||
DEFINE_ARRAY_TYPE (u64, U64);
|
||
DEFINE_ARRAY_TYPE (s64, S64);
|
||
DEFINE_ARRAY_TYPE (f32, F32);
|
||
DEFINE_ARRAY_TYPE (f64, F64);
|
||
DEFINE_ARRAY_TYPE (c32, C32);
|
||
DEFINE_ARRAY_TYPE (c64, C64);
|
||
|
||
#include "libguile/array-handle.x"
|
||
}
|
||
|
||
/*
|
||
Local Variables:
|
||
c-file-style: "gnu"
|
||
End:
|
||
*/
|