Commit graph

77079 commits

Author SHA1 Message Date
Jimmy Miller
5d0a1ffafa
YJIT: Rest and block_arg support (#7557)
* YJIT: Rest and block_arg support

* Update bootstraptest/test_yjit.rb

---------

Co-authored-by: Maxime Chevalier-Boisvert <maximechevalierb@gmail.com>
2023-03-17 16:11:30 -04:00
git
2d97f87407 * remove trailing spaces. [ci skip] 2023-03-17 20:04:58 +00:00
Matt Valentine-House
c7862c68eb [ci skip] Move rp helper to new LLDB format
For now, the old function still exists as `old_rp`, in order to debug
issues with this command.
2023-03-17 20:04:43 +00:00
git
cc68d692f8 * remove trailing spaces. [ci skip] 2023-03-17 19:20:53 +00:00
Matt Valentine-House
5897a6f686 Update Makefile dependencies 2023-03-17 19:20:40 +00:00
Matt Valentine-House
4f5e29f930 Document the declarative marking api 2023-03-17 19:20:40 +00:00
Matt Valentine-House
22b349294b Implement declarative references for enumerator 2023-03-17 19:20:40 +00:00
Matt Valentine-House
405966e239 Implement declarative references for dir_data_type 2023-03-17 19:20:40 +00:00
Matt Valentine-House
7142328a94 [Feature #19406] Allow declarative definition of references
When using rb_data_type_struct to wrap a C struct, that C struct can
contain VALUE references to other Ruby objects.

If this is the case then one must also define dmark and optionally
dcompact callbacks in order to allow these objects to be correctly
handled by the GC. This is suboptimal as it requires GC related logic to
be implemented by extension developers. This can be a cause of subtle
bugs when references are not marked of updated correctly inside these
callbacks.

This commit provides an alternative approach, useful in the simple case
where the C struct contains VALUE members (ie. there isn't any
conditional logic, or data structure manipulation required to traverse
these references).

In this case references can be defined using a declarative syntax
as a list of edges (or, pointers to references).

A flag can be set on the rb_data_type_struct to notify the GC that
declarative references are being used, and a list of those references
can be assigned to the dmark pointer instead of a function callback, on
the rb_data_type_struct.

Macros are also provided for simple declaration of the reference list,
and building edges.

To avoid having to also find space in the struct to define a length for
the references list, I've chosed to always terminate the references list
with RUBY_REF_END - defined as UINTPTR_MAX. My assumption is that no
single struct will ever be large enough that UINTPTR_MAX is actually a
valid reference.
2023-03-17 19:20:40 +00:00
Takashi Kokubun
9fd94d6a0c
YJIT: Support entry for multiple PCs per ISEQ (GH-7535) 2023-03-17 11:53:17 -07:00
Jean Boussier
3592b24cdc ObjectSpace::WeakMap: clean inverse reference when an entry is re-assigned
[Bug #19531]

```ruby
wmap[1] = "A"
wmap[1] = "B"
```

In the example above, we need to remove the `"A" => 1` inverse reference
so that when `"A"` is GCed the `1` key isn't deleted.
2023-03-17 17:50:08 +00:00
Nobuyoshi Nakada
ccd2dbc4c1 core_assertions.rb: Relax assert_linear_performance
* Use an `Enumerable` as factors, instead of three arguments.

* Include `assert_operator` time in rehearsal time.

* Round up max expected time.
2023-03-18 02:41:02 +09:00
Alan Wu
10e4fa3a0f YJIT: Use raw pointers and shared references over Rc<RefCell<_>>
`Rc` and `RefCell` both incur runtime space costs.
In addition, `RefCell` has given us some headaches with the
non obvious borrow panics it likes to throw out. The latest
one started with 7fd53eeb46
and is yet to be resolved.

Since we already rely on the GC to properly reclaim memory for `Block`
and `Branch`, we might as well stop paying the overhead of `Rc` and
`RefCell`. The `RefCell` panics go away with this change, too.

On 25 iterations of `railsbench` with a stats build I got
`yjit_alloc_size: 8,386,129 => 7,348,637`, with the new memory size 87.6%
of the status quo. This makes the metadata and machine code size roughly
line up one-to-one.

The general idea here is to use `&` shared references with
[interior mutability][1] with `Cell`, which doesn't take any extra
space. The `noalias` requirement that `&mut` imposes is way too hard to
meet and verify. Imagine replacing places where we would've gotten
`BorrowError` from `RefCell` with Rust/LLVM miscompiling us due to aliasing
violations. With shared references, we don't have to think about subtle
cases like the GC _sometimes_ calling the mark callback while codegen
has an aliasing reference in a stack frame below. We mostly only need to
worry about liveness, with which the GC already helps.

There is now a clean split between blocks and branches that are not yet
fully constructed and ones that are "in-service", so to speak. Working
with `PendingBranch` and `JITState` don't really involve `unsafe` stuff.
This change allows `Branch` and `Block` to not have as many optional
fields as many of them are only optional during compilation. Fields that
change post-compilation are wrapped in `Cell` to facilitate mutation
through shared references.

I do some `unsafe` dances here. I've included just a couple tests to run
with Miri (`cargo +nightly miri test miri`). We can add more Miri tests
if desired.

[1]: https://doc.rust-lang.org/std/cell/struct.UnsafeCell.html
2023-03-17 09:30:24 -07:00
Takashi Kokubun
c62cf60d18 Skip a flaky test that might not work 2023-03-17 09:06:52 -07:00
lukeg
418cf344fb [ruby/irb] Fix 2 minor issues in test suite
* undefine Kernel#irb_original_require in without_rdoc method
* Don't rescue all LoadErrors/NameErrors in test_rendering.rb, just
the one for require 'yamatanooroti'

52b79806ea
2023-03-17 15:19:40 +00:00
Peter Zhu
a206ee6709 Assume that FL_FINALIZE is in finalizer_table
If the flag FL_FINALIZE is set, then it's guaranteed to be in the
finalizer_table, so we can directly assume that without checking.
2023-03-17 11:12:45 -04:00
Mau Magnaguagno
11f299fab7
YJIT: skip intermediate arrays in print_sorted_exit_counts (#7547)
Early total_exits condition.
Replace Array#sort_by/first(how_many) with Array#max_by(how_many).
Replace Array#map/max with Array#max_by, match print_counters style for longest_name_length.
2023-03-17 10:29:42 -04:00
David Rodríguez
c65d7b4bea When running bundle lock --update <name>, checkout locked revision of unrelated git sources directly
Since Bundler 2.4, we will try to checkout any branch specified in the
Gemfile, while until Bundler 2.3 we would directly checkout the locked
revision.

This should not make any difference in most situations, but in some edge
cases, like if the branch specified in the `Gemfile` has been renamed,
but the locked revision still exist, it causes an error now while before
it would update the lockfile without issues.

I debated which behavior was best, since I was not sure. But my
conclusion is that if the situation does not require expiring the
lockfile source in favor of the Gemfile source, we should use the locked
revision directly and proceed happily. So I restored Bundler 2.3
behavior.

I think this is consistent with how yanked gems are handled, for example.

Of course, if explicitly updating the git source itself, or all gems, we
will still get any errors like missing branches related to the git source.
2023-03-17 18:50:55 +09:00
David Rodríguez
0b9e51c429 Don´t consider platform specific candidates when force_ruby_platform set
This was working fine for direct dependencies using
`force_ruby_platform` explicitly through Gemfile, but not for indirect
dependencies. In general, indirect dependencies do not have this
property set, but in truffleruby this is different and the default value
is to have it set.
2023-03-17 18:50:55 +09:00
David Rodríguez
12f0be14e2 Don't ignore pre-releases when there's only one candidate
This should be a very rare edge case, however, it does happen when using
a .dev version of Bundler because in that case, that's the only version
that the resolver considers, and it should not be ignored.

We could've special cased this specifically for Bundler, but I think it
does make sense for every gem.
2023-03-17 18:50:55 +09:00
David Rodríguez
ddc4fd5644 Normalize git sources
Just like gem sources, a "style-only" change, like adding a trailing
slash, should not expire them.
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
7800d4eeb5 util/rubocop -A --only Style/MultipleComparison 2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
f8fe151ca9 util/rubocop -A --only Style/TernaryParentheses 2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
31c572f4fa util/rubocop -A --only Style/SymbolArray 2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
1ca67f13cd util/rubocop -A --only Style/RedundantSelf 2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
5211900d37 util/rubocop -A --only Style/SymbolProc 2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
b304cf324a util/rubocop -A --only Layout/ParameterAlignment 2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
0373615948 util/rubocop -A --only Layout/SpaceInsideArrayLiteralBrackets 2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
3e1f767cd5 util/rubocop -A --only Layout/DotPosition 2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
b6d3c06936 util/rubocop -A --only Performance/Casecmp 2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
866831d8e9 [rubygems/rubygems] util/rubocop -A --only Style/Semicolon
97f062be05
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
ab644ae497 [rubygems/rubygems] util/rubocop -A --only Style/CharacterLiteral
aa058ff6b8
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
72d09a568f [rubygems/rubygems] util/rubocop -A --only Style/RedundantBegin
b595d3cf0f
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
a532e9dc37 [rubygems/rubygems] util/rubocop -A --only Style/RedundantSortBy
3e4f5dc008
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
2db7673825 [rubygems/rubygems] util/rubocop -A --only Style/DoubleNegation
01c2b5542f
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
be4cc74e26 [rubygems/rubygems] util/rubocop -A --only Style/IfUnlessModifierOfIfUnless
97e0af2518
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
ee7475734f [rubygems/rubygems] util/rubocop -A --only Style/BarePercentLiterals
02d8147243
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
bf69d1fc5d [rubygems/rubygems] util/rubocop -A --only Style/OrAssignment
965fc82cfd
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
f4b073ef7a [rubygems/rubygems] util/rubocop -A --only Style/UnlessElse
184c03270c
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
4868cfcf1d [rubygems/rubygems] util/rubocop -A --only Style/IdenticalConditionalBranches
64f437a428
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
6ad269dc39 [rubygems/rubygems] util/rubocop -A --only Style/RescueStandardError
80b57da926
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
70164eec0f [rubygems/rubygems] util/rubocop -A --only Style/RescueModifier
b490379eab
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
fef0313ec7 [rubygems/rubygems] util/rubocop -A --only Style/PreferredHashMethods
ae3bdc0e85
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
38664ede7e [rubygems/rubygems] util/rubocop -A --only Style/NonNilCheck
2b056b25c3
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
4cd8a46f45 [rubygems/rubygems] util/rubocop -A --only Style/ParenthesesAroundCondition
c766a65885
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
7b8a24ad08 [rubygems/rubygems] util/rubocop -A --only Style/EmptyCaseCondition
dae8fc70a4
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
3fe5909ef1 [rubygems/rubygems] util/rubocop -A --only Style/SelfAssignment
7c1168c623
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
f86296fa0a [rubygems/rubygems] util/rubocop -A --only Style/EmptyElse
04227104ac
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
4ab23df2c4 [rubygems/rubygems] util/rubocop -A --only Style/RedundantParentheses
295691d4dc
2023-03-17 18:50:55 +09:00
Hiroshi SHIBATA
b8914a9d5d [rubygems/rubygems] util/rubocop -A --only Style/StabbyLambdaParentheses
23ce9793e5
2023-03-17 18:50:55 +09:00