summaryrefslogtreecommitdiffhomepage
path: root/src/hash.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-04-13 18:26:13 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-04-13 18:26:13 +0900
commit8d95e5a0de77afc36f3b6fca6eb4744810e71b7e (patch)
tree90a285d15b670e8c8fe56f9f2b7b9a3f2b9c6d2d /src/hash.c
parent6d6ae570cb63ad33cf27f88b89ad6754bf6b027c (diff)
downloadmruby-8d95e5a0de77afc36f3b6fca6eb4744810e71b7e.tar.gz
mruby-8d95e5a0de77afc36f3b6fca6eb4744810e71b7e.zip
use kh_put2 in mrb_hash_set for performance improvement
Diffstat (limited to 'src/hash.c')
-rw-r--r--src/hash.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/hash.c b/src/hash.c
index 0090dc5dd..985d5259a 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -204,21 +204,23 @@ mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val)
{
khash_t(ht) *h;
khiter_t k;
+ int r;
mrb_hash_modify(mrb, hash);
h = RHASH_TBL(hash);
if (!h) h = RHASH_TBL(hash) = kh_init(ht, mrb);
- k = kh_get(ht, mrb, h, key);
- if (k == kh_end(h)) {
+ k = kh_put2(ht, mrb, h, key, &r);
+ kh_value(h, k).v = val;
+
+ if (r != 0) {
/* expand */
int ai = mrb_gc_arena_save(mrb);
- k = kh_put(ht, mrb, h, KEY(key));
+ kh_key(h, k) = KEY(key);
mrb_gc_arena_restore(mrb, ai);
kh_value(h, k).n = kh_size(h)-1;
}
- kh_value(h, k).v = val;
mrb_write_barrier(mrb, (struct RBasic*)RHASH(hash));
return;
}