summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-04-01 15:19:53 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-04-01 15:19:53 +0900
commit164dcd8b334b2b0669fda84dad911ee1a3c1dbdc (patch)
treeae3f8cfaaee521b394c603d6c0a464a8e7dcd094
parent312e11da399e6ccb03a61ef1ce46778970e46827 (diff)
downloadmruby-164dcd8b334b2b0669fda84dad911ee1a3c1dbdc.tar.gz
mruby-164dcd8b334b2b0669fda84dad911ee1a3c1dbdc.zip
Hash#keys to update memory region directly
-rw-r--r--src/hash.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/hash.c b/src/hash.c
index 0f534f47e..7f6606956 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -759,16 +759,18 @@ mrb_hash_keys(mrb_state *mrb, mrb_value hash)
{
khash_t(ht) *h = RHASH_TBL(hash);
khiter_t k;
- mrb_value ary;
+ mrb_value ary, *p;
- if (!h) return mrb_ary_new(mrb);
+ if (!h || kh_size(h) == 0) return mrb_ary_new(mrb);
ary = mrb_ary_new_capa(mrb, kh_size(h));
+ mrb_ary_set(mrb, ary, kh_size(h)-1, mrb_nil_value());
+ p = RARRAY_PTR(ary);
for (k = kh_begin(h); k != kh_end(h); k++) {
if (kh_exist(h, k)) {
mrb_value kv = kh_key(h,k);
mrb_hash_value hv = kh_value(h,k);
- mrb_ary_set(mrb, ary, hv.n, kv);
+ p[hv.n] = kv;
}
}
return ary;