diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-04-01 15:19:53 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-04-01 15:19:53 +0900 |
| commit | 164dcd8b334b2b0669fda84dad911ee1a3c1dbdc (patch) | |
| tree | ae3f8cfaaee521b394c603d6c0a464a8e7dcd094 /src | |
| parent | 312e11da399e6ccb03a61ef1ce46778970e46827 (diff) | |
| download | mruby-164dcd8b334b2b0669fda84dad911ee1a3c1dbdc.tar.gz mruby-164dcd8b334b2b0669fda84dad911ee1a3c1dbdc.zip | |
Hash#keys to update memory region directly
Diffstat (limited to 'src')
| -rw-r--r-- | src/hash.c | 8 |
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; |
