1308 Commits

Author SHA1 Message Date
Nobuyoshi Nakada
be696c9c24
[Bug #22092] Improve Array#sum when the initial value is a Float 2026-06-03 11:38:38 +09:00
Alan Wu
ad14452e3b [DOC] Description and soundness reasoning for Primitive.rb_jit_ary_* 2026-06-01 17:59:13 -04:00
Aaron Patterson
c4d09f416c
Reapply "Reserve 2 bits for expressing object layout (#17139)" (#17158)
This reverts commit ddb5055d961d970aded287cfebd07b78efee3ca7.
2026-06-01 19:30:58 +00:00
Aaron Patterson
ddb5055d96
Revert "Reserve 2 bits for expressing object layout (#17139)"
This reverts commit 63d9f090b5d9461cf0b9446e0039d9c56156b826.
2026-05-29 16:41:31 -07:00
Aaron Patterson
63d9f090b5
Reserve 2 bits for expressing object layout (#17139)
* Reserve 2 bits for expressing object layout

We would like to make instance variable reads in the JIT compiler faster
(as well as simplify the JIT implementation).  Currently, in order to
read an instance variable, we have to:

1. Test for heap object
2. Load object to a 64 bit register
3. Mask the object header
4. Bit test against the masked header
5. JNE
6. Load field

We would like to:

1. Test for heap object
2. Load object shape to a 32 bit register
3. Bit test against the shape
4. JNE
5. Load field

The way we fetch instance variables is not consistent across objects.
In order to realize our goal, we need to encode object layout inside the
shape.  If we encode object layout inside the shape, then the shape
itself will guarantee that the access pattern generated by the JIT
compiler is correct.

We should encode the following load patterns into the shape tag bits.
This way we can share shapes on transitions, but be able to
differentiate the access patterns for the JIT compiler.  In other words,
two objects can have an `@a -> @b -> @c` transition and share the same
shape, but the tag bits can differentiate the access pattern so that the
JIT compiler can be confident that the machine code is correct.

Here are the patterns:

1. Embedded/Extended T_OBJECT Instance Variables

Objects with direct references to instance variables or via malloc
buffer

2. Objects with fields_objects fields

These are Data and TypedData objects.  They have an associated axillary
imemo/fields object that stores the instance variables.  The access
pattern is `object[2] + 2`.  The fields object is the 3rd field, and the
instance variables start at +2 inside the fields object.  The fields
object itself is a Ruby object, so it contains the usual header bits +
class headers.

3. Non Boxable Classes / Modules

This is similar to Objects with fields_objects, but the fields object is
stored at a different offset.  We’re differentiating this from boxable
classes and modules because those are harder to support.

4. Other

"Other" pattern is for objects that are rare, or have
difficult-to-implement access patterns.  This includes:

* Boxable classes and modules
* Structs (for now)
* Objects that use the geniv table

Proposed shape bit layout:

```
  Current shape_id_t is 32 bits:
  31        28 27 26 25 24 23 22        19 18                         0
  +-----------+--+--+--+--+--+------------+----------------------------+
  | unused    |L1|L0|OI|FR|CX| heap index | shape tree offset          |
  +-----------+--+--+--+--+--+------------+----------------------------+
               |  |  |  |  |  |            |
               |  |  |  |  |  |            +-- bits 0-18: SHAPE_ID_OFFSET_MASK
               |  |  |  |  |  +--------------- bits 19-22: SHAPE_ID_HEAP_INDEX_MASK
               |  |  |  |  +------------------ bit 23: SHAPE_ID_FL_COMPLEX
               |  |  |  +--------------------- bit 24: SHAPE_ID_FL_FROZEN
               |  |  +------------------------ bit 25: SHAPE_ID_FL_HAS_OBJECT_ID
               +--+--------------------------- bits 26-27: SHAPE_ID_LAYOUT_MASK
```

The important part about these layout patterns is that they do not
reflect the _type_ of object, only how the object is laid out in memory.
For example, we currently treat structs as "other", but we can refactor
them to have the same layout as "Objects with fields_objects", and when
we do that they should get a different bit in the shape header.

This commit only reserves the two bits, it doesn't use them in the JIT
compiler yet.

Co-Authored-By: John Hawthorn <john@hawthorn.email>
Co-Authored-By: Max Bernstein <tekknolagi@gmail.com>

* Update gc.c

Co-authored-by: Nobuyoshi Nakada <nobu.nakada@gmail.com>

* Update shape.h

Co-authored-by: Jean Boussier <jean.boussier@gmail.com>

* fix function name

* Update shape.c

Co-authored-by: Jean Boussier <jean.boussier@gmail.com>

* fix function name

* Revert "Update shape.c"

This reverts commit 900711defc6c541a93f3393a350819ae88cf87f1.

* add comment

---------

Co-authored-by: John Hawthorn <john@hawthorn.email>
Co-authored-by: Max Bernstein <tekknolagi@gmail.com>
Co-authored-by: Nobuyoshi Nakada <nobu.nakada@gmail.com>
Co-authored-by: Jean Boussier <jean.boussier@gmail.com>
2026-05-29 15:09:34 -07:00
Jean Boussier
2432ed8904 Further simplify common use case of NEWOBJ_OF
Only few objects need to pass the starting shape.
2026-04-28 11:11:29 +09:00
Jean Boussier
e4667e5109 Refactor NEWOB_OF for the common protected use case
Almost every objects are now WB protected, with just a few
exceptions, hence we can provide a much simpler interface.

It's also much easier to find the remaining unprotected objects.
2026-04-28 11:11:29 +09:00
Jean Boussier
c202bc08e1 Simplify NEWOBJ_OF and introduce EC_NEWOBJ_OF
We only very rarely have the execution context available, so
it's preferable to provide a simpler default macro.
2026-04-28 11:11:29 +09:00
Jean Boussier
e603aa0d2f Get rid of RGENGC_WB_PROTECTED_ARRAY
It has been the default for a very long time and there is no good reason to
disable it.
2026-04-28 09:39:07 +09:00
Jean Boussier
97c070c244 [DOC] Clarify array methods using eql?
[Bug #22013]

Up to a certain size, only `eql?` is used, but for larger arrays
a Hash is used an `#hash` becomes necessary.

We could consider always checking `#hash` for consistency, but
that would decrease performance.

At the very least we can clarify the documentation.
2026-04-25 12:59:05 +09:00
Jean Boussier
53099633e2 Make ruby_xfree_sized and ruby_xrealloc_sized public
[Feature #21861]
2026-04-01 08:10:07 +01:00
Nobuyoshi Nakada
b6e6ccc6c2
Make Data#initialize reject Integer keys 2026-03-24 14:39:14 +09:00
Peter Zhu
752c88bab3 [DOC] Fix hash style for Array#flatten 2026-02-09 21:21:34 -05:00
Peter Zhu
a4b28f14cc [DOC] Fix hash style for Array#flatten! 2026-02-09 21:21:34 -05:00
Max Bernstein
f96d106d3a Don't use cexpr 2026-02-09 19:28:04 -05:00
Max Bernstein
11c845efec ZJIT: Inline Primitives for Array#each 2026-02-09 19:28:04 -05:00
Max Bernstein
f96f84837d Replace ary_fetch_next with separate array iteration primitives 2026-02-09 19:28:04 -05:00
Peter Zhu
10b6d543f9 [DOC] Fix hash style in Array#to_h 2026-02-04 19:55:23 -05:00
Jean Boussier
91619f0230 gc.c: Verify provided size in rb_gc_impl_free
For now the provided size is just for GC statistics, but in the future
we may want to forward it to C23's `free_sized` and passing an incorrect
size to it is undefined behavior.
2026-01-29 23:32:04 +01:00
BurdetteLamar
21f8472e77 [DOC] Fix links in Array 2026-01-26 17:05:18 -05:00
Burdette Lamar
5230f835e8
[DOC] Harmonize #[] methods 2026-01-07 18:01:56 -05:00
Victor Shepelev
ec4ca91319
Small documentation adjustments for new/updated features (#15634)
* Document Range#to_set

* Update Thread#raise and Fiber#raise signatures and docs

* Add reference to String#strip to character_selectors.rdoc

* Update *nil docs when calling methods

* Enhance Array#find and #rfind docs

* Add a notice to Kernel#raise about cause:
2025-12-20 13:07:38 +02:00
Étienne Barrié
769c6a1c54 [DOC] Use Arrays in examples for Array#find 2025-12-17 21:22:39 -08:00
Étienne Barrié
bb0e42c5e7 Define Array#detect as an alias for Array#find
Otherwise Array#detect is Enumerable#detect while Array#find uses a
different more performant implementation.

[Feature #21678]
2025-12-15 10:52:43 -05:00
Kevin Newton
6147b69587 Array#rfind
Implement Array#rfind, which is the same as find except from the
other side of the Array. Also implemented Array#find (as opposed to
the generic one on Enumerable because it is significantly faster
and to keep the implementations together.

[Feature #21678]
2025-12-12 13:35:30 -05:00
Luke Gruber
a211abbcbd
Cache array length in rb_ary_join (#15362)
When all elements are strings, we never have to recalculate the length
of the array because there are no conversion methods that are called, so
the length will never change. This speeds up the fast path by ~10%.

```ruby
a = ["1"*10, "2"*10, "3"*10, "4"*10, "5"*10] * 10
10_000_000.times do
  a.join
end
```

```
hyperfine --warmup 1 'ruby ../ruby2/test.rb' './exe/ruby ../ruby2/test.rb'
Benchmark 1: ruby ../ruby2/test.rb
  Time (mean ± σ):      3.779 s ±  0.053 s    [User: 3.754 s, System: 0.017 s]
  Range (min … max):    3.715 s …  3.874 s    10 runs

Benchmark 2: ./exe/ruby ../ruby2/test.rb
  Time (mean ± σ):      3.411 s ±  0.038 s    [User: 3.387 s, System: 0.017 s]
  Range (min … max):    3.360 s …  3.472 s    10 runs

Summary
  ./exe/ruby ../ruby2/test.rb ran
    1.11 ± 0.02 times faster than ruby ../ruby2/test.rb
```
2025-12-02 17:35:53 -05:00
Nobuyoshi Nakada
f92ff9a86b
Remove an excess semicolon in a macro 2025-12-01 07:15:36 +09:00
Stan Lo
4cd6661e18
Reorganize page documentations (#15154)
Re-organize page docs
2025-11-27 20:12:24 +00:00
Peter Zhu
2380f69f68 Fix array allocation when slot size < 40 bytes
We need to allocate at least sizeof(struct RArray) when the array is
embedded on garbage collectors that support slot sizes less than 40 bytes.
2025-11-02 09:17:17 -05:00
Koichi Sasada
bc00c4468e use SET_SHAREABLE
to adopt strict shareable rule.

* (basically) shareable objects only refer shareable objects
* (exception) shareable objects can refere unshareable objects
  but should not leak reference to unshareable objects to Ruby world
2025-10-23 13:08:26 +09:00
Ricardo Trindade
42ba82424d Fix typo in comment in array#zip docs
Duplicate the was found in the documentation
2025-10-07 18:54:34 -04:00
Peter Zhu
2d57e9e2a1 Clear out memory for newly allocated array 2025-09-17 09:25:17 -04:00
Peter Zhu
5a946a5be2 Change order of RARRAY_AREF and ARY_SET_LEN in rb_ary_pop
We should access the last element first before we shrink the length of the
array.
2025-09-11 08:14:25 -04:00
Ethan
60ca525fce [DOC] Array#map! fix to indicate return is self 2025-08-09 11:10:51 +09:00
Ethan
4209ebb1e4 [DOC] Array#fill fix to indicate return is self
doc currently indicates the return value as `new_array` but then in the first sentence explains "always returns +self+ (never a new array)".
2025-08-09 11:10:51 +09:00
Jean Boussier
45a2c95d0f Reduce exposure of FL_FREEZE
The `FL_FREEZE` flag is redundant with `SHAPE_ID_FL_FROZEN`, so
ideally it should be eliminated in favor of the later.

Doing so would eliminate the risk of desync between the two, but
also solve the problem of the frozen status being global in namespace
context (See Bug #21330).
2025-06-24 11:29:39 +01:00
Zopolis4
915d027738 Fix typo (newsString -> new String) 2025-05-11 07:07:10 +09:00
Nobuyoshi Nakada
ce8f7da49e
[Bug #21304] Reload length and pointer after #hash method
The receiver can be modified during the method calls.
2025-05-04 12:40:33 +00:00
Yusuke Endoh
f3246ccebb Fix an ASAN error in Array#difference
[Bug #21303]
2025-05-04 02:20:42 +09:00
Samuel Williams
c13ac4d615 Assert the GVL is held when performing various rb_ functions.
[Feature #20877]
2025-04-14 18:28:09 +09:00
Nobuyoshi Nakada
d31c15d81f
[DOC] Reference to the idiom from Array#sort 2025-02-27 13:07:43 +09:00
Jean Boussier
9826047f01 Array#sort_by! return early if sorting is useless
`Array#sort!` does that check, but `#sort_by!` always tries to
sort, which is wasteful.
2025-02-13 11:38:02 +01:00
Peter Zhu
e603a420e9 [DOC] Fix call-seq consistency in Array
The documentation guide (https://docs.ruby-lang.org/en/master/contributing/documentation_guide_md.html#label-Calling+Sequence+-28for+methods+written+in+C-29)
says that the call-seq for instance methods should only include the method
name, no prepending `array.`.
2025-02-10 16:30:04 -05:00
Nobuyoshi Nakada
8dd0d63550
[Bug #21106] Remove the useless last iteration
When only one element remains, this simply swaps the first identical
element and has no actual effect.
2025-02-02 19:34:52 +09:00
BurdetteLamar
f349104259 [DOC] Tweaks for Array doc 2025-01-03 11:42:53 -05:00
Nobuyoshi Nakada
e433e6515e
[DOC] Exclude 'Class' and 'Module' from RDoc's autolinking 2025-01-02 12:36:06 +09:00
Nobuyoshi Nakada
b4ec22fe6c
[DOC] Exclude 'Method' from RDoc's autolinking 2025-01-02 12:23:49 +09:00
tomoya ishida
477c505ac0
[DOC] Fix output examples containing old Hash#inspect format
The inspect format was intentionally changed as an outcome of
[Bug #20433] [ruby-core:118668], but some documentation update
was missing, as [Bug #20962] pointed out. Update some output
examples that clearly use Hash#inspect.
2024-12-18 12:08:15 -05:00
Kouhei Yanagita
25602421fb [DOC] Fix the block parameter name in Array#zip 2024-12-18 11:00:36 +09:00
Burdette Lamar
50a67820fb
[DOC] Change arg names from n to count (#12288) 2024-12-17 10:55:43 -05:00