summaryrefslogtreecommitdiffhomepage
path: root/src/hash.c
diff options
context:
space:
mode:
authorDaniel Bovensiepen <[email protected]>2013-06-15 03:53:50 +0800
committerDaniel Bovensiepen <[email protected]>2013-06-15 03:53:50 +0800
commit373122a299ebec890cfaa95ee41fde221ac6a543 (patch)
tree346e79bb8a30a4e0b4102babf7dd9407beb36979 /src/hash.c
parentad07d41bd1b42fe7d23e04361839f511c5f9cd7f (diff)
parent961cd408a86580c4d428f56153da00fd46738e35 (diff)
downloadmruby-373122a299ebec890cfaa95ee41fde221ac6a543.tar.gz
mruby-373122a299ebec890cfaa95ee41fde221ac6a543.zip
Merge upstream
Diffstat (limited to 'src/hash.c')
-rw-r--r--src/hash.c24
1 files changed, 8 insertions, 16 deletions
diff --git a/src/hash.c b/src/hash.c
index e31f7b3d7..1ffaed5fb 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -145,7 +145,9 @@ mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val) /* mr
k = kh_get(ht, h, key);
if (k == kh_end(h)) {
/* expand */
+ int ai = mrb_gc_arena_save(mrb);
k = kh_put(ht, h, KEY(key));
+ mrb_gc_arena_restore(mrb, ai);
}
kh_value(h, k) = val;
@@ -169,7 +171,9 @@ mrb_hash_dup(mrb_state *mrb, mrb_value hash)
for (k = kh_begin(h); k != kh_end(h); k++) {
if (kh_exist(h,k)) {
+ int ai = mrb_gc_arena_save(mrb);
ret_k = kh_put(ht, ret_h, KEY(kh_key(h,k)));
+ mrb_gc_arena_restore(mrb, ai);
kh_val(ret_h, ret_k) = kh_val(h,k);
}
}
@@ -772,16 +776,9 @@ mrb_value
mrb_hash_empty_p(mrb_state *mrb, mrb_value self)
{
khash_t(ht) *h = RHASH_TBL(self);
- mrb_bool empty_p;
- if (h) {
- empty_p = (kh_size(h) == 0);
- }
- else {
- empty_p = 1;
- }
-
- return mrb_bool_value(empty_p);
+ if (h) return mrb_bool_value(kh_size(h) == 0);
+ return mrb_true_value();
}
static mrb_value
@@ -921,17 +918,12 @@ mrb_hash_has_keyWithKey(mrb_state *mrb, mrb_value hash, mrb_value key)
{
khash_t(ht) *h = RHASH_TBL(hash);
khiter_t k;
- mrb_bool result;
if (h) {
k = kh_get(ht, h, key);
- result = (k != kh_end(h));
- }
- else {
- result = 0;
+ return mrb_bool_value(k != kh_end(h));
}
-
- return mrb_bool_value(result);
+ return mrb_false_value();
}
/* 15.2.13.4.13 */