diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-04-13 18:26:13 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-04-13 18:26:13 +0900 |
| commit | 8d95e5a0de77afc36f3b6fca6eb4744810e71b7e (patch) | |
| tree | 90a285d15b670e8c8fe56f9f2b7b9a3f2b9c6d2d /src/hash.c | |
| parent | 6d6ae570cb63ad33cf27f88b89ad6754bf6b027c (diff) | |
| download | mruby-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.c | 10 |
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; } |
