summaryrefslogtreecommitdiff
path: root/variable.c
diff options
context:
space:
mode:
-rw-r--r--variable.c38
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