From: Kaz Wesley Date: Sat, 10 Feb 2018 02:15:50 +0000 (-0800) Subject: Endian-aware FIX32 layout. X-Git-Url: https://jxself.org/git/?a=commitdiff_plain;h=56694525a0ce70e971de1f145c714a30ecce6742;hp=6329da4e468e5429ad2d56eb274edaac72704cab;p=muddle-interpreter.git Endian-aware FIX32 layout. Allows upcasting a FIX32 by reading it as if it were a FIX64. Signed-off-by: Kaz Wesley --- diff --git a/src/object.h b/src/object.h index 54281f2..56f17b6 100644 --- a/src/object.h +++ b/src/object.h @@ -122,8 +122,17 @@ typedef union object object; typedef struct { - alignas (8) uint32_t _pad; + alignas (8) + // layout so that value can be upcast by reinterpreting as a fix64 +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + int32_t n; + uint32_t _pad; +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + uint32_t _pad; int32_t n; +#else +#error Unusual endianness? +#endif } fix32_val; typedef struct { @@ -410,6 +419,13 @@ object *stack_push (vector_object * v); Checked downcasts. */ +static inline fix32_object * +as_fix32 (object * o) +{ + assert (TYPEPRIM_EQ (o->type, TYPEPRIM_FIX32)); + return &o->fix32; +} + static inline list_object * as_list (object * o) {