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

77625 Коммитов

Автор SHA1 Сообщение Дата
Jeremy Evans 9b4bf02aa8 Optimize send calls
Similar to the bmethod optimization, this avoids using
CALLER_ARG_SPLAT if not necessary.  As long as the method argument
can be shifted off, other arguments are passed through as-is.

This optimizes the following types of calls:

* send(meth, arg) ~5%
* send(meth, *args) ~75% for args.length == 200
* send(meth, *args, **kw) ~50% for args.length == 200
* send(meth, **kw) ~25%
* send(meth, kw: 1) ~115%

Note that empty argument splats do get slower with this approach,
by about 20%.  This is probably because iseq argument setup is
slower for empty argument splats than CALLER_SETUP_ARG is. Other
than non-empty argument splats, other argument splats are faster,
with the speedup depending on the number of arguments.

The following types of calls are not optimized:

* send(*args)
* send(*args, **kw)

This is because the you cannot shift the method argument off
without first splatting the arg.
2023-04-25 08:06:16 -07:00
Jeremy Evans af2da6419a Optimize cfunc calls for f(*a) and f(*a, **kw) if kw is empty
This optimizes the following calls:

* ~10-15% for f(*a) when a does not end with a flagged keywords hash
* ~10-15% for f(*a) when a ends with an empty flagged keywords hash
* ~35-40% for f(*a, **kw) if kw is empty

This still copies the array contents to the VM stack, but avoids some
overhead. It would be faster to use the array pointer directly,
but that could cause problems if the array was modified during
the call to the function. You could do that optimization for frozen
arrays, but as splatting frozen arrays is uncommon, and the speedup
is minimal (<5%), it doesn't seem worth it.

The vm_send_cfunc benchmark has been updated to test additional cfunc
call types, and the numbers above were taken from the benchmark results.
2023-04-25 08:06:16 -07:00
Jeremy Evans f6254f77f7 Speed up calling iseq bmethods
Currently, bmethod arguments are copied from the VM stack to the
C stack in vm_call_bmethod, then copied from the C stack to the VM
stack later in invoke_iseq_block_from_c.  This is inefficient.

This adds vm_call_iseq_bmethod and vm_call_noniseq_bmethod.
vm_call_iseq_bmethod is an optimized method that skips stack
copies (though there is one copy to remove the receiver from
the stack), and avoids calling vm_call_bmethod_body,
rb_vm_invoke_bmethod, invoke_block_from_c_proc,
invoke_iseq_block_from_c, and vm_yield_setup_args.

Th vm_call_iseq_bmethod argument handling is similar to the
way normal iseq methods are called, and allows for similar
performance optimizations when using splats or keywords.
However, even in the no argument case it's still significantly
faster.

A benchmark is added for bmethod calling.  In my environment,
it improves bmethod calling performance by 38-59% for simple
bmethod calls, and up to 180% for bmethod calls passing
literal keywords on both sides.

