mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
hash.c (mrb_obj_hash_code): expose hash function
This commit is contained in:
@@ -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);
|
||||
|
||||
+14
-6
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user