Issue #18023 has been updated by slowpilot (Ivan Razuvaev).


slowpilot (Ivan Razuvaev) wrote:
> Hi. I encountered strange behaviour or shareable procs when every even closured shareable variable becomes the FalseClass instance.
> 
> ``` ruby
> [usr@srvr ~]$ irb
> 3.0.1 :001 > v1, v2, v3, v4 = :a, :b, :c, :d
>  => [:a, :b, :c, :d] 
> 3.0.1 :002 > p = Proc.new { p v1, v2, v3, v4 }
>  => #<Proc:0x000000000248ed18 (irb):2> 
> 3.0.1 :003 > p.()
> :a
> :b
> :c
> :d
>  => [:a, :b, :c, :d] 
> 3.0.1 :004 > Ractor.make_shareable(p).()
> :a
> false
> :c
> false
>  => [:a, false, :c, false] 
> ```

This is stopping from using dynamically defined methods from ractors. E.g. in Ruby [libtorch](https://github.com/orlando-labs/torch.rb/blob/2c8c1c89ded3ac924a19020d6c747582d1c828cc/lib/torch.rb#L256). So after calling rb_ext_ractor_safe in extension, I am trying to do something like:
```ruby
cls.define_singleton_method('new', Ractor.make_shareable(Proc.new { ... })
```
That leads to every second closure assignment to false.

----------------------------------------
Bug #18023: Ractor#make_shareable changes the values of closured shareable objects
https://bugs.ruby-lang.org/issues/18023#change-92812

* Author: slowpilot (Ivan Razuvaev)
* Status: Open
* Priority: Normal
* ruby -v: 3.0.0, 3.0.1
* Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN
----------------------------------------
Hi. I encountered strange behaviour or shareable procs when every even closured shareable variable becomes the FalseClass instance.

``` ruby
[usr@srvr ~]$ irb
3.0.1 :001 > v1, v2, v3, v4 = :a, :b, :c, :d
 => [:a, :b, :c, :d] 
3.0.1 :002 > p = Proc.new { p v1, v2, v3, v4 }
 => #<Proc:0x000000000248ed18 (irb):2> 
3.0.1 :003 > p.()
:a
:b
:c
:d
 => [:a, :b, :c, :d] 
3.0.1 :004 > Ractor.make_shareable(p).()
:a
false
:c
false
 => [:a, false, :c, false] 
```




-- 
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>