[#98645] [Ruby master Misc#16933] DevelopersMeeting20200618Japan — mame@...

Issue #16933 has been reported by mame (Yusuke Endoh).

14 messages 2020/06/04

[#98663] [Ruby master Bug#16936] `make check TESTS="-n !/Foo#method/"` not skipping the test case — jaruga@...

Issue #16936 has been reported by jaruga (Jun Aruga).

13 messages 2020/06/05

[#98772] [Ruby master Bug#16959] Weakmap has specs and third-party usage despite being a private API — headius@...

Issue #16959 has been reported by headius (Charles Nutter).

13 messages 2020/06/12

[#98826] [Ruby master Feature#16963] Remove English.rb from Ruby 2.8/3.0 — hsbt@...

Issue #16963 has been reported by hsbt (Hiroshi SHIBATA).

9 messages 2020/06/16

[#98920] [Ruby master Bug#16978] Ruby should not use realpath for __FILE__ — v.ondruch@...

Issue #16978 has been reported by vo.x (Vit Ondruch).

24 messages 2020/06/23

[#98947] [Ruby master Feature#16986] Anonymous Struct literal — ko1@...

Issue #16986 has been reported by ko1 (Koichi Sasada).

66 messages 2020/06/26

[#98964] [Ruby master Feature#16989] Sets: need ♥️ — marcandre-ruby-core@...

Issue #16989 has been reported by marcandre (Marc-Andre Lafortune).

33 messages 2020/06/26

[#98965] [Ruby master Feature#16990] Sets: operators compatibility with Array — marcandre-ruby-core@...

Issue #16990 has been reported by marcandre (Marc-Andre Lafortune).

11 messages 2020/06/26

[#98968] [Ruby master Feature#16993] Sets: from hash keys using Hash#key_set — marcandre-ruby-core@...

Issue #16993 has been reported by marcandre (Marc-Andre Lafortune).

10 messages 2020/06/26

[#98997] [Ruby master Feature#17000] 2.7.2 turns off deprecation warnings by deafult — mame@...

Issue #17000 has been reported by mame (Yusuke Endoh).

16 messages 2020/06/30

[ruby-core:98629] [Ruby master Feature#14267] Lazy proc allocation introduced in #14045 creates regression

From: merch-redmine@...
Date: 2020-06-02 19:51:13 UTC
List: ruby-core #98629
Issue #14267 has been updated by jeremyevans0 (Jeremy Evans).


In my pull request, I propose the following definition of proc equivalence:

* The procs have the same class
* The procs either are both lambdas or both non-lambdas
* The procs either are both created from a method or both not created from a method
* The procs have the same block type (iseq, ifunc, symbol, proc)
  * If iseq, the proc blocks have the same ec and iseq
  * If ifunc, the proc blocks have the same ec and ifunc
  * If symbol, the proc blocks use the same symbol
  * If proc, the proc blocks use the same proc

I'm not sure if this definition is perfect, though it seems better than the object equivalence currently used. Someone with more knowledge of proc types should probably review and see if there are other conditions that should be met for equivalence.

----------------------------------------
Feature #14267: Lazy proc allocation introduced in #14045 creates regression
https://bugs.ruby-lang.org/issues/14267#change-85953

* Author: myronmarston (Myron Marston)
* Status: Open
* Priority: Normal
----------------------------------------
The following script consistently prints `Proc equality: true` on versions of Ruby before 2.5, but prints `Proc equality: false` on Ruby 2.5:

``` ruby
# 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](https://github.com/rspec/rspec-core/commit/84670489bb4943a62e783bd65f96e4b55360b141) by calling `__id__` on the proc.

Is there a way to keep the lazy proc allocation while fixing this regression?



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next