summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-04-04 12:14:23 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-04-04 12:14:23 +0900
commit59cd24d41f1e6b5e25d35103c0720e8aa8cae0b6 (patch)
treec7d96eddbe8b171d59f17f58bd0542037b114221
parent9f6d69ee562cecb597ab02b2b716e3d773141f17 (diff)
downloadmruby-59cd24d41f1e6b5e25d35103c0720e8aa8cae0b6.tar.gz
mruby-59cd24d41f1e6b5e25d35103c0720e8aa8cae0b6.zip
Hash#replace should copy default as well; close #2004
-rw-r--r--mrblib/hash.rb5
-rw-r--r--src/hash.c8
-rw-r--r--test/t/hash.rb9
3 files changed, 17 insertions, 5 deletions
diff --git a/mrblib/hash.rb b/mrblib/hash.rb
index 6fae521a8..e608d2971 100644
--- a/mrblib/hash.rb
+++ b/mrblib/hash.rb
@@ -152,6 +152,11 @@ class Hash
hash.each_key{|k|
self[k] = hash[k]
}
+ if hash.default_proc
+ self.default_proc = hash.default_proc
+ elsif hash.default
+ self.default = hash.default
+ end
self
end
# ISO 15.2.13.4.17
diff --git a/src/hash.c b/src/hash.c
index a09d509d0..93f0650dd 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -376,14 +376,12 @@ mrb_hash_aget(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_hash_default(mrb_state *mrb, mrb_value hash)
{
- mrb_value *argv;
- int argc;
mrb_value key;
+ mrb_bool given;
- mrb_get_args(mrb, "*", &argv, &argc);
+ mrb_get_args(mrb, "|o?", &key, &given);
if (MRB_RHASH_PROCDEFAULT_P(hash)) {
- if (argc == 0) return mrb_nil_value();
- key = argv[0];
+ if (!given) return mrb_nil_value();
return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, key);
}
else {
diff --git a/test/t/hash.rb b/test/t/hash.rb
index ec9da8ca7..8a10f4026 100644
--- a/test/t/hash.rb
+++ b/test/t/hash.rb
@@ -230,6 +230,15 @@ assert('Hash#replace', '15.2.13.4.23') do
b = Hash.new.replace(a)
assert_equal({ 'abc_key' => 'abc_value' }, b)
+
+ a = Hash.new(42)
+ b = {}
+ b.replace(a)
+ assert_equal(42, b[1])
+
+ a = Hash.new{|h,x| x}
+ b.replace(a)
+ assert_equal(127, b[127])
end
assert('Hash#shift', '15.2.13.4.24') do