Bug #14267
Lazy proc allocation introduced in #14045 creates regression
Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin15]
Description
The following script consistently prints Proc equality: true
on versions of Ruby before 2.5, but prints Proc equality: false
on Ruby 2.5:
# regression.rb
def return_proc(&block)
block
end
def return_procs(&block)
block.inspect if ENV['INSPECT_BLOCK']
proc_1 = return_proc(&block)
proc_2 = return_proc(&block)
return proc_1, proc_2
end
proc_1, proc_2 = return_procs { }
puts RUBY_VERSION
puts "Proc equality: #{proc_1 == proc_2}"
Here's the output on Ruby 2.4 and 2.5:
$ chruby 2.4 $ ruby regression.rb 2.4.2 Proc equality: true $ chruby 2.5 $ ruby regression.rb 2.5.0 Proc equality: false
As the output shows, the two procs were equal on 2.4 but are no longer equal on 2.5. I believe this is due to the lazy proc allocation introduced in #14045. Note that if I call a method on the proc (such as inspect
) it defeats the lazy allocation and "fixes" the regression:
$ chruby 2.5 $ INSPECT_BLOCK=1 ruby regression.rb 2.5.0 Proc equality: true
This caused a bug in RSpec, which I've worked around for now by calling __id__
on the proc.
Is there a way to keep the lazy proc allocation while fixing this regression?
Related issues
History
Updated by duerst (Martin Dürst) almost 2 years ago
- Related to Feature #14045: Lazy Proc allocation for block parameters added