Граф коммитов

86881 Коммитов

Автор SHA1 Сообщение Дата
Jeremy Evans ea7ceff82c
Avoid hash allocation for certain proc calls
Previously, proc calls such as:

```ruby
proc{|| }.(**empty_hash)
proc{|b: 1| }.(**r2k_array_with_empty_hash)
```

both allocated hashes unnecessarily, due to two separate code paths.

The first call goes through CALLER_SETUP_ARG/vm_caller_setup_keyword_hash,
and is simple to fix by not duping an empty keyword hash that will be
dropped.

The second case is more involved, in setup_parameters_complex, but is
fixed the exact same way as when the ruby2_keywords hash is not empty,
by flattening the rest array to the VM stack, ignoring the last
element (the empty keyword splat).  Add a flatten_rest_array static
function to handle this case.

Update test_allocation.rb to automatically convert the method call
allocation tests to proc allocation tests, at least for the calls
that can be converted.  With the code changes, all proc call
allocation tests pass, showing that proc calls and method calls
now allocate the same number of objects.

I've audited the allocation tests, and I believe that all of the low
hanging fruit has been collected.  All remaining allocations are
either caller side:

* Positional splat + post argument
* Multiple positional splats
* Literal keywords + keyword splat
* Multiple keyword splats

Or callee side:

* Positional splat parameter
* Keyword splat parameter
* Keyword to positional argument conversion for methods that don't accept keywords
* ruby2_keywords method called with keywords

Reapplies abc04e898b, which was reverted at
d56470a27c, with the addition of a bug fix and
test.

