Issue #20184 has been reported by aalin (Andreas Alin).
----------------------------------------
Bug #20184: Ruby segfaults on Fly.io with 256 MB RAM
https://bugs.ruby-lang.org/issues/20184
* Author: aalin (Andreas Alin)
* Status: Open
* Priority: Normal
* ruby -v: ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-linux]
* Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN
----------------------------------------
I've been running a Ruby 3.2 app on Fly.io with 256 MB RAM and it has been working fine.
When I upgraded to Ruby 3.3.0, any Ruby script would crash immediately with a segfault.
I haven't been able to reproduce it outside of fly.io.
I created a repository with a basic rack app which crashes on fly.io.
The readme includes the full output and a GDB backtrace.
https://github.com/aalin/ruby-3-3-0-fly-crash
--
https://bugs.ruby-lang.org/
Issue #20095 has been reported by sisyphus_cg (Sisyphus CG).
----------------------------------------
Bug #20095: Regex lookahead behaving strangely in 3.3.0
https://bugs.ruby-lang.org/issues/20095
* Author: sisyphus_cg (Sisyphus CG)
* Status: Open
* Priority: Normal
* ruby -v: 3.3.0
* Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN
----------------------------------------
Multiple regex lookaheads seem to behave strangely in 3.3.0:
```ruby
p "xxx" =~ /(?=.*x)x(?=banana)/ # 2
```
Clearly, the string `xxx` does not contain `banana`, so this regex should never match, but it does.
--
https://bugs.ruby-lang.org/
Issue #20207 has been reported by Sundeep (Sundeep Agarwal).
----------------------------------------
Bug #20207: Segmentation fault for a regexp containing positive and negative lookaheads
https://bugs.ruby-lang.org/issues/20207
* Author: Sundeep (Sundeep Agarwal)
* Status: Open
* Priority: Normal
* Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN
----------------------------------------
I'm getting segmentation fault for the following regexp with Ruby 3.3.0:
``` ruby
puts 'clan'.match?(/(?=.*a)(?!.*n)/)
```
This is the minimal example for which I was able to produce the issue. `a` and `n` in the above example
are just a sample, can be other character combinations too. There has to be at least two characters
before them in the input string (`cl` in the above example).
The error is seen when the above code is run from a file, but only occasionally from irb.
When run from a file, most of the time I get segmentation fault (see attached log file),
but sometimes I get the following error:
``` ruby
lookaround.rb:1:in `match?': undefined bytecode (bug): /(?=.*a)(?!.*n)/ (RegexpError)
from lookaround.rb:1:in `<main>'
```
When asked in the r/ruby forum, somebody else was able to reproduce this issue.
They also mentioned that the issue wasn't seen in the Ruby 3.2.2 version.
---Files--------------------------------
lookaround_segfault.log (15.9 KB)
--
https://bugs.ruby-lang.org/
Issue #20203 has been reported by vo.x (Vit Ondruch).
----------------------------------------
Bug #20203: `TestEnumerable` test failures with GCC 14
https://bugs.ruby-lang.org/issues/20203
* Author: vo.x (Vit Ondruch)
* Status: Open
* Priority: Normal
* ruby -v: ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-linux]
* Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN
----------------------------------------
There is ongoing mass rebuild in Fedora and that is first time GCC 14 is used and we observe test failures in `TestEnumerable`. Here are a few examples:
~~~
[ 3000/26419] TestEnumerable#test_transient_heap_sort_bymalloc_consolidate(): unaligned fastbin chunk detected
~~~
~~~
[ 2455/26535] TestEnumerable#test_transient_heap_sort_bycorrupted size vs. prev_size in fastbins
~~~
~~~
[ 9716/26532] TestEnumerable#test_any_with_unused_blockdouble free or corruption (fasttop)
~~~
The full logs are accessible [here](https://koji.fedoraproject.org/koji/taskinfo?taskID=112176941). Please drill through `Descendants` and `build.log`
--
https://bugs.ruby-lang.org/
Issue #20209 has been reported by alanwu (Alan Wu).
----------------------------------------
Bug #20209: YJIT can leak memory by retaining objects with singleton class
https://bugs.ruby-lang.org/issues/20209
* Author: alanwu (Alan Wu)
* Status: Closed
* Priority: Normal
* Backport: 3.0: DONTNEED, 3.1: DONTNEED, 3.2: DONTNEED, 3.3: REQUIRED
----------------------------------------
We've received [reports](https://github.com/ruby/ruby/pull/9693) of YJIT causing memory leaks in production Rails apps by keeping objects that have singleton classes alive. The symptom is similar to #19436. We have found a workaround with https://github.com/ruby/ruby/pull/9693 and would like to have it in the next 3.3 point release.
--
https://bugs.ruby-lang.org/
Issue #20208 has been reported by jprokop (Jarek Prokop).
----------------------------------------
Bug #20208: Net::HTTP errors with Errno::EAFNOSUPPORT when setting local_host with Addrinfo
https://bugs.ruby-lang.org/issues/20208
* Author: jprokop (Jarek Prokop)
* Status: Open
* Priority: Normal
* ruby -v: ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-linux]
* Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN
----------------------------------------
A bug was found when dealing with Ruby tests downstream. One of our builders has a specific networking configuration, resulting in Ruby incorrectly binding a socket, resulting in exception Errno::EAFNOSUPPORT,
despite localhost being IPv6 capable.
It is reproducible with Ruby 3.3, and reasonably current master (git hash a846d391d38b34fcc4f90adef967c166c923bd56).
Reproduction environment:
The networking configuration has to be in a specific state. The regular interface (such as eth0) has to have ipv6 disabled while localhost is IPv6 enabled.
I have tracked the problem to a commit adding AI_ADDRCONFIG flag: https://github.com/ruby/ruby/commit/d2ba8ea54a4089959afdeecdd963e3c4ff39174…
If I revert the commit or just simply set 2 ifdefs that are present in the diff with `HAVE_CONST_AI_ADDRCONFIG` to 0, the problem no longer occurs.
I have used vagrant with fedora/39-cloud-base box with the above mentioned git hash. However, I'd note that I reproduced it also on RHEL 8 and RHEL 9.
The VM has the following interfaces:
~~~
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:e3:aa:c1 brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname ens5
inet 192.168.122.209/24 brd 192.168.122.255 scope global dynamic noprefixroute eth0
valid_lft 2099sec preferred_lft 2099sec
inet6 fe80::f5fe:e8a4:8f83:4a8f/64 scope link tentative noprefixroute
valid_lft forever preferred_lft forever
~~~
Disable IPv6 of eth0 and leave only lo with IPv6:
~~~
$ sudo sysctl "net.ipv6.conf.eth0.disable_ipv6=1"
~~~
Confirm the result:
~~~
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:e3:aa:c1 brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname ens5
inet 192.168.122.209/24 brd 192.168.122.255 scope global dynamic noprefixroute eth0
valid_lft 3587sec preferred_lft 3587sec
~~~
inet6 is no longer present on eth0, but still present in lo.
Then we can copy what TestNetHTTPLocalBind is doing in setup, as that is one of the failing tests and use it for a reproducer:
~~~
$ ruby -rnet/http -e 'http = Net::HTTP.new("localhost", 8080); http.local_host = Addrinfo.tcp("localhost", 8080).ip_address; p http.get("/")'
/usr/share/ruby/net/http.rb:1603:in `initialize': Failed to open TCP connection to localhost:8080 (Address family not supported by protocol - bind(2) for "::1" port ) (Errno::EAFNOSUPPORT)
from /usr/share/ruby/net/http.rb:1603:in `open'
from /usr/share/ruby/net/http.rb:1603:in `block in connect'
from /usr/share/ruby/timeout.rb:186:in `block in timeout'
from /usr/share/ruby/timeout.rb:193:in `timeout'
from /usr/share/ruby/net/http.rb:1601:in `connect'
from /usr/share/ruby/net/http.rb:1580:in `do_start'
from /usr/share/ruby/net/http.rb:1569:in `start'
from /usr/share/ruby/net/http.rb:2297:in `request'
from /usr/share/ruby/net/http.rb:1917:in `get'
from -e:1:in `<main>'
/usr/share/ruby/net/http.rb:1603:in `initialize': Address family not supported by protocol - bind(2) for "::1" port (Errno::EAFNOSUPPORT)
from /usr/share/ruby/net/http.rb:1603:in `open'
from /usr/share/ruby/net/http.rb:1603:in `block in connect'
from /usr/share/ruby/timeout.rb:186:in `block in timeout'
from /usr/share/ruby/timeout.rb:193:in `timeout'
from /usr/share/ruby/net/http.rb:1601:in `connect'
from /usr/share/ruby/net/http.rb:1580:in `do_start'
from /usr/share/ruby/net/http.rb:1569:in `start'
from /usr/share/ruby/net/http.rb:2297:in `request'
from /usr/share/ruby/net/http.rb:1917:in `get'
from -e:1:in `<main>'
~~~
The script:
~~~
http = Net::HTTP.new("localhost", 8080)
http.local_host = Addrinfo.tcp("localhost", 8080).ip_address
p http.get("/")
~~~
Without setting the `http.local_host` attribute using Addrinfo, the reproducer does not fail with EAFNOSUPPORT. Whether `port` is specified or `nil` does not make a difference.
Whether there is a server listening on 8080 or not does not make a difference, the script fails with the errno regardless.
I have collected `strace` that points to a possible cause:
~~~
$ strace ruby -rnet/http -e 'http = Net::HTTP.new("localhost", 8080); http.local_host = Addrinfo.tcp("localhost", 8080).ip_address; p http.get("/")' 2>&1 | grep AF_INET
socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_TCP) = 5
bind(5, {sa_family=AF_INET6, sin6_port=htons(0), sin6_flowinfo=htonl(0), inet_pton(AF_INET6, "::1", &sin6_addr), sin6_scope_id=0}, 28) = -1 EAFNOSUPPORT (Address family not supported by protocol)
~~~
A socket is created with AF_INET and later is bound with AF_INET6, that is not correct behavior as far as I can tell.
Full strace is attached.
Observed failures in Ruby test suite related to this issue:
~~~
109) Error:
TestNetHTTPLocalBind#test_bind_to_local_port:
Errno::EAFNOSUPPORT: Failed to open TCP connection to localhost:37337 (Address family not supported by protocol - bind(2) for "::1" port 45395)
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `initialize'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `open'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `block in connect'
/builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:186:in `block in timeout'
/builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:193:in `timeout'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1601:in `connect'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1580:in `do_start'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1569:in `start'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:2297:in `request'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1917:in `get'
/builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1282:in `test_bind_to_local_port'
110) Error:
TestNetHTTPLocalBind#test_bind_to_local_host:
Errno::EAFNOSUPPORT: Failed to open TCP connection to localhost:46329 (Address family not supported by protocol - bind(2) for "::1" port )
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `initialize'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `open'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `block in connect'
/builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:186:in `block in timeout'
/builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:193:in `timeout'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1601:in `connect'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1580:in `do_start'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1569:in `start'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:2297:in `request'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1917:in `get'
/builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1267:in `test_bind_to_local_host'
111) Error:
TestNetHTTPForceEncoding#test_response_body_encoding_false:
Errno::EAFNOSUPPORT: Failed to open TCP connection to localhost:41749 (Address family not supported by protocol - bind(2) for "::1" port )
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `initialize'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `open'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `block in connect'
/builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:186:in `block in timeout'
/builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:193:in `timeout'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1601:in `connect'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1580:in `do_start'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1569:in `start'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:2297:in `request'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1917:in `get'
/builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1308:in `fe_request'
/builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1312:in `test_response_body_encoding_false'
112) Error:
TestNetHTTPForceEncoding#test_response_body_encoding_string_without_content_type:
Errno::EAFNOSUPPORT: Failed to open TCP connection to localhost:42775 (Address family not supported by protocol - bind(2) for "::1" port )
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `initialize'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `open'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `block in connect'
/builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:186:in `block in timeout'
/builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:193:in `timeout'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1601:in `connect'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1580:in `do_start'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1569:in `start'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:2297:in `request'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1917:in `get'
/builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1308:in `fe_request'
/builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1330:in `test_response_body_encoding_string_without_content_type'
113) Error:
TestNetHTTPForceEncoding#test_response_body_encoding_true_with_content_type:
Errno::EAFNOSUPPORT: Failed to open TCP connection to localhost:36895 (Address family not supported by protocol - bind(2) for "::1" port )
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `initialize'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `open'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `block in connect'
/builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:186:in `block in timeout'
/builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:193:in `timeout'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1601:in `connect'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1580:in `do_start'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1569:in `start'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:2297:in `request'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1917:in `get'
/builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1308:in `fe_request'
/builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1324:in `test_response_body_encoding_true_with_content_type'
114) Error:
TestNetHTTPForceEncoding#test_response_body_encoding_encoding_without_content_type:
Errno::EAFNOSUPPORT: Failed to open TCP connection to localhost:37115 (Address family not supported by protocol - bind(2) for "::1" port )
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `initialize'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `open'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `block in connect'
/builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:186:in `block in timeout'
/builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:193:in `timeout'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1601:in `connect'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1580:in `do_start'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1569:in `start'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:2297:in `request'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1917:in `get'
/builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1308:in `fe_request'
/builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1336:in `test_response_body_encoding_encoding_without_content_type'
115) Error:
TestNetHTTPForceEncoding#test_response_body_encoding_true_without_content_type:
Errno::EAFNOSUPPORT: Failed to open TCP connection to localhost:37799 (Address family not supported by protocol - bind(2) for "::1" port )
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `initialize'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `open'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1603:in `block in connect'
/builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:186:in `block in timeout'
/builddir/build/BUILD/ruby-3.3.0/lib/timeout.rb:193:in `timeout'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1601:in `connect'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1580:in `do_start'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1569:in `start'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:2297:in `request'
/builddir/build/BUILD/ruby-3.3.0/lib/net/http.rb:1917:in `get'
/builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1308:in `fe_request'
/builddir/build/BUILD/ruby-3.3.0/test/net/http/test_http.rb:1318:in `test_response_body_encoding_true_without_content_type'
~~~
Related failures from specs:
~~~
1)
An exception occurred during: before :each
TCPSocket#local_address using IPv6 using an implicit hostname the returned Addrinfo uses the correct IP address ERROR
Errno::ECONNREFUSED: Connection refused - connect(2) for nil port 37121
/builddir/build/BUILD/ruby-3.3.0/spec/ruby/library/socket/tcpsocket/local_address_spec.rb:59:in `initialize'
/builddir/build/BUILD/ruby-3.3.0/spec/ruby/library/socket/tcpsocket/local_address_spec.rb:59:in `new'
/builddir/build/BUILD/ruby-3.3.0/spec/ruby/library/socket/tcpsocket/local_address_spec.rb:59:in `block (4 levels) in <top (required)>'
/builddir/build/BUILD/ruby-3.3.0/spec/ruby/library/socket/tcpsocket/local_address_spec.rb:4:in `<top (required)>'
2)
An exception occurred during: before :each
TCPSocket#remote_address using IPv6 using an implicit hostname the returned Addrinfo uses the correct IP address ERROR
Errno::ECONNREFUSED: Connection refused - connect(2) for nil port 39823
/builddir/build/BUILD/ruby-3.3.0/spec/ruby/library/socket/tcpsocket/remote_address_spec.rb:58:in `initialize'
/builddir/build/BUILD/ruby-3.3.0/spec/ruby/library/socket/tcpsocket/remote_address_spec.rb:58:in `new'
/builddir/build/BUILD/ruby-3.3.0/spec/ruby/library/socket/tcpsocket/remote_address_spec.rb:58:in `block (4 levels) in <top (required)>'
/builddir/build/BUILD/ruby-3.3.0/spec/ruby/library/socket/tcpsocket/remote_address_spec.rb:4:in `<top (required)>'
~~~
---Files--------------------------------
strace_log.txt (304 KB)
--
https://bugs.ruby-lang.org/
Issue #20213 has been reported by jeremyevans0 (Jeremy Evans).
----------------------------------------
Bug #20213: zsuper with keyword splat without explicit keywords incorrectly uses mutable keyword splat
https://bugs.ruby-lang.org/issues/20213
* Author: jeremyevans0 (Jeremy Evans)
* Status: Open
* Priority: Normal
* Backport: 3.0: DONTNEED, 3.1: DONTNEED, 3.2: DONTNEED, 3.3: REQUIRED
----------------------------------------
As the subject states, the super call in this code is compiled incorrectly:
```ruby
extend(Module.new{def a(**k) k[:a] = 1 end})
extend(Module.new{def a(**k) p k; super; p k end})
a
# Expected output, actual output on Ruby 2.0-3.2:
{}
{}
# Actual output on Ruby 3.3 and master
{}
{:a=>1}
```
The zsuper call here uses VM_CALL_KW_SPLAT_MUT:
```
invokesuper <calldata!argc:1, FCALL|SUPER|ZSUPER|KW_SPLAT|KW_SPLAT_MUT>, nil
```
That is not correct, because as the example shows, if the super method accepts a keyword splat, the super method can modify the keyword splat, and changes are reflected in the caller.
I submitted a pull request to fix this: https://github.com/ruby/ruby/pull/9710, and marked this for backporting to 3.3.
--
https://bugs.ruby-lang.org/
Issue #20197 has been reported by osyoyu (Daisuke Aritomo).
----------------------------------------
Bug #20197: Postponed job invocations are significantly reduced in Ruby 3.3
https://bugs.ruby-lang.org/issues/20197
* Author: osyoyu (Daisuke Aritomo)
* Status: Open
* Priority: Normal
* ruby -v: ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-linux]
* Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN
----------------------------------------
The number of postponed job invocations has been significantly reduced in Ruby 3.3.
While my understanding is that postponed jobs provide no guarantee of how soon registered callbacks will fire, I believe the current rate is too low for practical usage, especially for profilers such as StackProf.
A git bisect led me to https://github.com/ruby/ruby/commit/1f0304218cf00e05a4a126196676ba221ebf91f6 which obviously seems to be related, but I'm not sure why.
## Repro
### Expected
The job fires (nearly) every 100 ms.
```
% ruby bin/test.rb # runs for 3 seconds
count: 1
count: 2
(snip)
count: 29
```
### Actual
The job fires only once.
```
% ruby bin/test.rb
count: 1
count: 2
(snip)
count: 29
```
### Code
```ruby
require 'mycext'
time = Time.now
th = Thread.new do
loop do
sleep 0.01
break if Time.now - time > 3 # run for 3 seconds
end
end
th.join
```
```c
#include <pthread.h>
#include <stdio.h>
#include <time.h>
#include "ruby.h"
#include "ruby/debug.h"
int called_count;
void
postponed_job(void *ptr)
{
called_count++;
printf("count: %d\n", called_count);
}
_Noreturn void *
pthread_main(void *_)
{
while (1) {
rb_postponed_job_register_one(0, postponed_job, NULL);
// Sleep for 100 ms
struct timespec ts;
ts.tv_sec = 0;
ts.tv_nsec = 100 * 1000 * 1000;
nanosleep(&ts, NULL);
}
}
RUBY_FUNC_EXPORTED void
Init_mycext(void)
{
called_count = 0;
pthread_t pthread;
pthread_create(&pthread, NULL, pthread_main, NULL);
}
```
--
https://bugs.ruby-lang.org/