Bug #8078
closedOnce nil is frozen, an unfrozen instance cannot be reached
Description
=begin
This is a rather peculiar bug I stumbled across. The basic issue is that once nil
has been frozen, there is no way to access an unfrozen instance of nil.
nil.frozen? => false
nil.freeze
nil.frozen? => true
I say this is a peculiar bug because generally it doesn't matter if nil
is frozen or not (since it is basically frozen even if not explicitly defined as such). However, since Ruby is based upon duck typing, you might run into a scenario like the following:
def get(cache_key)
content = Rails.cache.read(cache_key)
content.frozen? ? content.dup : content
end
If I call the above method and the cache key exists, content
is a frozen string, which I then dup
to get an unfrozen copy. If I call the above method and the cache key does NOT exist, content
is a frozen nil
, which it then attempts to dup
unsuccessfully since a NilClass instance cannot be duped.
=end