From 04eb7c7e462d1fcbab9efc7022c1b43636ab878a Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Sun, 25 Aug 2019 21:11:46 -0700 Subject: Call initialize_clone with freeze: false if clone called with freeze: false This makes it possible to initialize_clone to correctly not freeze internal state if the freeze: false keyword is passed to clone. If clone is called with freeze: true or no keyword, do not pass a second argument to initialize_clone to keep backwards compatibility. This makes it so that external libraries that override initialize_clone but do not support the freeze keyword will fail with ArgumentError if passing freeze: false to clone. I think that is better than the current behavior, which succeeds but results in an unfrozen object with frozen internals. Fix related issues in set and delegate in stdlib. Fixes [Bug #14266] --- lib/set.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/set.rb') diff --git a/lib/set.rb b/lib/set.rb index e7d1be4f9f..684115539b 100644 --- a/lib/set.rb +++ b/lib/set.rb @@ -137,9 +137,9 @@ class Set end # Clone internal hash. - def initialize_clone(orig) + def initialize_clone(orig, freeze: true) super - @hash = orig.instance_variable_get(:@hash).clone + @hash = orig.instance_variable_get(:@hash).clone(freeze: freeze) end def freeze # :nodoc: -- cgit v1.2.3