@@ -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
13951368general_path :
0 commit comments