diff --git a/variable.c b/variable.c index bef25c147f..b87cdd7986 100644 --- a/variable.c +++ b/variable.c @@ -2125,12 +2125,11 @@ rb_obj_field_set(VALUE obj, shape_id_t target_shape_id, VALUE val) } } -VALUE -rb_ivar_defined(VALUE obj, ID id) +static VALUE +ivar_defined0(VALUE obj, ID id) { attr_index_t index; - if (SPECIAL_CONST_P(obj)) return Qfalse; if (rb_shape_obj_too_complex_p(obj)) { VALUE idx; st_table *table = NULL; @@ -2164,6 +2163,26 @@ rb_ivar_defined(VALUE obj, ID id) } } +VALUE +rb_ivar_defined(VALUE obj, ID id) +{ + if (SPECIAL_CONST_P(obj)) return Qfalse; + + VALUE defined; + switch (BUILTIN_TYPE(obj)) { + case T_CLASS: + case T_MODULE: + RB_VM_LOCKING() { + defined = ivar_defined0(obj, id); + } + break; + default: + defined = ivar_defined0(obj, id); + break; + } + return defined; +} + struct iv_itr_data { VALUE obj; struct gen_fields_tbl *fields_tbl;