diff options
| author | Hiroshi Mimaki <[email protected]> | 2020-08-06 17:38:20 +0900 |
|---|---|---|
| committer | Hiroshi Mimaki <[email protected]> | 2020-08-06 17:38:20 +0900 |
| commit | 7f8d38bbbe89dadab9d296c76f094c56aabca9f4 (patch) | |
| tree | 10c79fb00ab3378a34abba9b4ce1d01a1b7cefd6 /src/hash.c | |
| parent | 1a9bdfcde5fd7c91e756747ba0565f29385115a7 (diff) | |
| parent | 11cc7bed96551fcceca5cabc1527fd944835a1a0 (diff) | |
| download | mruby-7f8d38bbbe89dadab9d296c76f094c56aabca9f4.tar.gz mruby-7f8d38bbbe89dadab9d296c76f094c56aabca9f4.zip | |
Merge master.
Diffstat (limited to 'src/hash.c')
| -rw-r--r-- | src/hash.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/src/hash.c b/src/hash.c index d9ee483d5..fd338d53b 100644 --- a/src/hash.c +++ b/src/hash.c @@ -174,6 +174,11 @@ ht_index(mrb_state *mrb, htable *t) segment *seg; size_t i; + if (size == 0) { + t->index = NULL; + mrb_free(mrb, index); + return; + } /* allocate index table */ if (index && index->size >= UPPER_BOUND(index->capa)) { size = index->capa+1; @@ -194,7 +199,7 @@ ht_index(mrb_state *mrb, htable *t) index->table[i] = NULL; } - /* rebuld index */ + /* rebuild index */ mask = HT_MASK(index); seg = t->rootseg; while (seg) { @@ -518,6 +523,20 @@ ht_foreach(mrb_state *mrb, htable *t, mrb_hash_foreach_func *func, void *p) } } +mrb_int +mrb_os_memsize_of_hash_table(mrb_value obj) +{ + struct htable *h = mrb_hash_ptr(obj)->ht; + mrb_int segkv_size = 0; + + if(h->index) segkv_size = (sizeof(struct segkv) * h->index->capa); + + return sizeof(htable) + + sizeof(segindex) + + (sizeof(segment) * h->size) + + segkv_size; +} + /* Iterates over the hash table. */ MRB_API void mrb_hash_foreach(mrb_state *mrb, struct RHash *hash, mrb_hash_foreach_func *func, void *p) @@ -1053,7 +1072,8 @@ mrb_hash_shift(mrb_state *mrb, mrb_value hash) mrb_hash_modify(mrb, hash); if (t && t->size > 0) { - mrb_value del_key, del_val; + mrb_value del_key = mrb_nil_value(); + mrb_value del_val = mrb_nil_value(); ht_shift(mrb, t, &del_key, &del_val); mrb_gc_protect(mrb, del_key); |
