@@ -1302,25 +1302,53 @@ VALUE
1302
1302
rb_obj_field_get (VALUE obj , rb_shape_t * target_shape )
1303
1303
{
1304
1304
RUBY_ASSERT (!SPECIAL_CONST_P (obj ));
1305
- RUBY_ASSERT (!rb_shape_obj_too_complex_p (obj ));
1306
1305
RUBY_ASSERT (target_shape -> type == SHAPE_IVAR || target_shape -> type == SHAPE_OBJ_ID );
1307
1306
1308
- attr_index_t attr_index = target_shape -> next_field_index - 1 ;
1307
+ if (rb_shape_too_complex_p (target_shape )) {
1308
+ st_table * fields_hash ;
1309
+ switch (BUILTIN_TYPE (obj )) {
1310
+ case T_CLASS :
1311
+ case T_MODULE :
1312
+ ASSERT_vm_locking ();
1313
+ fields_hash = RCLASS_FIELDS_HASH (obj );
1314
+ break ;
1315
+ case T_OBJECT :
1316
+ fields_hash = ROBJECT_FIELDS_HASH (obj );
1317
+ break ;
1318
+ default :
1319
+ RUBY_ASSERT (FL_TEST_RAW (obj , FL_EXIVAR ));
1320
+ struct gen_fields_tbl * fields_tbl = NULL ;
1321
+ rb_ivar_generic_fields_tbl_lookup (obj , & fields_tbl );
1322
+ RUBY_ASSERT (fields_tbl );
1323
+ fields_hash = fields_tbl -> as .complex .table ;
1324
+ break ;
1325
+ }
1326
+ VALUE value = Qundef ;
1327
+ st_lookup (fields_hash , target_shape -> edge_name , & value );
1328
+ RUBY_ASSERT (!UNDEF_P (value ));
1329
+ return value ;
1330
+ }
1309
1331
1332
+ attr_index_t attr_index = target_shape -> next_field_index - 1 ;
1333
+ VALUE * fields ;
1310
1334
switch (BUILTIN_TYPE (obj )) {
1311
1335
case T_CLASS :
1312
1336
case T_MODULE :
1313
1337
ASSERT_vm_locking ();
1314
- return RCLASS_FIELDS (obj )[attr_index ];
1338
+ fields = RCLASS_FIELDS (obj );
1339
+ break ;
1315
1340
case T_OBJECT :
1316
- return ROBJECT_FIELDS (obj )[attr_index ];
1341
+ fields = ROBJECT_FIELDS (obj );
1342
+ break ;
1317
1343
default :
1318
1344
RUBY_ASSERT (FL_TEST_RAW (obj , FL_EXIVAR ));
1319
1345
struct gen_fields_tbl * fields_tbl = NULL ;
1320
1346
rb_ivar_generic_fields_tbl_lookup (obj , & fields_tbl );
1321
1347
RUBY_ASSERT (fields_tbl );
1322
- return fields_tbl -> as .shape .fields [attr_index ];
1348
+ fields = fields_tbl -> as .shape .fields ;
1349
+ break ;
1323
1350
}
1351
+ return fields [attr_index ];
1324
1352
}
1325
1353
1326
1354
VALUE
0 commit comments