Fixes [Bug #20679]
2024-08-19 19:00:37 -07:00
Kazuhiro NISHIYAMA 6dccb0131e
Sort links [ci skip] 2024-08-20 10:27:45 +09:00
dependabot[bot] e398e84c77 [rubygems/rubygems] Bump rb-sys
Bumps [rb-sys](https://github.com/oxidize-rb/rb-sys) from 0.9.100 to 0.9.101.
- [Release notes](https://github.com/oxidize-rb/rb-sys/releases)
- [Commits](https://github.com/oxidize-rb/rb-sys/compare/v0.9.100...v0.9.101)

---
updated-dependencies:
- dependency-name: rb-sys
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

https://github.com/rubygems/rubygems/commit/3addc2c3e7
2024-08-19 19:21:40 +00:00
dependabot[bot] d1b2479b9f [rubygems/rubygems] Bump rb-sys
Bumps [rb-sys](https://github.com/oxidize-rb/rb-sys) from 0.9.100 to 0.9.101.
- [Release notes](https://github.com/oxidize-rb/rb-sys/releases)
- [Commits](https://github.com/oxidize-rb/rb-sys/compare/v0.9.100...v0.9.101)

---
updated-dependencies:
- dependency-name: rb-sys
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

https://github.com/rubygems/rubygems/commit/d26f5824a7
2024-08-19 17:55:19 +00:00
Peter Zhu cb28487722 Make assertions allow incremental GC when disabled
When assertions are enabled, the following code triggers an assertion
error:

    GC.disable
    GC.start(immediate_mark: false, immediate_sweep: false)

    10_000_000.times { Object.new }

This is because the GC.start ignores that the GC is disabled and will
start incremental marking and lazy sweeping. But the assertions in
gc_marks_continue and gc_sweep_continue assert that GC is not disabled.

This commit changes it for the assertion to pass if the GC was triggered
from a method.
2024-08-19 10:58:36 -04:00
David Rodríguez 786d000652 [ruby/rdoc] Avoid potentially loading the same extension from different versions of the same gem
Avoids warnings like

```
/path/to/ruby/3.3.4/lib/ruby/gems/3.3.0/gems/rbs-3.4.0/lib/rdoc/discover.rb:10: warning: method redefined; discarding old scan
/path/to/ruby/3.3.4/lib/ruby/gems/3.3.0/gems/rbs-3.5.1/lib/rdoc/discover.rb:10: warning: previous definition of scan was here
```

https://github.com/ruby/rdoc/commit/e47920d8f3
2024-08-19 11:48:42 +00:00
Nobuyoshi Nakada cd0d4ec059
Single letter ASCII operator is same as the corresponding ID 2024-08-19 19:50:08 +09:00
Nobuyoshi Nakada 566f2eb501
Merge `rb_fork_ruby2` into `rb_fork_ruby` 2024-08-19 15:36:49 +09:00
Marco Roth 7061359564 [rubygems/rubygems] Change new gem README template to have copyable code blocks
https://github.com/rubygems/rubygems/commit/c805e9b558
2024-08-19 00:04:48 +00:00
Victor Shepelev d450f9d6a2
Make Range#step to consistently use + for iteration (#7444)
Make Range#step to consistently use + for iteration [Feature #18368]

Previously, non-numerics expected step to be integer,
and iterated with begin#succ, skipping over step value
steps. Since this commit, numeric and non-numeric iteration
behaves the same way, by using + operator.
2024-08-18 13:15:18 +03:00
Neil Carvalho 4dbf386ca2
[DOC] Add `$;` to the list of deprecated global variables 2024-08-17 19:36:22 +09:00
git 694181a9f3 Update bundled gems list as of 2024-08-16 2024-08-17 07:00:35 +00:00
Jeremy Evans d56470a27c Revert "Avoid hash allocation for certain proc calls"
This reverts commit abc04e898b.

This caused problems in a Rails test.
2024-08-16 17:59:05 -07:00
Peter Zhu 2fe6a4f84d Fix assertion error when TracePoint has incompatible events
TracePoints with incompatible events (i.e. events not in ISEQ_TRACE_EVENTS)
with a method target will fail an assertion error because it does not
filter for the supported events. For example, the following lines will
cause an assertion error:

    def foo; end
    # No arguments passed into TracePoint.new enables all ISEQ_TRACE_EVENTS
    TracePoint.new {}.enable(target: method(:foo))
    # Raise is not supported with a target
    TracePoint.new(:raise, :return) {}.enable(target: method(:foo))
    foo

Crashes with:

    Assertion Failed: vm_insnhelper.c:7026:vm_trace:(iseq_local_events & ~(0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010| 0x0020| 0x0040 | 0x0100 | 0x0200 | 0x4000 | 0x010000| 0x020000)) == 0
2024-08-16 16:12:49 -04:00
Burdette Lamar 77ac853c15
[DOC] Tweaks to Array#assoc (#11384) 2024-08-16 16:11:55 -04:00
Jun Aruga 1917c8c8f3 [ruby/openssl] Remove test_ed25519_not_approved_on_fips.
This commit fixes the following failure on OpenSSL master FIPS case.

```
1) Failure: test_ed25519_not_approved_on_fips(OpenSSL::TestPKey): OpenSSL::PKey::PKeyError expected but nothing was raised.
/home/runner/work/openssl/openssl/vendor/bundle/ruby/3.0.0/gems/test-unit-ruby-core-1.0.6/lib/core_assertions.rb:462:in `assert_raise'
/home/runner/work/openssl/openssl/test/openssl/test_pkey.rb:174:in `test_ed25519_not_approved_on_fips'
     171:     MC4CAQAwBQYDK2VwBCIEIEzNCJso/5banbbDRuwRTg9bijGfNaumJNqM9u1PuKb7
     172:     -----END PRIVATE KEY-----
     173:     EOF
  => 174:     assert_raise(OpenSSL::PKey::PKeyError) do
     175:       OpenSSL::PKey.read(priv_pem)
     176:     end
     177:   end
```

Because FIPS compliance is a continually moving target. According to the [1],
FIPS 140-3 *currently* allows ED25519. The ED25519 is allowed again with the
latest OpenSSL FIPS by the commit [2], while it is not allowed in OpenSSL stable
version 3.x FIPS.

Remove this test because we want to keep our tests stable.

[1] https://github.com/openssl/openssl/discussions/22054
[2] 5f04124aab

https://github.com/ruby/openssl/commit/d43904b834
2024-08-16 17:10:23 +00:00
Peter Zhu bbbe07a5db Speed up finalizers for objects without object ID
If the object being finalized does not have an object ID, then we don't
need to insert into the object ID table, we can simply just allocate a
new object ID by bumping the next_object_id counter. This speeds up
finalization for objects that don't have an object ID. For example, the
following script now runs faster:

    1_000_000.times do
      o = Object.new
      ObjectSpace.define_finalizer(o) {}
    end

Before:

    Time (mean ± σ):      1.462 s ±  0.019 s    [User: 1.360 s, System: 0.094 s]
    Range (min … max):    1.441 s …  1.503 s    10 runs

After:

    Time (mean ± σ):      1.199 s ±  0.015 s    [User: 1.103 s, System: 0.086 s]
    Range (min … max):    1.181 s …  1.229 s    10 runs
2024-08-16 09:26:51 -04:00
Raed Rizqie 703305bd03 Revert soname changes
- only i386-ucrt soname is changed to fix building on x86 clang
- fix detection of x86intrin.h on x86 system
- mingw does not have LIBRUBY_SONAME
2024-08-16 17:42:59 +09:00
Nobuyoshi Nakada 21dfe34aae
Stringize VM_ASSERT expression before expansion 2024-08-16 16:55:51 +09:00
Nobuyoshi Nakada 196d59f690
Parenthesize macro arguments 2024-08-16 15:43:43 +09:00
Nobuyoshi Nakada 129b4936bf
Simplify and clarify bitmask calculation 2024-08-16 15:43:43 +09:00
Jun Aruga 08db4bc672 [ruby/openssl] test_s_generate_parameters: Consider a DSA error in FIPS.
DSA kengen is not FIPS-approved. The `EVP_PKEY_paramgen` in the
`OpenSSL::PKey.generate_parameters("DSA")` raises a DSA error in FIPS by the
following commit. Split the test for DSA.

https://github.com/openssl/openssl/commit/49a35f0#diff-605396c063194975af8ce31399d42690ab18186b422fb5012101cc9132660fe1R611-R614

https://github.com/ruby/openssl/commit/5ca6eb4eca
2024-08-16 06:09:15 +00:00
Raed Rizqie 018bd07f07
Fix some warnings
* Fix unused functions when no `mmap`.

  ```
  shape.c:285:1: warning: unused function 'redblack_insert' [-Wunused-function]
    285 | redblack_insert(redblack_node_t * tree, ID key, rb_shape_t * value)
        | ^~~~~~~~~~~~~~~
  ```

* Fix unknown warning group '-Wmaybe-uninitialized' with clang.

  ```
  thread_win32.c:596:1: warning: unknown warning group '-Wmaybe-uninitialized', ignored [-Wunknown-warning-option]
    596 | COMPILER_WARNING_IGNORED(-Wmaybe-uninitialized)
        | ^
  ```

Co-authored-by: Nobuyoshi Nakada <nobu.nakada@gmail.com>
2024-08-16 14:51:21 +09:00
Naoto Ono c06fbb192f Fix flaky TestSetTraceFunc#test_remove_in_trace by filtering trace events 2024-08-16 09:47:07 +09:00
Jeremy Evans abc04e898b Avoid hash allocation for certain proc calls
Previous, proc calls such as:

```ruby
proc{|| }.(**empty_hash)
proc{|b: 1| }.(**r2k_array_with_empty_hash)
```

both allocated hashes unnecessarily, due to two separate code paths.

The first call goes through CALLER_SETUP_ARG/vm_caller_setup_keyword_hash,
and is simple to fix by not duping an empty keyword hash that will be
dropped.

The second case is more involved, in setup_parameters_complex, but is
fixed the exact same way as when the ruby2_keywords hash is not empty,
by flattening the rest array to the VM stack, ignoring the last
element (the empty keyword splat).  Add a flatten_rest_array static
function to handle this case.

Update test_allocation.rb to automatically convert the method call
allocation tests to proc allocation tests, at least for the calls
that can be converted.  With the code changes, all proc call
allocation tests pass, showing that proc calls and method calls
now allocate the same number of objects.

I've audited the allocation tests, and I believe that all of the low
hanging fruit has been collected.  All remaining allocations are
either caller side:

* Positional splat + post argument
* Multiple positional splats
* Literal keywords + keyword splat
* Multiple keyword splats

Or callee side:

* Positional splat parameter
* Keyword splat parameter
* Keyword to positional argument conversion for methods that don't accept keywords
* ruby2_keywords method called with keywords
2024-08-15 13:00:09 -07:00
Peter Zhu 2c6e16eb51 Don't assume st_data_t and VALUE are the same in rb_gc_impl_object_id 2024-08-15 14:33:13 -04:00
Kevin Newton de28ef7db4 [PRISM] Use src encoding not ext encoding 2024-08-15 13:34:25 -04:00
Kevin Newton eb08a2805c [PRISM] test_invalid_jump assertion updates for prism 2024-08-15 13:34:25 -04:00
Kevin Newton a402b18c4e [PRISM] test_syntax_check assertion updates for prism 2024-08-15 13:34:25 -04:00
Kevin Newton 2d66ef717d
Show anonymous and ambiguous params in ISeq disassembly
Previously, in the disasesmbly for ISeqs, there's no way to know if the
anon_rest, anon_kwrest, or ambiguous_param0 flags are set. This commit
extends the names of the rest, kwrest, and lead params to display this
information. They are relevant for the ISeqs' runtime behavior.
2024-08-15 16:59:30 +00:00
BurdetteLamar 33bffde923 [DOC] Tweaks for Array#at 2024-08-15 12:52:09 -04:00
Kevin Newton 5cb6954baa [ruby/prism] Fix up lex result constants
https://github.com/ruby/prism/commit/084baca463
2024-08-15 16:50:00 +00:00
BurdetteLamar d2361ba156 [DOC] Tweaks for Array#push 2024-08-15 12:49:46 -04:00
BurdetteLamar edda29a117 [DOC] Fix Related for Array#all? 2024-08-15 12:48:27 -04:00
BurdetteLamar 1f994683b6 [DOC] Tweaks for Array#any? 2024-08-15 12:46:18 -04:00
Kevin Newton cbf508da58 [ruby/prism] Special error for too short unicode errors
https://github.com/ruby/prism/commit/9f1f7d08bd
2024-08-15 16:40:05 +00:00
Peter Zhu 8312c5be74 Fix GC_ASSERT for gc.c and gc/default.c
gc.c mistakenly defined GC_ASSERT as blank, which caused it to be a
no-op. This caused all assertions in gc.c and gc/default.c to not do
anything. This commit fixes it by moving the definition of GC_ASSERT
to gc/gc.h.
2024-08-15 10:38:24 -04:00
Stan Lo 923e36ab21 [ruby/rdoc] Fix sidebar scroll again and add missing footer back
(https://github.com/ruby/rdoc/pull/1154)

* Add missing footers

In #1152 the footer partial was only added to the index.rhtml file.
This commit adds the footer partial to the other template files.

* Remove unnecessary middle divs in nav

* Simplify sidebar's overflow settings

Because sidebar needs to be scrollable, its overflow should default to auto.
Currently it's set to hidden and force individual elements to set overflow auto,
which overcomplicates things.

https://github.com/ruby/rdoc/commit/b8c2bcd8db
2024-08-15 13:33:00 +00:00
Kentaro Takeyama 2a933609e7 Delete unnecessary rubocop disable comment 2024-08-15 17:16:25 +09:00
tomoya ishida 8a7e6f6852
Improve base time of assert_linear_performance (#11369)
Remove `.ceil` from base time calculation that makes 10x gap.
This will make the assertion more strict and also less flaky.
2024-08-15 06:55:57 +00:00
dependabot[bot] a1d8ef6ebf Bump github/codeql-action from 3.26.1 to 3.26.2
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.26.1 to 3.26.2.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](29d86d22a3...429e197704)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-15 12:09:37 +09:00
Peter Zhu fd974f5d74 Increase timeout of test_finalizer
The test is timing out on lpi4a so a longer timeout should fix it.
2024-08-14 16:23:22 -04:00
Kevin Newton 09bf3c9d6a [PRISM] Trigger moreswitches off shebang 2024-08-14 15:39:03 -04:00
tomoya ishida 002e785e77 [ruby/irb] Fix kill pager pid throwing Errno::ESRCH when pager
process already terminated
(https://github.com/ruby/irb/pull/989)

https://github.com/ruby/irb/commit/949f032e9b
2024-08-14 18:06:53 +00:00
Peter Zhu 0610f1b083 Fix crash when GC runs during finalizers at shutdown
We need to remove from the finalizer_table after running all the
finalizers because GC could trigger during the finalizer which could
reclaim the finalizer table array.

The following code crashes:

    1_000_000.times do
      o = Object.new
      ObjectSpace.define_finalizer(o, proc { })
    end
2024-08-14 13:49:52 -04:00
Burdette Lamar 85f99b3828
[DOC] Tweaks to Array#all? (#11365) 2024-08-14 13:47:28 -04:00
Kevin Newton a952ea243f [ruby/prism] Callback on shebang switches
Add the ability to receive a callback when the parser encounters a
shebang that contains additional switches after the Ruby engine.
This is necessary because some command-line flags may be present
there that will alter the parse.

https://github.com/ruby/prism/commit/afc5000331
2024-08-14 17:40:43 +00:00
Koichi ITO 88954a0e9a [ruby/prism] Tweak inspect representation of `Prism::Location`
This PR tweaks inspect representation of `Prism::Location`.

## Before

During debugging, the meaning of `@location=https://github.com/ruby/prism/commit/21474836481` was unclear:

```console
$ ruby -Ilib -rprism -e 'p Prism.lex("puts :hi").value.map(&:first)[1]'
#<Prism::Token:0x000000010cd74e40 @source=#<Prism::ASCIISource:0x000000010cb5f808 @source="puts :hi", @start_line=1, @offsets=[0]>,
@type=:SYMBOL_BEGIN, @value=":", @location=https://github.com/ruby/prism/commit/21474836481>
```

## After

This PR clarifies the contents of the location object, aligning with what I think user expects:

```console
$ ruby -Ilib -rprism -e 'p Prism.lex("puts :hi").value.map(&:first)[1]'
#<Prism::Token:0x000000010e174d50 @source=#<Prism::ASCIISource:0x000000010df5efe8 @source="puts :hi", @start_line=1, @offsets=[0]>,
@type=:SYMBOL_BEGIN, @value=":", @location=#<Prism::Location @start_offset=5 @length=1 start_line=1>>
```

Although it is uncertain whether Prism will accept this change in the inspect representation, it is submitted here as a suggestion.

https://github.com/ruby/prism/commit/e7421ce1c5
2024-08-14 16:28:43 +00:00
Peter Zhu 264175dbb9 [DOC] Update comment about how object ID is calculated
The object ID no longer treats symbols in a special way so we can simplify
the comment about how it is calculated.
2024-08-14 10:51:02 -04:00
git d095474113 Update bundled gems list as of 2024-08-14 2024-08-14 07:01:44 +00:00