```

./miniruby-iseq-bmethod:  18159792.6 i/s
          ./miniruby-m:  13174419.1 i/s - 1.38x  slower

                   bmethod_simple_1
./miniruby-iseq-bmethod:  15890745.4 i/s
          ./miniruby-m:  10008972.7 i/s - 1.59x  slower

             bmethod_simple_0_splat
./miniruby-iseq-bmethod:  13142804.3 i/s
          ./miniruby-m:  11168595.2 i/s - 1.18x  slower

             bmethod_simple_1_splat
./miniruby-iseq-bmethod:  12375791.0 i/s
          ./miniruby-m:   8491140.1 i/s - 1.46x  slower

                   bmethod_no_splat
./miniruby-iseq-bmethod:  10151258.8 i/s
          ./miniruby-m:   8716664.1 i/s - 1.16x  slower

                    bmethod_0_splat
./miniruby-iseq-bmethod:   8138802.5 i/s
          ./miniruby-m:   7515600.2 i/s - 1.08x  slower

                    bmethod_1_splat
./miniruby-iseq-bmethod:   8028372.7 i/s
          ./miniruby-m:   5947658.6 i/s - 1.35x  slower

                   bmethod_10_splat
./miniruby-iseq-bmethod:   6953514.1 i/s
          ./miniruby-m:   4840132.9 i/s - 1.44x  slower

                  bmethod_100_splat
./miniruby-iseq-bmethod:   5287288.4 i/s
          ./miniruby-m:   2243218.4 i/s - 2.36x  slower

                         bmethod_kw
./miniruby-iseq-bmethod:   8931358.2 i/s
          ./miniruby-m:   3185818.6 i/s - 2.80x  slower

                      bmethod_no_kw
./miniruby-iseq-bmethod:  12281287.4 i/s
          ./miniruby-m:  10041727.9 i/s - 1.22x  slower

                   bmethod_kw_splat
./miniruby-iseq-bmethod:   5618956.8 i/s
          ./miniruby-m:   3657549.5 i/s - 1.54x  slower
```
2023-04-25 08:06:16 -07:00
Jeremy Evans 99c6d19e50 Generalize cfunc large array splat fix to fix many additional cases raising SystemStackError
Originally, when 2e7bceb34e fixed cfuncs to no
longer use the VM stack for large array splats, it was thought to have fully
fixed Bug #4040, since the issue was fixed for methods defined in Ruby (iseqs)
back in Ruby 2.2.

After additional research, I determined that same issue affects almost all
types of method calls, not just iseq and cfunc calls.  There were two main
types of remaining issues, important cases (where large array splat should
work) and pedantic cases (where large array splat raised SystemStackError
instead of ArgumentError).

Important cases:

```ruby
define_method(:a){|*a|}
a(*1380888.times)

def b(*a); end
send(:b, *1380888.times)

:b.to_proc.call(self, *1380888.times)

def d; yield(*1380888.times) end
d(&method(:b))

def self.method_missing(*a); end
not_a_method(*1380888.times)

```

Pedantic cases:

```ruby
def a; end
a(*1380888.times)
def b(_); end
b(*1380888.times)
def c(_=nil); end
c(*1380888.times)

c = Class.new do
  attr_accessor :a
  alias b a=
end.new
c.a(*1380888.times)
c.b(*1380888.times)

c = Struct.new(:a) do
  alias b a=
end.new
c.a(*1380888.times)
c.b(*1380888.times)
```

This patch fixes all usage of CALLER_SETUP_ARG with splatting a large
number of arguments, and required similar fixes to use a temporary
hidden array in three other cases where the VM would use the VM stack
for handling a large number of arguments.  However, it is possible
there may be additional cases where splatting a large number
of arguments still causes a SystemStackError.

This has a measurable performance impact, as it requires additional
checks for a large number of arguments in many additional cases.

This change is fairly invasive, as there were many different VM
functions that needed to be modified to support this. To avoid
too much API change, I modified struct rb_calling_info to add a
heap_argv member for storing the array, so I would not have to
thread it through many functions.  This struct is always stack
allocated, which helps ensure sure GC doesn't collect it early.

Because of how invasive the changes are, and how rarely large
arrays are actually splatted in Ruby code, the existing test/spec
suites are not great at testing for correct behavior.  To try to
find and fix all issues, I tested this in CI with
VM_ARGC_STACK_MAX to -1, ensuring that a temporary array is used
for all array splat method calls.  This was very helpful in
finding breaking cases, especially ones involving flagged keyword
hashes.

