Skip to content

Commit

Permalink
Hash function to avoid funcalls if possible
Browse files Browse the repository at this point in the history
  • Loading branch information
matz committed Mar 31, 2014
1 parent 2c3530f commit 4c29699
Showing 1 changed file with 33 additions and 1 deletion.
34 changes: 33 additions & 1 deletion src/hash.c
Expand Up @@ -55,7 +55,39 @@ mrb_hash_ht_hash_func(mrb_state *mrb, mrb_value key)
static inline khint_t
mrb_hash_ht_hash_equal(mrb_state *mrb, mrb_value a, mrb_value b)
{
return mrb_eql(mrb, a, b);
enum mrb_vtype t = mrb_type(a);

switch (t) {
case MRB_TT_STRING:
return mrb_str_equal(mrb, a, b);

case MRB_TT_SYMBOL:
if (mrb_type(b) != MRB_TT_SYMBOL) return FALSE;
return mrb_symbol(a) == mrb_symbol(b);

case MRB_TT_FIXNUM:
switch (mrb_type(b)) {
case MRB_TT_FIXNUM:
return mrb_fixnum(a) == mrb_fixnum(b);
case MRB_TT_FLOAT:
return (mrb_float)mrb_fixnum(a) == mrb_float(b);
default:
return FALSE;
}

case MRB_TT_FLOAT:
switch (mrb_type(b)) {
case MRB_TT_FIXNUM:
return mrb_float(a) == (mrb_float)mrb_fixnum(b);
case MRB_TT_FLOAT:
return mrb_float(a) == mrb_float(b);
default:
return FALSE;
}

default:
return mrb_eql(mrb, a, b);
}
}

KHASH_DECLARE(ht, mrb_value, mrb_value, 1)
Expand Down

0 comments on commit 4c29699

Please sign in to comment.