@@ -1234,17 +1234,35 @@ rb_obj_fields_no_ractor_check(VALUE obj)
12341234}
12351235
12361236void
1237- rb_obj_set_fields (VALUE obj , VALUE fields_obj , ID field_name , VALUE original_fields_obj )
1237+ rb_free_generic_ivar (VALUE obj )
12381238{
1239- RUBY_ASSERT (IMEMO_TYPE_P (fields_obj , imemo_fields ));
1239+ if (rb_obj_exivar_p (obj )) {
1240+ st_data_t key = (st_data_t )obj , value ;
12401241
1241- if (fields_obj != original_fields_obj ) {
12421242 RB_VM_LOCKING () {
1243- st_table * tbl = generic_fields_tbl (obj , field_name , false);
1244- st_insert (tbl , (st_data_t )obj , (st_data_t )fields_obj );
1243+ st_delete (generic_fields_tbl_no_ractor_check (obj ), & key , & value );
12451244 }
1245+ }
1246+ }
1247+
1248+ void
1249+ rb_obj_set_fields (VALUE obj , VALUE fields_obj , ID field_name , VALUE original_fields_obj )
1250+ {
1251+ RUBY_ASSERT (!fields_obj || IMEMO_TYPE_P (fields_obj , imemo_fields ));
1252+ RUBY_ASSERT (!original_fields_obj || IMEMO_TYPE_P (original_fields_obj , imemo_fields ));
1253+
1254+ if (fields_obj != original_fields_obj ) {
1255+ if (fields_obj ) {
1256+ RB_VM_LOCKING () {
1257+ st_table * tbl = generic_fields_tbl (obj , field_name , false);
1258+ st_insert (tbl , (st_data_t )obj , (st_data_t )fields_obj );
1259+ }
12461260
1247- RB_OBJ_WRITTEN (obj , original_fields_obj , fields_obj );
1261+ RB_OBJ_WRITTEN (obj , original_fields_obj , fields_obj );
1262+ }
1263+ else {
1264+ rb_free_generic_ivar (obj );
1265+ }
12481266
12491267 if (original_fields_obj ) {
12501268 // Clear root shape to avoid triggering cleanup such as free_object_id.
@@ -1257,23 +1275,11 @@ void
12571275rb_obj_replace_fields (VALUE obj , VALUE fields_obj , ID field_name )
12581276{
12591277 RB_VM_LOCKING () {
1260- VALUE original_fields_obj = rb_obj_fields (fields_obj , field_name );
1278+ VALUE original_fields_obj = rb_obj_fields (obj , field_name );
12611279 rb_obj_set_fields (obj , fields_obj , field_name , original_fields_obj );
12621280 }
12631281}
12641282
1265- void
1266- rb_free_generic_ivar (VALUE obj )
1267- {
1268- if (rb_obj_exivar_p (obj )) {
1269- st_data_t key = (st_data_t )obj , value ;
1270-
1271- RB_VM_LOCKING () {
1272- st_delete (generic_fields_tbl_no_ractor_check (obj ), & key , & value );
1273- }
1274- }
1275- }
1276-
12771283VALUE
12781284rb_obj_field_get (VALUE obj , shape_id_t target_shape_id )
12791285{
0 commit comments