Fixes [Bug #4040]

Co-authored-by: Jimmy Miller <jimmy.miller@shopify.com>
2023-04-25 08:06:16 -07:00
Hiroshi SHIBATA e7cdce83e8
Temporary skipped failing assertions 2023-04-25 15:05:14 +09:00
Hiroshi SHIBATA 758063e068
Removed commented-out code 2023-04-25 14:46:01 +09:00
schneems 3d5febf65b [ruby/syntax_suggest] Clean up output
I previously left a comment stating I didn't know why a certain method existed. In investigating the code in `CaptureCodeContext#capture_before_after_kws` I found that it was added as to give a slightly less noisy output.

The docs for AroundBlockScan#capture_neighbor_context only describe keywords as being a primary concern. I modified that code to only include lines that are keywords or ends. This reduces the output noise even more.

This allows me to remove that `start_at_next_line` method.

One weird side effect of the prior logic is it would cause this code to produce this output:

```
        class OH
          def hello

          def hai
          end
        end
```

```
          1  class OH
        > 2    def hello
          4    def hai
          5    end
          6  end
```

But this code to produce this output:

```
        class OH
          def hello
          def hai
          end
        end
```

```
          1  class OH
        > 2    def hello
          4    end
          5  end
```
Note the missing `def hai`. The only difference between them is that space.

With this change, they're now both consistent.

https://github.com/ruby/syntax_suggest/commit/4a54767a3e
2023-04-25 14:43:06 +09:00
Hiroshi SHIBATA f77dc6fb16 [ruby/syntax_suggest] standardrb --fix-unsafely spec/spec_helper.rb
https://github.com/ruby/syntax_suggest/commit/6e266b3b2b
2023-04-25 14:43:05 +09:00
Stan Lo 9ccf0a066d [ruby/irb] Add tests for Locale class
(https://github.com/ruby/irb/pull/566)

https://github.com/ruby/irb/commit/df32e024be
2023-04-25 14:41:06 +09:00
Akinori MUSHA ed887cbb4c [ruby/set] Update lib/set.rb
https://github.com/ruby/set/commit/bc59f85f2f
2023-04-25 01:58:12 +00:00
Hiroshi SHIBATA 15796ae1e8 [ruby/set] Expose Set::VERSION
https://github.com/ruby/set/commit/d39b33f463
2023-04-25 01:58:12 +00:00
Akinori MUSHA c301ba0a66 [ruby/abbrev] Update lib/abbrev.rb
https://github.com/ruby/abbrev/commit/6fa790eac1
2023-04-25 01:55:57 +00:00
Hiroshi SHIBATA 8b9b075b83 [ruby/abbrev] Expose Abbrev::VERSION
https://github.com/ruby/abbrev/commit/255ca681c3
2023-04-25 01:55:56 +00:00
Akinori MUSHA 85ed226cca [ruby/syslog] Improve the version extraction
https://github.com/ruby/syslog/commit/34da65a002
2023-04-25 01:51:26 +00:00
Akinori MUSHA a66c41d600 [ruby/syslog] Raise required_ruby_version
https://github.com/ruby/syslog/commit/5289373016
2023-04-25 01:51:25 +00:00
Hiroshi SHIBATA 117fc8e72d [ruby/syslog] Expose Syslog::VERSION
https://github.com/ruby/syslog/commit/ff5d72fcb9
2023-04-25 01:51:24 +00:00
dependabot[bot] 0cc5c5952d [rubygems/rubygems] Bump rb-sys
Bumps [rb-sys](https://github.com/oxidize-rb/rb-sys) from 0.9.72 to 0.9.74.
- [Release notes](https://github.com/oxidize-rb/rb-sys/releases)
- [Commits](https://github.com/oxidize-rb/rb-sys/compare/v0.9.72...v0.9.74)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-24 22:19:25 +00:00
Takashi Kokubun 0bf10dfd25 Avoid linking capstone by default
Workaround for https://github.com/ruby/setup-ruby/pull/501#issuecomment-1520722486
2023-04-24 12:54:33 -07:00
Takashi Kokubun f492e3b4e5
YJIT: Use general definedivar at the end of chains (#7756) 2023-04-24 12:20:52 -07:00
Takashi Kokubun f84d94b803
YJIT: Show definedivar exit reasons (#7755) 2023-04-24 12:20:18 -07:00
Carl Brasic 8a132358d7 [ruby/reline] Revert #335 (Trap TSTP to handle C-z)
(https://github.com/ruby/reline/pull/535)

This PR was an effort to address #321 (ed_quoted_insert doesn't work
properly) but per the reporter it did not work correctly.

Moreover, it introduced a major regression: Shell job control stopped
working in all applications that use reline, notably IRB.

Bash and other shells send SIGTSTP in response to C-z to implement job
suspension. Handling SIGSTP opts out of this functionality. For a
line oriented terminal program this should be avoided (not to mention,
this behavior diverges from readline's)

https://github.com/ruby/reline/commit/26383d25b8

Co-authored-by: Carl Brasic <cbrasic@drwholdings.com>
2023-04-24 16:31:13 +00:00
Jeremy Evans f8e7048348 Allow anonymous memberless Struct
Previously, named memberless Structs were allowed, but anonymous
memberless Structs were not.

Fixes [Bug #19416]
2023-04-24 07:37:20 -07:00
Stan Lo 73fc81199d [ruby/irb] Simplify the help command's implementation
(https://github.com/ruby/irb/pull/564)

The current method-redefining approach brings little benefit, makes it
harder to understand the code, and causes warnings like:

> warning: method redefined; discarding old execute

This patch simplifies it while displaying more helpful message when rdoc
couldn't be loaded.
2023-04-24 14:10:36 +00:00
Stan Lo 805899dda2 [ruby/irb] Filter out top-level methods when using `ls
<Class/Module>`
(https://github.com/ruby/irb/pull/562)

Instead of always printing methods inherited from Class or Module, IRB by
default should filter them out unless `<Class/Module>` is specified to be
either of those.
2023-04-24 14:05:16 +00:00
dependabot[bot] 886986b3ef Bump github/codeql-action from 2.2.11 to 2.3.0
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.2.11 to 2.3.0.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](d186a2a36c...b2c19fb9a2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-24 12:48:15 +09:00
Jeremy Evans a8ba1ddd78 Use UTF-8 encoding for literal extended regexps with UTF-8 characters in comments
Fixes [Bug #19455]
2023-04-23 19:27:58 -07:00
Yusuf Daniju ec211ad54d [ruby/irb] fix typo in tracer (https://github.com/ruby/irb/pull/565)
https://github.com/ruby/irb/commit/2f567f3d3e
2023-04-23 18:41:40 +00:00
Nobuyoshi Nakada dafbaabc04
Check the precision of `getrusage` at runtime 2023-04-23 12:01:13 +09:00
Nobuyoshi Nakada c5529aa5fc Fix a guard of `Process.times`
`GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID` clock uses `getrusage`
always if available as the name states.  That is if it is implemented
`getrusage` is available, regardless microseconds in its results.
2023-04-22 21:21:35 +09:00
Nobuyoshi Nakada 4cff7a92b8 Fix an example of `Process.times`
Prior to commit 5806c54447, it was "at
least one result with precision beyond milliseconds (with none-zero
microseconds) should exist"; after this commit, "at least one result
should have zero microseconds".  This chance is lower than the
previous condition.
2023-04-22 21:21:35 +09:00
Takashi Kokubun 1702b0f438
Remove unused opt_call_c_function insn (#7750) 2023-04-21 23:58:07 -07:00
Nobuyoshi Nakada de5cd5a635
Use shorter path as `SPEC_TEMP_DIR`
The temporary directory under the build directory may be too long as a
UNIX socket path.  On macOS, the default `TMPDIR` per user is also
very long.
2023-04-21 22:24:55 +09:00
Nobuyoshi Nakada e956052fa9
Skip when unix socket path is too long
Eventually the path directly under "/tmp" is complained by `rm_r` in
spec/mspec/lib/mspec/helpers/fs.rb.
2023-04-21 22:17:18 +09:00
Nobuyoshi Nakada 39bbbd767d
Add rubyspec-capiext on mswin 2023-04-21 21:28:08 +09:00
Hiroshi SHIBATA 94a418d0bb [ruby/rinda] Expose Rinda::VERSION
https://github.com/ruby/rinda/commit/fa3865ac48
2023-04-21 06:22:52 +00:00
Hiroshi SHIBATA b9b43a1020 [ruby/win32ole] Reuse WIN32OLE_VERSION for gem version
https://github.com/ruby/win32ole/commit/bff3ea8b0b
2023-04-21 04:46:10 +00:00
Hiroshi SHIBATA 9702a8142b [ruby/fcntl] Expose Fcntl::VERSION
https://github.com/ruby/fcntl/commit/cb8e414e9f
2023-04-21 04:21:05 +00:00
John Hawthorn 072ef7a1aa YJIT: invokesuper: Remove cme mid matching check
This check was introduced to match an assertion in the C YJIT when this
was originally introduced. I don't believe it's necessary for
correctness of the generated code.

Co-authored-by: Adam Hess <HParker@github.com>
Co-authored-by: Daniel Colson <danieljamescolson@gmail.com>
Co-authored-by: Luan Vieira <luanzeba@github.com>
2023-04-20 16:09:16 -07:00
Takashi Kokubun a42c36c0f1
YJIT: Merge lower_stack into the split pass (#7748) 2023-04-20 15:35:27 -07:00
Peter Zhu ae90fa981a [DOC] Documentation for flags of RClass 2023-04-20 16:53:13 -04:00
Maxime Chevalier-Boisvert 277098bde2 Fix inaccurate comment 2023-04-20 16:31:34 -04:00
Takashi Kokubun 64a25977ed
YJIT: Merge csel and mov on arm64 (#7747)
* YJIT: Refactor arm64_split with &mut insn

* YJIT: Merge csel and mov on arm64
2023-04-20 13:08:42 -07:00
Takashi Kokubun 995b960c70
YJIT: Avoid splitting mov for small values on arm64 (#7745)
* YJIT: Avoid splitting mov for small values on arm64

* Fix a comment

Co-authored-by: Alan Wu <XrXr@users.noreply.github.com>

* YJIT: Test the 0xffff boundary

---------

Co-authored-by: Alan Wu <XrXr@users.noreply.github.com>
2023-04-20 10:05:30 -07:00
Hiroshi SHIBATA ce38ad6963 [rubygems/rubygems] util/rubocop -A
https://github.com/rubygems/rubygems/commit/784e5e2fe5
2023-04-20 01:57:17 +00:00
Hiroshi SHIBATA b42f0094ce [rubygems/rubygems] Support Symbol and URL keys
https://github.com/rubygems/rubygems/commit/3bda049c73
2023-04-20 01:57:17 +00:00
Hiroshi SHIBATA 4bb0e01da2 [rubygems/rubygems] warn message when RubyGems handle invalid yaml like 'invalid: foo: bar'
https://github.com/rubygems/rubygems/commit/b8d0c25b7e
2023-04-20 01:57:17 +00:00
Hiroshi SHIBATA dbcdac00e6 [rubygems/rubygems] Revert "Bundler::YAMLSerializer.load couldn't raise error when invalid yaml was provided"
This reverts commit https://github.com/rubygems/rubygems/commit/cfcfde04c783.

https://github.com/rubygems/rubygems/commit/ac21ae7083
2023-04-20 01:57:16 +00:00
Nobuyoshi Nakada 5579cbe2dd
Ignore ASCII-incompatible scripts under spec/ruby [ci skip] 2023-04-20 10:29:16 +09:00
Nobuyoshi Nakada ad4a160220
Exit explicitly instead of ! 2023-04-20 10:28:29 +09:00
Nobuyoshi Nakada 2d301945f6
Run source file checks on all branches 2023-04-20 10:25:44 +09:00