From 695207be68cbc634f1e2207cebff6b32a0a06ad7 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 18 Jun 2025 23:24:55 +0900 Subject: [PATCH] hash.c (mrb_obj_hash_code): expose hash function --- include/mruby/internal.h | 1 + src/hash.c | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/include/mruby/internal.h b/include/mruby/internal.h index 44c72d174..254c864ea 100644 --- a/include/mruby/internal.h +++ b/include/mruby/internal.h @@ -84,6 +84,7 @@ size_t mrb_hash_memsize(mrb_value obj); size_t mrb_gc_mark_hash(mrb_state*, struct RHash*); void mrb_gc_free_hash(mrb_state*, struct RHash*); mrb_value mrb_hash_first_key(mrb_state*, mrb_value); +uint32_t mrb_obj_hash_code(mrb_state *mrb, mrb_value key); /* irep */ struct mrb_insn_data mrb_decode_insn(const mrb_code *pc); diff --git a/src/hash.c b/src/hash.c index f376bd961..526f101f3 100644 --- a/src/hash.c +++ b/src/hash.c @@ -310,8 +310,8 @@ h_check_modified_validate(mrb_state *mrb, struct h_check_modified *checker, stru } } -static uint32_t -obj_hash_code(mrb_state *mrb, mrb_value key, struct RHash *h) +uint32_t +mrb_obj_hash_code(mrb_state *mrb, mrb_value key) { enum mrb_vtype tt = mrb_type(key); uint32_t hash_code; @@ -337,16 +337,24 @@ obj_hash_code(mrb_state *mrb, mrb_value key, struct RHash *h) hash_code = U32(mrb_obj_id(key)); break; default: - H_CHECK_MODIFIED(mrb, h) { - hash_code_obj = mrb_funcall_argv(mrb, key, MRB_SYM(hash), 0, NULL); - } - + hash_code_obj = mrb_funcall_argv(mrb, key, MRB_SYM(hash), 0, NULL); hash_code = U32(tt) ^ U32(mrb_integer(hash_code_obj)); break; } return hash_code ^ (hash_code << 2) ^ (hash_code >> 2); } +static uint32_t +obj_hash_code(mrb_state *mrb, mrb_value key, struct RHash *h) +{ + uint32_t hash_code; + + H_CHECK_MODIFIED(mrb, h) { + hash_code = mrb_obj_hash_code(mrb, key); + } + return hash_code; +} + static mrb_bool obj_eql(mrb_state *mrb, mrb_value a, mrb_value b, struct RHash *h) {