Commit 5930a6eb authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto Committed by GitHub

Merge pull request #3328 from shugo/hash-dup-default_proc

Copy default_proc by Hash#dup.
parents edf26d40 338e0ff5
...@@ -225,6 +225,7 @@ mrb_hash_dup(mrb_state *mrb, mrb_value hash) ...@@ -225,6 +225,7 @@ mrb_hash_dup(mrb_state *mrb, mrb_value hash)
struct RHash* ret; struct RHash* ret;
khash_t(ht) *h, *ret_h; khash_t(ht) *h, *ret_h;
khiter_t k, ret_k; khiter_t k, ret_k;
mrb_value ifnone, vret;
h = RHASH_TBL(hash); h = RHASH_TBL(hash);
ret = (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class); 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) ...@@ -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 MRB_API mrb_value
......
...@@ -44,6 +44,10 @@ assert('Hash#dup') do ...@@ -44,6 +44,10 @@ assert('Hash#dup') do
b = a.dup b = a.dup
a['a'] = 2 a['a'] = 2
assert_equal({'a' => 1}, b) assert_equal({'a' => 1}, b)
c = Hash.new { |h, k| h[k] = k.upcase }
d = c.dup
assert_equal("FOO", d["foo"])
end end
assert('Hash#default', '15.2.13.4.5') do assert('Hash#default', '15.2.13.4.5') do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment