From ae0a179c4bb13c64584bc07b29372723d1d6c4fa Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 31 Jan 2021 12:50:29 +0900 Subject: [PATCH] Narrowed down the condition to pack RValue Because of `double` in `RFloat`, `RValue` would be packed by `sizeof(double)` by default, on platforms where `double` is wider than `VALUE`. Size of `RValue` is multiple of 5 now. --- gc.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gc.c b/gc.c index c407293f8d..fa294b1f99 100644 --- a/gc.c +++ b/gc.c @@ -552,8 +552,8 @@ struct RMoved { #define RMOVED(obj) ((struct RMoved *)(obj)) -#if defined(_MSC_VER) || defined(__CYGWIN__) -#pragma pack(push, 1) /* magic for reducing sizeof(RVALUE): 24 -> 20 */ +#if (SIZEOF_DOUBLE > SIZEOF_VALUE) && (defined(_MSC_VER) || defined(__CYGWIN__)) +#pragma pack(push, 4) /* == SIZEOF_VALUE: magic for reducing sizeof(RVALUE): 24 -> 20 */ #endif typedef struct RVALUE { @@ -604,10 +604,12 @@ typedef struct RVALUE { #endif } RVALUE; -#if defined(_MSC_VER) || defined(__CYGWIN__) +#if (SIZEOF_DOUBLE > SIZEOF_VALUE) && (defined(_MSC_VER) || defined(__CYGWIN__)) #pragma pack(pop) #endif +STATIC_ASSERT(sizeof_rvalue, sizeof(RVALUE) == 5*SIZEOF_VALUE); + typedef uintptr_t bits_t; enum { BITS_SIZE = sizeof(bits_t),