diff options
author | Jeremy Evans <[email protected]> | 2019-08-25 21:11:46 -0700 |
---|---|---|
committer | Jeremy Evans <[email protected]> | 2020-01-03 20:13:09 -0800 |
commit | 04eb7c7e462d1fcbab9efc7022c1b43636ab878a (patch) | |
tree | 025cb1f1e10736e9c37eb991a8c4cdb1931d4ff2 /test/ruby/test_object.rb | |
parent | 0eeed5bcc5530edb0af2af2ccff09d067c59e8f9 (diff) |
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]
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/2816
Diffstat (limited to 'test/ruby/test_object.rb')
-rw-r--r-- | test/ruby/test_object.rb | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/test/ruby/test_object.rb b/test/ruby/test_object.rb index add5b9fb15..bfc7d7de1d 100644 --- a/test/ruby/test_object.rb +++ b/test/ruby/test_object.rb @@ -75,6 +75,28 @@ class TestObject < Test::Unit::TestCase assert_raise_with_message(ArgumentError, /\u{1f4a9}/) do Object.new.clone(freeze: x) end + + c = Class.new do + attr_reader :f + end + o = c.new + f = true + def o.initialize_clone(_, freeze: true) + @f = freeze + super + end + clone = o.clone + assert_kind_of c, clone + assert_equal true, clone.f + clone = o.clone(freeze: false) + assert_kind_of c, clone + assert_equal false, clone.f + + def o.initialize_clone(_) + super + end + assert_kind_of c, o.clone + assert_raise(ArgumentError) { o.clone(freeze: false) } end def test_init_dupclone |