From fb03eb91fea8de00e78bdccfd00265a9ddd27538 Mon Sep 17 00:00:00 2001 From: tenderlove Date: Fri, 19 Oct 2012 21:20:33 +0000 Subject: * hash.c (initialize_copy): unset the default proc if there isn't one for the target hash, call to_hash, check frozen status. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37271 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ hash.c | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/ChangeLog b/ChangeLog index 9801c367df..c954757318 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sat Oct 20 06:18:34 2012 Aaron Patterson + + * hash.c (initialize_copy): unset the default proc if there isn't one + for the target hash, call to_hash, check frozen status. + Fri Oct 19 22:22:01 2012 Nobuyoshi Nakada * vm.c (rb_vm_jump_tag_but_local_jump): pass through thrown objects. diff --git a/hash.c b/hash.c index bf9dbd5467..1ddf23aea2 100644 --- a/hash.c +++ b/hash.c @@ -1185,6 +1185,9 @@ replace_i(VALUE key, VALUE val, VALUE hash) static VALUE rb_hash_initialize_copy(VALUE hash, VALUE hash2) { + rb_hash_modify_check(hash); + hash2 = to_hash(hash2); + Check_Type(hash2, T_HASH); if (!RHASH_EMPTY_P(hash2)) { @@ -1195,6 +1198,9 @@ rb_hash_initialize_copy(VALUE hash, VALUE hash2) if (FL_TEST(hash2, HASH_PROC_DEFAULT)) { FL_SET(hash, HASH_PROC_DEFAULT); } + else { + FL_UNSET(hash, HASH_PROC_DEFAULT); + } RHASH_IFNONE(hash) = RHASH_IFNONE(hash2); return hash; -- cgit v1.2.3