diff options
| author | Jean Boussier <jean.boussier@gmail.com> | 2025-08-28 23:23:38 +0200 |
|---|---|---|
| committer | Jean Boussier <jean.boussier@gmail.com> | 2025-08-29 00:02:29 +0200 |
| commit | 4992d2c2980d150cdbfc9750f124c3a9ccc71945 (patch) | |
| tree | 21a054987ba7095fee4340b0f57a9c3f8f86a983 /variable.c | |
| parent | 3646596e5bd4c445b158be5fd3780e7685aa9b7f (diff) | |
YJIT: rb_ivar_get_at skip ractor checks
Using `assume_single_ractor_mode` we can skip all ractor safety
checks if we're in single ractor mode.
```
compare-ruby: ruby 3.5.0dev (2025-08-27T14:58:58Z merge-vm-setivar-d.. 5b749d8e53) +YJIT +PRISM [arm64-darwin24]
built-ruby: ruby 3.5.0dev (2025-08-28T21:23:38Z yjit-get-exivar 3cc21b76d4) +YJIT +PRISM [arm64-darwin24]
| |compare-ruby|built-ruby|
|:--------------------------|-----------:|---------:|
|vm_ivar_get_on_obj | 975.981| 975.772|
| | 1.00x| -|
|vm_ivar_get_on_class | 136.214| 470.912|
| | -| 3.46x|
|vm_ivar_get_on_generic | 148.315| 299.122|
| | -| 2.02x|
```
Diffstat (limited to 'variable.c')
| -rw-r--r-- | variable.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/variable.c b/variable.c index 0a5ec60c25..cccb09e329 100644 --- a/variable.c +++ b/variable.c @@ -1494,6 +1494,26 @@ rb_ivar_get_at(VALUE obj, attr_index_t index, ID id) } VALUE +rb_ivar_get_at_no_ractor_check(VALUE obj, attr_index_t index) +{ + // Used by JITs, but never for T_OBJECT. + + VALUE fields_obj; + switch (BUILTIN_TYPE(obj)) { + case T_OBJECT: + UNREACHABLE_RETURN(Qundef); + case T_CLASS: + case T_MODULE: + fields_obj = RCLASS_WRITABLE_FIELDS_OBJ(obj); + break; + default: + fields_obj = rb_obj_fields_no_ractor_check(obj); + break; + } + return rb_imemo_fields_ptr(fields_obj)[index]; +} + +VALUE rb_attr_get(VALUE obj, ID id) { return rb_ivar_lookup(obj, id, Qnil); |
