summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2016-12-08 01:04:25 +0900
committerGitHub <[email protected]>2016-12-08 01:04:25 +0900
commit5930a6ebc7a5ebf0c9b2dfe1d250935e6ddaeceb (patch)
tree06afd263df20ba8f955be181308433791b58379f
parentedf26d4043dc55202a0a71252b43956c71f99ab7 (diff)
parent338e0ff52d645556e644ac08b3efc6ea31868c59 (diff)
downloadmruby-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.c14
-rw-r--r--test/t/hash.rb4
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