summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2021-01-31 12:50:29 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2021-01-31 13:20:15 +0900
commitae0a179c4bb13c64584bc07b29372723d1d6c4fa (patch)
tree5a1d807aaa58c45ff2726a6399ca69b6e7d05447 /gc.c
parente1f475e13f728a793131c38d2177691e87f45d17 (diff)
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.
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c8
1 files 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),