summaryrefslogtreecommitdiff
path: root/variable.c
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2025-08-28 23:23:38 +0200
committerJean Boussier <jean.boussier@gmail.com>2025-08-29 00:02:29 +0200
commit4992d2c2980d150cdbfc9750f124c3a9ccc71945 (patch)
tree21a054987ba7095fee4340b0f57a9c3f8f86a983 /variable.c
parent3646596e5bd4c445b158be5fd3780e7685aa9b7f (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.c20
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);