Hi,

On Tue 30 Jun 2009 00:23, l...@gnu.org (Ludovic Courtès) writes:

> "Andy Wingo" <wi...@pobox.com> writes:
>
>> +#define BV_FIXABLE_INT_REF(stem, fn_stem, type, size)                   \
>> +{                                                                       \
>> +  long i;                                                               \
>> +  ARGS2 (bv, idx);                                                      \
>> +  VM_VALIDATE_BYTEVECTOR (bv);                                          \
>> +  if (SCM_LIKELY (SCM_I_INUMP (idx)                                     \
>> +                  && ((i = SCM_I_INUM (idx)) >= 0)                        \
>> +                  && (i < SCM_BYTEVECTOR_LENGTH (bv))                   \
>> +                  && (i % size == 0)))                                  \
>> +    RETURN (SCM_I_MAKINUM (*(scm_t_##type*)                             \
>> +                           (SCM_BYTEVECTOR_CONTENTS (bv) + i)));        \
>
> Did you test this on SPARC or some such?  I'm 90% sure
> `(bv-u32-ref bv 1)' would lead to SIGBUS there, due to the unaligned access.
> This is why `INTEGER_REF ()' in `bytevectors.c' uses memcpy(3).

Wouldn't the i % size == 0 case catch that? (This is used in native-ref
instructions) 

>> +  else                                                                  \
>> +    RETURN (scm_bytevector_##fn_stem##_ref (bv, idx));                  \
>
> In this case, we pay the overhead twice (type-checking et al.).

It's probably an error -- idx is not an inum, is out of range, or is
unaligned...

> Given that there's some duplication with `bytevectors.c', maybe we could
> share some of the accessor macros between both files?

Perhaps! The one difference is that we can fast-path only the normal
cases here, calling out to those functions to handle stranger things
(like unaligned access).

Andy
-- 
http://wingolog.org/


Reply via email to