summaryrefslogtreecommitdiff
path: root/variable.c
diff options
context:
space:
mode:
Diffstat (limited to 'variable.c')
-rw-r--r--variable.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/variable.c b/variable.c
index f80f1a56a6..0a5ec60c25 100644
--- a/variable.c
+++ b/variable.c
@@ -1464,6 +1464,36 @@ rb_ivar_get(VALUE obj, ID id)
}
VALUE
+rb_ivar_get_at(VALUE obj, attr_index_t index, ID id)
+{
+ RUBY_ASSERT(rb_is_instance_id(id));
+ // Used by JITs, but never for T_OBJECT.
+
+ switch (BUILTIN_TYPE(obj)) {
+ case T_OBJECT:
+ UNREACHABLE_RETURN(Qundef);
+ case T_CLASS:
+ case T_MODULE:
+ {
+ VALUE fields_obj = RCLASS_WRITABLE_FIELDS_OBJ(obj);
+ VALUE val = rb_imemo_fields_ptr(fields_obj)[index];
+
+ if (UNLIKELY(!rb_ractor_main_p()) && !rb_ractor_shareable_p(val)) {
+ rb_raise(rb_eRactorIsolationError,
+ "can not get unshareable values from instance variables of classes/modules from non-main Ractors");
+ }
+
+ return val;
+ }
+ default:
+ {
+ VALUE fields_obj = rb_obj_fields(obj, id);
+ return rb_imemo_fields_ptr(fields_obj)[index];
+ }
+ }
+}
+
+VALUE
rb_attr_get(VALUE obj, ID id)
{
return rb_ivar_lookup(obj, id, Qnil);