summaryrefslogtreecommitdiff
path: root/hash.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2023-08-03 02:02:47 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2023-08-03 13:17:41 +0900
commit8f2bbbbcaf4b0b1686a40c4a1c7dd1909d307d40 (patch)
tree46f301db6d8773f6832450027d619544d47cbac5 /hash.c
parentfe977314d5a9fdf721584c0396e1040960d78000 (diff)
Add assertion in `RHASH_AR_TABLE_BOUND`
Diffstat (limited to 'hash.c')
-rw-r--r--hash.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/hash.c b/hash.c
index 4bf5fdef61..6a4c9633e6 100644
--- a/hash.c
+++ b/hash.c
@@ -461,14 +461,20 @@ ar_set_entry(VALUE hash, unsigned int index, st_data_t key, st_data_t val, st_ha
((unsigned int)((RBASIC(h)->flags >> RHASH_AR_TABLE_BOUND_SHIFT) & \
(RHASH_AR_TABLE_BOUND_MASK >> RHASH_AR_TABLE_BOUND_SHIFT)))
-#define RHASH_AR_TABLE_BOUND(h) (HASH_ASSERT(RHASH_AR_TABLE_P(h)), \
- RHASH_AR_TABLE_BOUND_RAW(h))
-
#define RHASH_ST_TABLE_SET(h, s) rb_hash_st_table_set(h, s)
#define RHASH_TYPE(hash) (RHASH_AR_TABLE_P(hash) ? &objhash : RHASH_ST_TABLE(hash)->type)
#define HASH_ASSERT(expr) RUBY_ASSERT_MESG_WHEN(HASH_DEBUG, expr, #expr)
+static inline unsigned int
+RHASH_AR_TABLE_BOUND(VALUE h)
+{
+ HASH_ASSERT(RHASH_AR_TABLE_P(h));
+ const unsigned int bound = RHASH_AR_TABLE_BOUND_RAW(h);
+ HASH_ASSERT(bound <= RHASH_AR_TABLE_MAX_SIZE);
+ return bound;
+}
+
#if HASH_DEBUG
#define hash_verify(hash) hash_verify_(hash, __FILE__, __LINE__)
@@ -481,7 +487,7 @@ rb_hash_dump(VALUE hash)
unsigned i, n = 0, bound = RHASH_AR_TABLE_BOUND(hash);
fprintf(stderr, " size:%u bound:%u\n",
- RHASH_AR_TABLE_SIZE(hash), RHASH_AR_TABLE_BOUND(hash));
+ RHASH_AR_TABLE_SIZE(hash), bound);
for (i=0; i<bound; i++) {
st_data_t k, v;