Skip to content

Commit 6b2b379

Browse files
committed
vm_getivar: unify codepaths
1 parent 6592e58 commit 6b2b379

1 file changed

Lines changed: 16 additions & 43 deletions

File tree

vm_insnhelper.c

Lines changed: 16 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,19 +1223,13 @@ vm_getivar(VALUE obj, ID id, const rb_iseq_t *iseq, IVC ic, const struct rb_call
12231223
{
12241224
VALUE fields_obj;
12251225
#if OPT_IC_FOR_IVAR
1226-
VALUE val = Qundef;
1227-
VALUE *ivar_list;
1228-
12291226
if (SPECIAL_CONST_P(obj)) {
12301227
return default_value;
12311228
}
12321229

1233-
shape_id_t shape_id = RBASIC_SHAPE_ID_FOR_READ(obj);
1234-
12351230
switch (BUILTIN_TYPE(obj)) {
12361231
case T_OBJECT:
1237-
ivar_list = ROBJECT_FIELDS(obj);
1238-
VM_ASSERT(rb_ractor_shareable_p(obj) ? rb_ractor_shareable_p(val) : true);
1232+
fields_obj = obj;
12391233
break;
12401234
case T_CLASS:
12411235
case T_MODULE:
@@ -1257,27 +1251,21 @@ vm_getivar(VALUE obj, ID id, const rb_iseq_t *iseq, IVC ic, const struct rb_call
12571251
}
12581252

12591253
fields_obj = RCLASS_WRITABLE_FIELDS_OBJ(obj);
1260-
if (!fields_obj) {
1261-
return default_value;
1262-
}
1263-
ivar_list = rb_imemo_fields_ptr(fields_obj);
1264-
shape_id = RBASIC_SHAPE_ID_FOR_READ(fields_obj);
1265-
12661254
break;
12671255
}
12681256
default:
1269-
if (rb_obj_exivar_p(obj)) {
1270-
VALUE fields_obj = rb_obj_fields(obj, id);
1271-
if (!fields_obj) {
1272-
return default_value;
1273-
}
1274-
ivar_list = rb_imemo_fields_ptr(fields_obj);
1275-
}
1276-
else {
1277-
return default_value;
1278-
}
1257+
fields_obj = rb_obj_fields(obj, id);
1258+
}
1259+
1260+
if (!fields_obj) {
1261+
return default_value;
12791262
}
12801263

1264+
VALUE val = Qundef;
1265+
1266+
shape_id_t shape_id = RBASIC_SHAPE_ID_FOR_READ(fields_obj);
1267+
VALUE *ivar_list = rb_imemo_fields_ptr(fields_obj);
1268+
12811269
shape_id_t cached_id;
12821270
attr_index_t index;
12831271

@@ -1330,26 +1318,13 @@ vm_getivar(VALUE obj, ID id, const rb_iseq_t *iseq, IVC ic, const struct rb_call
13301318
}
13311319
#endif
13321320

1333-
if (rb_shape_too_complex_p(shape_id)) {
1334-
st_table *table = NULL;
1335-
switch (BUILTIN_TYPE(obj)) {
1336-
case T_CLASS:
1337-
case T_MODULE:
1338-
table = rb_imemo_fields_complex_tbl(fields_obj);
1339-
break;
1321+
if (UNLIKELY(rb_shape_too_complex_p(shape_id))) {
1322+
st_table *table = (st_table *)ivar_list;
13401323

1341-
case T_OBJECT:
1342-
table = ROBJECT_FIELDS_HASH(obj);
1343-
break;
1324+
RUBY_ASSERT(table);
1325+
RUBY_ASSERT(table == rb_imemo_fields_complex_tbl(fields_obj));
13441326

1345-
default: {
1346-
VALUE fields_obj = rb_obj_fields(obj, id);
1347-
table = rb_imemo_fields_complex_tbl(fields_obj);
1348-
break;
1349-
}
1350-
}
1351-
1352-
if (!table || !st_lookup(table, id, &val)) {
1327+
if (!st_lookup(table, id, &val)) {
13531328
val = default_value;
13541329
}
13551330
}
@@ -1382,14 +1357,12 @@ vm_getivar(VALUE obj, ID id, const rb_iseq_t *iseq, IVC ic, const struct rb_call
13821357
val = default_value;
13831358
}
13841359
}
1385-
13861360
}
13871361

13881362
if (!UNDEF_P(default_value)) {
13891363
RUBY_ASSERT(!UNDEF_P(val));
13901364
}
13911365

1392-
RB_GC_GUARD(fields_obj);
13931366
return val;
13941367

13951368
general_path:

0 commit comments

Comments
 (0)