summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hash.c13
-rw-r--r--internal.h2
2 files changed, 6 insertions, 9 deletions
diff --git a/hash.c b/hash.c
index ade10e2a62..76e367c30e 100644
--- a/hash.c
+++ b/hash.c
@@ -347,15 +347,12 @@ empty_entry(li_table_entry *entry)
return entry->hash == 0;
}
-#define RHASH_ARRAY_SIZE_RAW(h) \
- ((long)((RBASIC(h)->flags & RHASH_ARRAY_SIZE_MASK) >> RHASH_ARRAY_SIZE_SHIFT))
-
#define RHASH_ARRAY_SIZE(h) (HASH_ASSERT(RHASH_ARRAY_P(h)), \
RHASH_ARRAY_SIZE_RAW(h))
#define RHASH_ARRAY_BOUND_RAW(h) \
- ((long)((RBASIC(h)->flags >> RHASH_ARRAY_BOUND_SHIFT) & \
- (RHASH_ARRAY_BOUND_MASK >> RHASH_ARRAY_BOUND_SHIFT)))
+ ((int)((RBASIC(h)->flags >> RHASH_ARRAY_BOUND_SHIFT) & \
+ (RHASH_ARRAY_BOUND_MASK >> RHASH_ARRAY_BOUND_SHIFT)))
#define RHASH_ARRAY_BOUND(h) (HASH_ASSERT(RHASH_ARRAY_P(h)), \
RHASH_ARRAY_BOUND_RAW(h))
@@ -949,11 +946,11 @@ linear_shift(VALUE hash, st_data_t *key, st_data_t *value)
return 0;
}
-static int
+static long
linear_keys(VALUE hash, st_data_t *keys, st_index_t size)
{
uint8_t i, bound = RHASH_ARRAY_BOUND(hash);
- st_data_t *keys_start = keys, *keys_end = keys_end;
+ st_data_t *keys_start = keys, *keys_end = keys + size;
for (i = 0; i < bound; i++) {
if (keys == keys_end) {
@@ -969,7 +966,7 @@ linear_keys(VALUE hash, st_data_t *keys, st_index_t size)
return keys - keys_start;
}
-static int
+static long
linear_values(VALUE hash, st_data_t *values, st_index_t size)
{
uint8_t i, bound = RHASH_ARRAY_BOUND(hash);
diff --git a/internal.h b/internal.h
index 7224346b99..219f5e2aea 100644
--- a/internal.h
+++ b/internal.h
@@ -686,7 +686,7 @@ enum ruby_rhash_flags {
#define HASH_PROC_DEFAULT FL_USER2
#define RHASH_ARRAY_SIZE_RAW(h) \
- ((long)((RBASIC(h)->flags & RHASH_ARRAY_SIZE_MASK) >> RHASH_ARRAY_SIZE_SHIFT))
+ ((int)((RBASIC(h)->flags & RHASH_ARRAY_SIZE_MASK) >> RHASH_ARRAY_SIZE_SHIFT))
int rb_hash_array_p(VALUE hash);
struct li_table *rb_hash_array(VALUE hash);