Issue #20319 has been updated by Eregon (Benoit Daloze).
Alternatively, I think we could simplify `Kernel#freeze` to always only freeze the direct
object and no other object, i.e. no singleton class would be frozen when freezing a
singleton object.
State and methods are separate things, so IMO it doesn't gain anything to freeze
singleton classes of a singleton object on `singleton_object.freeze`.
The methods can still be modified e.g. using `singleton_object.class.class_exec { def foo
= 42 }`.
I think Kernel#freeze should only freeze the object itself, which means instance variables
(and internal state if core/TypedStruct object) cannot be changed.
That would be both more consistent semantically and more efficient, while avoiding weird
cases like the above.
----------------------------------------
Bug #20319: Singleton class is being frozen lazily in some cases
https://bugs.ruby-lang.org/issues/20319#change-107097
* Author: andrykonchin (Andrew Konchin)
* Status: Open
* ruby -v: 3.2.2
* Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN
----------------------------------------
I've noticed suspicious behaviour (it doesn't affect anything in practice for me
though) when an object becomes frozen only its own singleton class becomes frozen
immediately.
A singleton class of the object immediate singleton class becomes frozen lazily after
`#singleton_class` method call:
```ruby
o = Object.new
klass = o.singleton_class.singleton_class
o.freeze
puts klass.frozen? # false <== here we expect true
puts o.singleton_class.singleton_class.frozen? # true
puts klass.frozen? # true
```
I would expect all created (and visible to user) singleton classes in an object singleton
classes chain to become frozen immediately when the object gets frozen.
--
https://bugs.ruby-lang.org/