summaryrefslogtreecommitdiff
path: root/test
AgeCommit message (Collapse)Author
2025-06-26[ruby/uri] Escape reserved characters in scheme nameNobuyoshi Nakada
Fix https://github.com/ruby/uri/pull/89 https://github.com/ruby/uri/commit/d543c0dafa
2025-06-25[ruby/openssl] pkey: use EVP_PKEY_new_raw_{private,public}_key_ex() if availableKazuki Yamaguchi
Algorithms implemented only in OpenSSL 3 providers may not have a corresponding NID. The *_ex() variants have been added in OpenSSL 3.0 to handle such algorithms, by taking algorithm names as a string. https://github.com/ruby/openssl/commit/e730e457cc
2025-06-25[ruby/openssl] pkey: handle EVP_PKEY_KEYMGMT return by EVP_PKEY_id()Kazuki Yamaguchi
For algorithms implemented solely in an OpenSSL 3 provider, without an associated EVP_PKEY_METHOD, EVP_PKEY_id() returns a special value EVP_PKEY_KEYMGMT. Let OpenSSL::PKey::PKey#oid raise an exception as necessary. Update PKey#inspect to include the string returned by EVP_PKEY_get0_type_name(), if available. https://github.com/ruby/openssl/commit/bd3e32270e
2025-06-25Include Set subclass name in Set#inspect outputJeremy Evans
Fixes [Bug #21377] Co-authored-by: zzak <zzak@hey.com>
2025-06-25Simplify Set#inspect outputJeremy Evans
As Set is now a core collection class, it should have special inspect output. Ideally, inspect output should be suitable to eval, similar to array and hash (assuming the elements are also suitable to eval): set = Set[1, 2, 3] eval(set.inspect) == set # should be true The simplest way to do this is to use the Set[] syntax. This deliberately does not use any subclass name in the output, similar to array and hash. It is more important that users know they are dealing with a set than which subclass: Class.new(Set)[] # this does: Set[] # not: #<Class:0x00000c21c78699e0>[] This inspect change breaks the power_assert bundled gem tests, so add power_assert to TEST_BUNDLED_GEMS_ALLOW_FAILURES in the workflows. Implements [Feature #21389]
2025-06-24Disallow forking from non-main ractorJean Boussier
[Bug #17516] `fork(2)` only leave the calling thread alive in the child. Because of this forking from the non-main ractor can easily leave the VM in a corrupted state. It may be possible in the future to carefully allow forking from non-main Ractor, but shot term it's preferable to add this restriction.
2025-06-24[ruby/json] Deprecate duplicate keys in objectJean Boussier
There are few legitimate use cases for duplicate keys, and can in some case be exploited. Rather to always silently accept them, we should emit a warning, and in the future require to explictly allow them. https://github.com/ruby/json/commit/06f00a42e8
2025-06-24Set up callable_method_entry for DUMMY frame on ArgumentErrorYusuke Endoh
Before the patch: ``` $ ./miniruby -e '[1, 2].inject(:tap)' -e:1:in '<main>': wrong number of arguments (given 1, expected 0) (ArgumentError) from -e:1:in 'Enumerable#inject' from -e:1:in '<main>' ``` After the patch: ``` $ ./miniruby -e '[1, 2].inject(:tap)' -e:1:in 'Kernel#tap': wrong number of arguments (given 1, expected 0) (ArgumentError) from -e:1:in 'Enumerable#inject' from -e:1:in '<main>' ``` Fixes https://bugs.ruby-lang.org/issues/20968#change-113811
2025-06-24[Bug #21449] Fix Set#divide{|a,b|} using Union-find structure (#13680)tomoya ishida
* [Bug #21449] Fix Set#divide{|a,b|} using Union-find structure Implements Union-find structure with path compression. Since divide{|a,b|} calls the given block n**2 times in the worst case, there is no need to implement union-by-rank or union-by-size optimization. * Avoid internal arrays from being modified from block passed to Set#divide Internal arrays can be modified from yielded block through ObjectSpace. Freeze readonly array, use ALLOCV_N instead of mutable array.
2025-06-23Merge blocks for the same conditionNobuyoshi Nakada
2025-06-23[rubygems/rubygems] Handle RubyGems installing to custom dir with ↵Nicholas La Roux
non-existent parent dirs https://github.com/rubygems/rubygems/commit/4701123601
2025-06-22Avoid allocation for positional splat for literal array keyword argumentJeremy Evans
If all nodes in the array are safe, then it is safe to avoid allocation for the positional splat: ```ruby m(*a, kw: [:a]) # Safe m(*a, kw: [meth]) # Unsafe ``` This avoids an unnecessary allocation in a Rails method call. Details: https://github.com/rails/rails/pull/54949/files#r2052645431
2025-06-21variable.c: avoid out of bound write in `generic_field_set`Jean Boussier
[Bug #21445]
2025-06-21Fix handling of PM_CONSTANT_PATH_NODE node in keyword arguments with ARGS_SPLATJeremy Evans
This was handled correctly in parse.y (NODE_COLON2), but not in prism. This wasn't caught earlier, because I only added tests for the optimized case and not the unoptimized case. Add tests for the unoptimized case. In code terms: ```ruby m(*a, kw: lvar::X) # Does not require allocation for *a m(*a, kw: method()::X) # Requires allocation for *a ``` This commit fixes the second case when prism is used.
2025-06-20[ruby/openssl] ssl: add SSLContext#sigalgs= and #client_sigalgs=Kazuki Yamaguchi
Add methods for setting supported signature algorithms, corresponding to SSL_CTX_set1_sigalgs_list() and SSL_CTX_set1_client_sigalgs_list(), respectively. https://github.com/ruby/openssl/commit/6bbe58c492 Co-authored-by: Markus Jung <markus.jung@vivavis.com>
2025-06-20[ruby/io-console] Ignore `^C` at interruptNobuyoshi Nakada
It's something we don't expect and might be coming from somewhere else. https://github.com/ruby/io-console/commit/f0646b2b6a
2025-06-19ZJIT: Add `dupn` supportAlan Wu
Notes: Merged: https://github.com/ruby/ruby/pull/13641
2025-06-19Relax delta valueHiroshi SHIBATA
https://github.com/ruby/ruby/actions/runs/15751511003/job/44397451542?pr=13649 ``` 1) Failure: TestLastThread#test_last_thread [/Users/runner/work/ruby/ruby/src/test/-ext-/gvl/test_last_thread.rb:18]: Expected |1.0 - 1.167141| (0.16714099999999998) to be <= 0.16. ```
2025-06-19[rubygems/rubygems] Allow enabling "Bundler 3 mode" more easilyDavid Rodríguez
Currently to test Bundler 3 mode we have to actually edit the version file to simulate we're running a future version. This is inconvenient. Instead, allow passing an environment variable, `BUNDLER_3_MODE`, to set the "working mode" Bundler should use. This can now be set easily by end users to enable them to try out the changes in the future version and give us feedback. It's unclear how version auto-switching should work when this environment variable is set, so the auto-switching feature will be disabled in that case. https://github.com/rubygems/rubygems/commit/4e92e9b209
2025-06-18ZJIT: Support invokebuiltin opcodes (#13632)Daniel Colson
* `invokebuiltin` * `invokebuiltin_delegate` * `invokebuiltin_delegate_leave` These instructions all call out to a C function, passing EC, self, and some number of arguments. `invokebuiltin` gets the arguments from the stack, whereas the `_delegate` instructions use a subset of the locals. `opt_invokebuiltin_delegate_leave` has a fast path for `leave`, but I'm not sure we need to do anything special for that here (FWIW YJIT appears to treat the two delegate instructions the same). Notes: Merged-By: k0kubun <takashikkbn@gmail.com>
2025-06-18Add a test for the previous commitYusuke Endoh
Notes: Merged: https://github.com/ruby/ruby/pull/13238
2025-06-17Refactor generic fields to use `T_IMEMO/fields` objects.Jean Boussier
Followup: https://github.com/ruby/ruby/pull/13589 This simplify a lot of things, as we no longer need to manually manage the memory, we can use the Read-Copy-Update pattern and avoid numerous race conditions. Co-Authored-By: Étienne Barrié <etienne.barrie@gmail.com> Notes: Merged: https://github.com/ruby/ruby/pull/13626
2025-06-17ZJIT: Add codegen (and FrameState) for GetConstPathAlan Wu
Issue a call to rb_vm_opt_getconstant_path() like the interpreter, but since that allocates the IC, we need to save the PC before calling. Add FrameState to GetConstPath to get access to the PC. Notes: Merged: https://github.com/ruby/ruby/pull/13628
2025-06-17ZJIT: Parse opt freeze insns to HIRDaniel Colson
* `opt_hash_freeze` * `opt_ary_freeze` * `opt_str_freeze` * `opt_str_uminus` Similar to `opt_neq`, but there are no args for `freeze` Co-authored-by: ywenc <ywenc@github.com> Co-authored-by: Max Bernstein <max@bernsteinbear.com> Notes: Merged: https://github.com/ruby/ruby/pull/13588
2025-06-17[ruby/prism] [DOC] Fix a typo in commentNobuyoshi Nakada
ruby/ruby#13636 https://github.com/ruby/prism/commit/e13d4f19db Co-Authored-By: Tim Smith <tsmith84@gmail.com>
2025-06-17[rubygems/rubygems] Fix `gem install` sometimes compiling the wrong source filesDavid Rodríguez
If a previous copy of a gem is already installed, RubyGems will not reinstall the gem but only recompile its extensions. This seems like a good idea, but only if the gem is being installed from the registry. If we are installing a locally built package, then the package should be completely reinstalled and extensions compiled from the sources in the locally built package, not from the sources in the previous installation. https://github.com/rubygems/rubygems/commit/1c282d98d5
2025-06-17[rubygems/rubygems] Refactor some logic to create extconf files for testsDavid Rodríguez
https://github.com/rubygems/rubygems/commit/9a859078ab
2025-06-17[rubygems/rubygems] Use `Dir.chdir` with a blockDavid Rodríguez
I don't see any warnings. https://github.com/rubygems/rubygems/commit/395df777a2
2025-06-17io_buffer: Reimplement dcompact for IO::BufferKasumi Hanazuki
The `source` field in IO::Buffer can have a String or an IO::Buffer object, if not nil. - When the `source` is a String object. The `base` field points to the memory location of the String content, which can be embedded in RSTRING, and in that case, GC compaction can move the memory region along with the String object. Thus, IO::Buffer needs to pin the `source` object to prevent `base` pointer from becoming invalid. - When the `source` is an IO::Buffer, then `base` is a pointer to a malloced or mmapped memory region, managed by the source IO::Buffer. In this case, we don't need to pin the source IO::Buffer object, since the referred memory region won't get moved by GC. Closes: [Bug #21210] Notes: Merged: https://github.com/ruby/ruby/pull/13033
2025-06-17ZJIT: Add codegen for StringCopyDaniel Colson
Prior to this commit we compiled `putstring` and `putchilledstring` to `StringCopy`, but then failed to compile past HIR. This commit adds codegen for `StringCopy` to call `rb_ec_str_ressurrect` as the VM does for these instructions. Notes: Merged: https://github.com/ruby/ruby/pull/13625
2025-06-16Add test for `IO::Buffer.for(frozen_string) {}` and omit rb_str_{,un}locktmp ↵Benoit Daloze
in that case Notes: Merged: https://github.com/ruby/ruby/pull/13615
2025-06-16ZJIT: Add support for putspecialobject (#13565)Stan Lo
* ZJIT: Add support for putspecialobject * Address feedback * Update tests * Adjust the indentation of a Ruby test --------- Co-authored-by: Takashi Kokubun <takashikkbn@gmail.com> Notes: Merged-By: k0kubun <takashikkbn@gmail.com>
2025-06-16Use `success` option to check if the process failedNobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/13624
2025-06-16Suppress stderr output in `TestRubyOptions#assert_segv`Nobuyoshi Nakada
It is checked against the given `list`, do not print the same output twice. Notes: Merged: https://github.com/ruby/ruby/pull/13624
2025-06-16Use the message given to `TestRubyOptions#assert_segv`Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/13624
2025-06-15[ruby/date] [Bug #21436] check for fixnum lower bound in `m_ajd`Dmitry Dygalo
Issue - https://bugs.ruby-lang.org/issues/21436 Apparently, the lower bound check is missing, which results in overflow & wrapping later on in RB_INT2FIX Signed-off-by: Dmitry Dygalo <dmitry.dygalo@workato.com> https://github.com/ruby/date/commit/67d75e8423
2025-06-15[ruby/date] [Bug #21437] Date#hash for large yearsDmitry Dygalo
Addresses https://bugs.ruby-lang.org/issues/21437 Signed-off-by: Dmitry Dygalo <dmitry.dygalo@workato.com> https://github.com/ruby/date/commit/31f07bc576
2025-06-15Relax the criteria of flaky weak_references count testNobuyoshi Nakada
2025-06-15Simplify weak_references count test initializationNobuyoshi Nakada
Using an enumerator does not resolve the intermittent failures: 100+ failures in 10,000 iterations.
2025-06-15Implement COLON3 NODE locationsydah
Notes: Merged: https://github.com/ruby/ruby/pull/11987
2025-06-15Implement COLON2 NODE locationsydah
Notes: Merged: https://github.com/ruby/ruby/pull/11987
2025-06-14Skip test_exivar_resize_with_compaction_stress on s390xJohn Hawthorn
Notes: Merged: https://github.com/ruby/ruby/pull/13617
2025-06-13Fix generic_ivar_set_shape_field for table rebuildJohn Hawthorn
[Bug #21438] Previously GC could trigger a table rebuild of the generic fields st_table in the middle of calling the st_update callback. This could cause entries to be reallocated or rearranged and the update to be for the wrong entry. This commit adds an assertion to make that case easier to detect, and replaces the st_update with a separate st_lookup and st_insert. Co-authored-by: Aaron Patterson <tenderlove@ruby-lang.org> Co-authored-by: Jean Boussier <byroot@ruby-lang.org> Notes: Merged: https://github.com/ruby/ruby/pull/13589
2025-06-14Remove test_object_id_race_free_with_stress_compactJean Boussier
This test was written for another implementation of `#object_id` which had complex interations with GC, that's not the case of the implementation that was actually merged.
2025-06-14Add `open_timeout` as an overall timeout option for `Socket.tcp` (#13368)Misaki Shioi
* Add `open_timeout` as an overall timeout option for `Socket.tcp` [Background] Currently, `TCPSocket.new` and `Socket.tcp` accept two kind of timeout options: - `resolv_timeout`, which controls the timeout for DNS resolution - `connect_timeout`, which controls the timeout for the connection attempt With the introduction of Happy Eyeballs Version 2 (as per [RFC 8305](https://datatracker.ietf.org/doc/html/rfc8305)) in[ Feature #20108](https://bugs.ruby-lang.org/issues/20108) and [Feature #20782](https://bugs.ruby-lang.org/issues/20782), both address resolution and connection attempts are now parallelized. As a result, the sum of `resolv_timeout` and `connect_timeout` no longer represents the total timeout duration. This is because, in HEv2, name resolution and connection attempts are performed concurrently, causing the two timeouts to overlap. Example: When `resolv_timeout: 200ms` and `connect_timeout: 100ms` are set: 1. An IPv6 address is resolved after the method starts immediately (IPv4 is still being resolved). 2. A connection attempt is initiated to the IPv6 address 3. After 100ms, `connect_timeout` is exceeded. However, since `resolv_timeout` still has 100ms left, the IPv4 resolution continues. 4. After 200ms from the start, the method raises a `resolv_timeout` error. In this case, the total elapsed time before a timeout is 200ms, not the expected 300ms (100ms + 200ms). Furthermore, in HEv2, connection attempts are also parallelized. It starts a new connection attempts every 250ms for resolved addresses. This makes the definition of `connect_timeout` even more ambiguous—specifically, it becomes unclear from which point the timeout is counted. Additionally, these methods initiate new connection attempts every 250ms (Connection Attempt Delay) for each candidate address, thereby parallelizing connection attempts. However, this behavior makes it unclear from which point in time the connect_timeout is actually measured. Currently, a `connect_timeout` is raised only after the last connection attempt exceeds the timeout. Example: When `connect_timeout: 100ms` is set and 3 address candidates: 1. Start a connection attempt to the address `a` 2. 250ms after step 1, start a new connection attempt to the address `b` 3. 500ms after step 1, start a new connection attempt to the address `c` 4. 1000ms after step 3 (1000ms after starting the connection to `c`, 1250ms after starting the connection to `b,` and 1500ms after starting the connection to `a`) `connect_timeout` is raised This behavior aims to favor successful connections by allowing more time for each attempt, but it results in a timeout model that is difficult to reason about. These methods have supported `resolv_timeout` and `connect_timeout` options even before the introduction of HEv2. However, in many use cases, it would be more convenient if a timeout occurred after a specified duration from the start of the method. Similar functions in other languages (such as PHP, Python, and Go) typically allow specifying only an overall timeout. [Proposal] I propose adding an `open_timeout` option to `Socket.tcp` in this PR, which triggers a timeout after a specified duration has elapsed from the start of the method. The name `open_timeout` aligns with the existing accessor used in `Net::HTTP`. If `open_timeout` is specified together with `resolv_timeout` and `connect_timeout`, I propose that only `open_timeout` be used and the others be ignored. While it is possible to support combinations of `open_timeout`, `resolv_timeout`, and `connect_timeout`, doing so would require defining which timeout takes precedence in which situations. In this case, I believe it is more valuable to keep the behavior simple and easy to understand, rather than supporting more complex use cases. If this proposal is accepted, I also plan to extend `open_timeout` support to `TCPSocket.new`. While the long-term future of `resolv_timeout` and `connect_timeout` may warrant further discussion, I believe the immediate priority is to offer a straightforward way to specify an overall timeout. [Outcome] If `open_timeout` is also supported by `TCPSocket.new`, users would be able to manage total connection timeouts directly in `Net::HTTP#connect` without relying on `Timeout.timeout`. https://github.com/ruby/ruby/blob/aa0f689bf45352c4a592e7f1a044912c40435266/lib/net/http.rb#L1657 --- * Raise an exception if it is specified together with other timeout options > If open_timeout is specified together with resolv_timeout and connect_timeout, I propose that only open_timeout be used and the others be ignored. Since this approach may be unclear to users, I’ve decided to explicitly raise an `ArgumentError` if these options are specified together. * Add doc * Fix: open_timeout error should be raised even if there are still addresses that have not been tried Notes: Merged-By: shioimm <shioi.mm@gmail.com>
2025-06-13Fix a race condition in object_id for shareable objectsJean Boussier
If an object is shareable and has no capacity left, it isn't safe to store the object ID in fields as it requires an object resize which can't be done unless all field reads are synchronized. In this very specific case we create the object_id in advance, before the object is made shareable. Notes: Merged: https://github.com/ruby/ruby/pull/13609
2025-06-13test/ruby/test_ractor.rb: avoid outputting anythingJean Boussier
Notes: Merged: https://github.com/ruby/ruby/pull/13611
2025-06-13[Bug #21440] Stop caching member list in frozen Data/Struct classNobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/13603
2025-06-12ZJIT: Write a callee frame on JIT-to-JIT calls (#13579)Takashi Kokubun
Co-authored-by: Max Bernstein <tekknolagi@gmail.com> Notes: Merged-By: k0kubun <takashikkbn@gmail.com>
2025-06-12Ensure crr->feature is an fstringJohn Hawthorn
Notes: Merged: https://github.com/ruby/ruby/pull/13531