diff options
-rw-r--r-- | variable.c | 38 |
1 files changed, 33 insertions, 5 deletions
@@ -1302,25 +1302,53 @@ VALUE rb_obj_field_get(VALUE obj, rb_shape_t *target_shape) { RUBY_ASSERT(!SPECIAL_CONST_P(obj)); - RUBY_ASSERT(!rb_shape_obj_too_complex_p(obj)); RUBY_ASSERT(target_shape->type == SHAPE_IVAR || target_shape->type == SHAPE_OBJ_ID); - attr_index_t attr_index = target_shape->next_field_index - 1; switch (BUILTIN_TYPE(obj)) { case T_CLASS: case T_MODULE: ASSERT_vm_locking(); - return RCLASS_FIELDS(obj)[attr_index]; case T_OBJECT: - return ROBJECT_FIELDS(obj)[attr_index]; default: RUBY_ASSERT(FL_TEST_RAW(obj, FL_EXIVAR)); struct gen_fields_tbl *fields_tbl = NULL; rb_ivar_generic_fields_tbl_lookup(obj, &fields_tbl); RUBY_ASSERT(fields_tbl); - return fields_tbl->as.shape.fields[attr_index]; } } VALUE |