diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-12-08 01:04:25 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2016-12-08 01:04:25 +0900 |
| commit | 5930a6ebc7a5ebf0c9b2dfe1d250935e6ddaeceb (patch) | |
| tree | 06afd263df20ba8f955be181308433791b58379f | |
| parent | edf26d4043dc55202a0a71252b43956c71f99ab7 (diff) | |
| parent | 338e0ff52d645556e644ac08b3efc6ea31868c59 (diff) | |
| download | mruby-5930a6ebc7a5ebf0c9b2dfe1d250935e6ddaeceb.tar.gz mruby-5930a6ebc7a5ebf0c9b2dfe1d250935e6ddaeceb.zip | |
Merge pull request #3328 from shugo/hash-dup-default_proc
Copy default_proc by Hash#dup.
| -rw-r--r-- | src/hash.c | 14 | ||||
| -rw-r--r-- | test/t/hash.rb | 4 |
2 files changed, 17 insertions, 1 deletions
diff --git a/src/hash.c b/src/hash.c index 4df2babbe..93fe656e0 100644 --- a/src/hash.c +++ b/src/hash.c @@ -225,6 +225,7 @@ mrb_hash_dup(mrb_state *mrb, mrb_value hash) struct RHash* ret; khash_t(ht) *h, *ret_h; khiter_t k, ret_k; + mrb_value ifnone, vret; h = RHASH_TBL(hash); ret = (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class); @@ -243,7 +244,18 @@ mrb_hash_dup(mrb_state *mrb, mrb_value hash) } } - return mrb_obj_value(ret); + if (MRB_RHASH_DEFAULT_P(hash)) { + ret->flags |= MRB_HASH_DEFAULT; + } + if (MRB_RHASH_PROCDEFAULT_P(hash)) { + ret->flags |= MRB_HASH_PROC_DEFAULT; + } + vret = mrb_obj_value(ret); + ifnone = RHASH_IFNONE(hash); + if (!mrb_nil_p(ifnone)) { + mrb_iv_set(mrb, vret, mrb_intern_lit(mrb, "ifnone"), ifnone); + } + return vret; } MRB_API mrb_value diff --git a/test/t/hash.rb b/test/t/hash.rb index b455812cf..f076db8e5 100644 --- a/test/t/hash.rb +++ b/test/t/hash.rb @@ -44,6 +44,10 @@ assert('Hash#dup') do b = a.dup a['a'] = 2 assert_equal({'a' => 1}, b) + + c = Hash.new { |h, k| h[k] = k.upcase } + d = c.dup + assert_equal("FOO", d["foo"]) end assert('Hash#default', '15.2.13.4.5') do |
