mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-07-02 23:50:47 +02:00
Switch unboxed-fields bitmask to be a Scheme integer
Requires a full rebuild!! * libguile/struct.h (SCM_VTABLE_UNBOXED_FIELDS): (SCM_VTABLE_FIELD_IS_UNBOXED): Use logbit? to determine if a field is unboxed. * module/language/cps/guile-vm/lower-primcalls.scm (vtable-has-unboxed-fields?): Just check against SCM_INUM0. (vtable-field-boxed?): Likewise, the bitmask is an integer. * libguile/struct.c (set_vtable_access_fields): Set UNBOXED_FIELDS bitmask as integer.
This commit is contained in:
parent
1c092eb413
commit
bd1e5ff688
3 changed files with 68 additions and 60 deletions
|
@ -128,7 +128,7 @@ set_vtable_access_fields (SCM vtable)
|
|||
size_t len, nfields;
|
||||
SCM layout;
|
||||
const char *c_layout;
|
||||
uint32_t *unboxed_fields;
|
||||
SCM unboxed_fields = SCM_INUM0;
|
||||
|
||||
layout = SCM_VTABLE_LAYOUT (vtable);
|
||||
c_layout = scm_i_symbol_chars (layout);
|
||||
|
@ -137,25 +137,16 @@ set_vtable_access_fields (SCM vtable)
|
|||
assert (len % 2 == 0);
|
||||
nfields = len / 2;
|
||||
|
||||
if (nfields)
|
||||
{
|
||||
size_t bitmask_size = (nfields + 31U) / 32U;
|
||||
unboxed_fields =
|
||||
scm_allocate_pointerless (SCM_I_CURRENT_THREAD,
|
||||
bitmask_size * sizeof (*unboxed_fields));
|
||||
memset (unboxed_fields, 0, bitmask_size * sizeof (*unboxed_fields));
|
||||
for (size_t field = 0; field < nfields; field++)
|
||||
if (c_layout[field*2] == 'u')
|
||||
unboxed_fields[field/32U] |= 1U << (field%32U);
|
||||
}
|
||||
else
|
||||
unboxed_fields = NULL;
|
||||
for (size_t field = 0; field < nfields; field++)
|
||||
if (c_layout[field*2] == 'u')
|
||||
unboxed_fields = scm_logior (unboxed_fields,
|
||||
scm_ash (SCM_INUM1,
|
||||
scm_from_size_t (field)));
|
||||
|
||||
/* Record computed size of vtable's instances. */
|
||||
SCM_SET_VTABLE_FLAGS (vtable, 0);
|
||||
SCM_STRUCT_DATA_SET (vtable, scm_vtable_index_size, nfields);
|
||||
SCM_STRUCT_DATA_SET (vtable, scm_vtable_index_unboxed_fields,
|
||||
(uintptr_t) unboxed_fields);
|
||||
SCM_STRUCT_SLOT_SET (vtable, scm_vtable_index_unboxed_fields, unboxed_fields);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -200,8 +200,8 @@ scm_i_struct_set_raw (struct scm_struct *x, size_t idx, scm_t_bits val)
|
|||
#define SCM_VTABLE_NAME(X) (SCM_STRUCT_SLOT_REF (X, scm_vtable_index_name))
|
||||
#define SCM_SET_VTABLE_NAME(X,V) (SCM_STRUCT_SLOT_SET (X, scm_vtable_index_name, V))
|
||||
#define SCM_VTABLE_SIZE(X) (SCM_STRUCT_DATA_REF (X, scm_vtable_index_size))
|
||||
#define SCM_VTABLE_UNBOXED_FIELDS(X) ((uint32_t*) SCM_STRUCT_DATA_REF (X, scm_vtable_index_unboxed_fields))
|
||||
#define SCM_VTABLE_FIELD_IS_UNBOXED(X,F) (SCM_VTABLE_UNBOXED_FIELDS (X)[(F)>>5]&(1U<<((F)&31)))
|
||||
#define SCM_VTABLE_UNBOXED_FIELDS(X) (SCM_STRUCT_SLOT_REF (X, scm_vtable_index_unboxed_fields))
|
||||
#define SCM_VTABLE_FIELD_IS_UNBOXED(X,F) (scm_is_true (scm_logbit_p (SCM_I_MAKINUM (F), SCM_VTABLE_UNBOXED_FIELDS (X))))
|
||||
|
||||
#define SCM_STRUCT_VTABLE(X) (SCM_PACK (SCM_CELL_WORD_0 (X) - scm_tc3_struct))
|
||||
#define SCM_STRUCT_LAYOUT(X) (SCM_VTABLE_LAYOUT (SCM_STRUCT_VTABLE (X)))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue