From 3a6f51ee35da5d49973aba8f7d8128a65a9d8c4a Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Thu, 1 Aug 2019 16:04:40 +0900 Subject: introduce ar_hint_t. Hash hint for ar_array is 1 byte (unsigned char). This patch introduce ar_hint_t which represents hint type. --- internal.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'internal.h') diff --git a/internal.h b/internal.h index 832428bd03..fac8ece2a5 100644 --- a/internal.h +++ b/internal.h @@ -817,7 +817,7 @@ struct RComplex { enum ruby_rhash_flags { RHASH_PROC_DEFAULT = FL_USER2, /* FL 2 */ RHASH_ST_TABLE_FLAG = FL_USER3, /* FL 3 */ - RHASH_AR_TABLE_MAX_SIZE = 8, +#define RHASH_AR_TABLE_MAX_SIZE SIZEOF_VALUE RHASH_AR_TABLE_SIZE_MASK = (FL_USER4|FL_USER5|FL_USER6|FL_USER7), /* FL 4..7 */ RHASH_AR_TABLE_SIZE_SHIFT = (FL_USHIFT+4), RHASH_AR_TABLE_BOUND_MASK = (FL_USER8|FL_USER9|FL_USER10|FL_USER11), /* FL 8..11 */ @@ -875,6 +875,14 @@ void rb_hash_st_table_set(VALUE hash, st_table *st); #define RHASH_UNSET_TRANSIENT_FLAG(h) ((void)0) #endif +#if SIZEOF_VALUE / RHASH_AR_TABLE_MAX_SIZE == 2 +typedef uint16_t ar_hint_t; +#elif SIZEOF_VALUE / RHASH_AR_TABLE_MAX_SIZE == 1 +typedef unsigned char ar_hint_t; +#else +#error unsupported +#endif + struct RHash { struct RBasic basic; union { @@ -883,7 +891,7 @@ struct RHash { } as; const VALUE ifnone; union { - unsigned char ary[sizeof(VALUE)]; + ar_hint_t ary[RHASH_AR_TABLE_MAX_SIZE]; VALUE word; } ar_hint; }; -- cgit v1.2.3