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

711 Коммитов

Автор SHA1 Сообщение Дата
Jean Boussier 7380e3d30f RB_OBJ_FREEZE_RAW: Set the object shape 2024-04-16 17:20:35 +02:00
Xavier Noria 077ac25ed8 Iterate the documentation of Module.const_missing 2024-03-15 22:21:43 +09:00
Xavier Noria 9284fe123e Remove unnecessary else branch
This matches the existing style in the rest of the file.
2024-03-15 22:21:43 +09:00
Xavier Noria a26e3bf360 Minor edits to variable.c 2024-03-15 22:21:43 +09:00
Xavier Noria 0dbe3af417 Fix the signature of Module#name in the API docs 2024-03-15 22:21:43 +09:00
Peter Zhu 6b0434c0f7 Don't create per size pool shapes for non-T_OBJECT 2024-03-13 09:55:52 -04:00
Jean Boussier a5c5f83b24 Make `const_source_location` return the real constant as soon as defined
[Bug #20188]

Ref: https://github.com/fxn/zeitwerk/issues/281#issuecomment-1893228355

Previously, it would only return the real constant location once the
autoload was fully completed.
2024-03-13 09:39:09 +01:00
Jean Boussier d4f3dcf4df Refactor VM root modules
This `st_table` is used to both mark and pin classes
defined from the C API. But `vm->mark_object_ary` already
does both much more efficiently.

Currently a Ruby process starts with 252 rooted classes,
which uses `7224B` in an `st_table` or `2016B` in an `RArray`.

So a baseline of 5kB saved, but since `mark_object_ary` is
preallocated with `1024` slots but only use `405` of them,
it's a net `7kB` save.

`vm->mark_object_ary` is also being refactored.

Prior to this changes, `mark_object_ary` was a regular `RArray`, but
since this allows for references to be moved, it was marked a second
time from `rb_vm_mark()` to pin these objects.

This has the detrimental effect of marking these references on every
minors even though it's a mostly append only list.

But using a custom TypedData we can save from having to mark
all the references on minor GC runs.

Addtionally, immediate values are now ignored and not appended
to `vm->mark_object_ary` as it's just wasted space.
2024-03-06 15:33:43 -05:00
Jean Boussier b4a69351ec Move FL_SINGLETON to FL_USER1
This frees FL_USER0 on both T_MODULE and T_CLASS.

Note: prior to this, FL_SINGLETON was never set on T_MODULE,
so checking for `FL_SINGLETON` without first checking that
`FL_TYPE` was `T_CLASS` was valid. That's no longer the case.
2024-03-06 13:11:41 -05:00
cui fliter 226a889dc7
[DOC] fix some comments
Signed-off-by: cui fliter <imcusg@gmail.com>
2024-03-05 18:50:47 +09:00
Peter Zhu df5b8ea4db Remove unneeded RUBY_FUNC_EXPORTED 2024-02-23 10:24:21 -05:00
Yusuke Endoh a7718c914a Do not show an anonymous class as a receiver 2024-02-15 20:43:11 +09:00
Yusuke Endoh 25d74b9527 Do not include a backtick in error messages and backtraces
[Feature #16495]
2024-02-15 18:42:31 +09:00
Nobuyoshi Nakada 361b3efe16
Use `UNDEF_P` 2024-01-30 14:48:59 +09:00
Peter Zhu d0b774cfb8 Remove null checks for xfree
xfree can handle null values, so we don't need to check it.
2024-01-19 10:25:02 -05:00
Peter Zhu 11286ac479 Fix memory leak in autoload_data
If the autoload_data has autoload_const and the autoload_data is freed
before the autoload_const, then the autoload_data will leak.

This commit changes it so that when the autoload_data is freed, it will
clear the whole linked list of autoload_const so that the autoload_data
can be safely freed.

    1000.times do |i|
      str = "foo#{i}".freeze

      autoload(:"B#{i}", str)
      autoload(:"C#{i}", str)
    end

Reports leaked memory with the macOS leaks tool:

    12  ruby                                  0x1006398a4 rb_f_autoload + 96  load.c:1524
    11  ruby                                  0x100639710 rb_mod_autoload + 112  load.c:1460
    10  ruby                                  0x10080a914 rb_autoload_str + 224  variable.c:2666
    9   ruby                                  0x1007c3308 rb_mutex_synchronize + 56  thread_sync.c:637
    8   ruby                                  0x1005acb24 rb_ensure + 312  eval.c:1009
    7   ruby                                  0x10080aac8 autoload_synchronized + 204  variable.c:2630
    6   ruby                                  0x10080f8bc autoload_feature_lookup_or_create + 76  variable.c:2578
    5   ruby                                  0x1005c29a4 rb_data_typed_object_zalloc + 232  gc.c:3186
    4   ruby                                  0x1005c2774 ruby_xcalloc + 32  gc.c:14440
    3   ruby                                  0x1005cddf4 ruby_xcalloc_body + 56  gc.c:12878
    2   ruby                                  0x1005cde7c objspace_xcalloc + 124  gc.c:12871
    1   ruby                                  0x1005c1990 calloc1 + 28  gc.c:1906
    0   libsystem_malloc.dylib                0x18b2ebb78 _malloc_zone_calloc_instrumented_or_legacy + 100
2024-01-07 13:48:59 -05:00
Nobuyoshi Nakada c30b8ae947
Adjust styles and indents [ci skip] 2024-01-08 00:50:41 +09:00
Victor Shepelev 570d7b2c3e
[DOC] Adjust some new features wording/examples. (#9183)
* Reword Range#overlap? docs last paragraph.

* Docs: add explanation about Queue#freeze

* Docs: Add :rescue event docs for TracePoint

* Docs: Enhance Module#set_temporary_name documentation

* Docs: Slightly expand Process::Status deprecations

* Fix MatchData#named_captures rendering glitch

* Improve Dir.fchdir examples

* Adjust Refinement#target docs
2023-12-14 23:01:48 +02:00
Adam Hess 6816e8efcf Free everything at shutdown
when the RUBY_FREE_ON_SHUTDOWN environment variable is set, manually free memory at shutdown.

Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
Co-authored-by: Peter Zhu <peter@peterzhu.ca>
2023-12-07 15:52:35 -05:00
Samuel Williams 7e05e9ff94
Fix incorrect "nested_fake_name" documentation. (#9135) 2023-12-06 06:48:55 +00:00
Alan Wu 0346cbbc14 Fix parameter types for rb_ivar_foreach() callbacks
For this public API, the callback is declared to take
`(ID, VALUE, st_data_t)`, but it so happens that using
`(st_data_t, st_data_t, st_data_t)` also
type checks, because the underlying type is identical.
Use it as declared and get rid of some casts.
2023-12-05 18:19:42 -05:00
Peter Zhu f40727f4aa Make rb_obj_copy_ivs_to_hash_table_i static 2023-12-04 09:58:41 -05:00
Peter Zhu 43dc8e9012 Fix indentation in ivar_set [ci skip] 2023-11-28 08:12:35 -05:00
Peter Zhu 269c705f93 Fix compaction for generic ivars
When generic instance variable has a shape, it is marked movable. If it
it transitions to too complex, it needs to update references otherwise
it may have incorrect references.
2023-11-24 13:29:04 -05:00
Peter Zhu 7f7613c2c7 Fix compacting during evacuation of generic ivars
When evacuating generic instance variables, the instance variables exist
in both the array and the ST table. We need to ensure it has switched
to the ST table before performing any operations that can trigger GC
compaction.
2023-11-23 09:11:24 -05:00
Aaron Patterson 209a0253f5 Use count macros for counting instance variables
We don't need to check for Qundef because the shape tells us the number
if IVs that are stored on the object
2023-11-21 09:46:50 -08:00
Peter Zhu 7e7e2dde24 Fix memory leak when evacuating generic ivars
The lookup in the table is using the wrong key when converting generic
instance variables to too complex, which means that it never looks up
the entry which leaks memory when the entry is overwritten.
2023-11-21 10:27:02 -05:00
Aaron Patterson 6fce8c7980 Don't try compacting ivars on Classes that are "too complex"
Too complex classes use a hash table to store ivs, and should always pin
their IVs.  We shouldn't touch those classes in compaction.
2023-11-20 16:09:48 -08:00
Peter Zhu f376163194 Fix crash when evacuating generic ivar
When transitioning generic instance variable objects to too complex, we
set the shape first before performing inserting the new gen_ivtbl. The
st_insert for the new gen_ivtbl could allocate and cause a GC. If that
happens, then it will crash because the object will have a too complex
shape but not yet be backed by a st_table.

This commit changes the order so that the insert happens first before
the new shape is set.

The following script reproduces the issue:

```
o = []
o.instance_variable_set(:@a, 1)

i = 0
o = Object.new
while RubyVM::Shape.shapes_available > 0
  o.instance_variable_set(:"@i#{i}", 1)
  i += 1
end

ary = 1_000.times.map { [] }

GC.stress = true
ary.each do |o|
  o.instance_variable_set(:@a, 1)
  o.instance_variable_set(:@b, 1)
end
```
2023-11-20 16:57:24 -05:00
Peter Zhu 9d51ab8b3d Fix indentation [ci skip] 2023-11-20 13:43:31 -05:00
Peter Zhu 83da4a7e62 Fix crash when iterating over generic ivars 2023-11-20 10:13:18 -05:00
Jean Boussier 94c9f16663 Refactor rb_obj_evacuate_ivs_to_hash_table
That function is a bit too low level to called from multiple
places. It's always used in tandem with `rb_shape_set_too_complex`
and both have to know how the object is laid out to update the
`iv_ptr`.

So instead we can provide two higher level function:

  - `rb_obj_copy_ivs_to_hash_table` to prepare a `st_table` from an
    arbitrary oject.
  - `rb_obj_convert_to_too_complex` to assign the new `st_table`
    to the old object, and safely free the old `iv_ptr`.

Unfortunately both can't be combined into one, because `rb_obj_copy_ivar`
need `rb_obj_copy_ivs_to_hash_table` to copy from one object
to another.
2023-11-17 09:19:21 +01:00
Jean Boussier 81b35fe729 rb_evict_ivars_to_hash: get rid of the sahpe paramater
It's only used to allocate the table with the right size,
but in some case we were passing `rb_shape_get_shape_by_id(SHAPE_OBJ_TOO_COMPLEX)`
which `next_iv_index` is a bit undefined.

So overall we're better to just allocate a table the size of the existing
object, it should be close enough in the vast majority of cases,
and that's already a de-optimizaton path anyway.
2023-11-16 17:49:59 +01:00
Peter Zhu 68869e9bd9 Revert "Revert "Remove SHAPE_CAPACITY_CHANGE shapes""
This reverts commit 5f3fb4f4e3.
2023-11-13 18:26:36 -05:00
Peter Zhu 7e6609e8f0 [ci skip] Fix indentation in rb_class_ivar_set 2023-11-10 12:43:06 -05:00
Peter Zhu 5f3fb4f4e3 Revert "Remove SHAPE_CAPACITY_CHANGE shapes"
This reverts commit f6910a6112.

We're seeing crashes in the test suite of Shopify's core monolith after
this change.
2023-11-10 11:27:49 -05:00
Peter Zhu f6910a6112 Remove SHAPE_CAPACITY_CHANGE shapes
We don't need to create a shape to transition capacity as we can
transition the capacity when the capacity of the SHAPE_IVAR changes.
2023-11-09 09:25:02 -05:00
Jean Boussier d898e8d6f8 Refactor rb_shape_transition_shape_capa out
Right now the `rb_shape_get_next` shape caller need to
first check if there is capacity left, and if not call
`rb_shape_transition_shape_capa` before it can call `rb_shape_get_next`.

And on each of these it needs to checks if we got a TOO_COMPLEX
back.

All this logic is duplicated in the interpreter, YJIT and RJIT.

Instead we can have `rb_shape_get_next` do the capacity transition
when needed. The caller can compare the old and new shapes capacity
to know if resizing is needed. It also can check for TOO_COMPLEX
only once.
2023-11-08 11:02:55 +01:00
Peter Zhu dc911a332b Remove rb_complex_ivar_set 2023-11-06 11:10:41 -05:00
Peter Zhu e2ef957c23 Use general_ivar_set for generic ivars 2023-11-06 11:10:41 -05:00
Peter Zhu 18f675912e Use general_ivar_set for Class ivars 2023-11-06 11:10:41 -05:00
Peter Zhu 679e98dc27 Use general_ivar_set for Objects 2023-11-06 11:10:41 -05:00
Peter Zhu c747c67533 Implement general_ivar_set 2023-11-06 11:10:41 -05:00
Jean Boussier 4a6bdbd6dc generic_ivar_set: properly check for TOO_COMPLEX on capacity transition 2023-11-06 12:39:52 +01:00
Peter Zhu e010bf1674 Fix typo in variable.c 2023-11-03 11:04:25 -04:00
Peter Zhu 81882ca42f Use RB_OBJ_WRITE over RB_OBJ_WRITTEN in variable.c 2023-11-03 11:01:11 -04:00
Peter Zhu 1321df773b Use shape capacity transitions for generic ivars
This commit changes generic ivars to respect the capacity transition in
shapes rather than growing the capacity independently.
2023-11-03 10:15:32 -04:00
Jean Boussier 35da6f864a rb_ivar_defined: handle complex modules
It was assuming only objects can be complex.
2023-11-03 11:52:17 +01:00
Peter Zhu 4c3cc25ea2 Use shape capacity transition for class ivars
This commit changes class ivars to respect the capacity transition in
shapes rather than growing the capacity independently.
2023-11-02 13:42:11 -04:00
Peter Zhu 38ba040d8b Make every initial size pool shape a root shape
This commit makes every initial size pool shape a root shape and assigns
it a capacity of 0.
2023-11-02 13:42:11 -04:00