Actions
Feature #14267
closedLazy proc allocation introduced in #14045 creates regression
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?
Actions
Like0
Like0Like0Like0Like0Like0Like0Like0Like0