@@ -3660,70 +3660,30 @@ vm_weak_table_gen_fields_foreach_too_complex_replace_i(st_data_t *_key, st_data_
36603660struct st_table * rb_generic_fields_tbl_get (void );
36613661
36623662static int
3663- vm_weak_table_id_to_obj_foreach (st_data_t key , st_data_t value , st_data_t data )
3663+ vm_weak_table_id_to_obj_foreach (st_data_t key , st_data_t value , st_data_t data , int error )
36643664{
36653665 struct global_vm_table_foreach_data * iter_data = (struct global_vm_table_foreach_data * )data ;
36663666
3667- int ret = iter_data -> callback ((VALUE )value , iter_data -> data );
3668-
3669- switch (ret ) {
3670- case ST_CONTINUE :
3671- return ret ;
3672-
3673- case ST_DELETE :
3674- GC_ASSERT (rb_shape_obj_has_id ((VALUE )value ));
3675- return ST_DELETE ;
3676-
3677- case ST_REPLACE : {
3678- VALUE new_value = (VALUE )value ;
3679- ret = iter_data -> update_callback (& new_value , iter_data -> data );
3680- if (value != new_value ) {
3681- DURING_GC_COULD_MALLOC_REGION_START ();
3682- {
3683- st_insert (id_to_obj_tbl , key , (st_data_t )new_value );
3684- }
3685- DURING_GC_COULD_MALLOC_REGION_END ();
3686- }
3687- return ST_CONTINUE ;
3688- }
3667+ if (!iter_data -> weak_only && !FIXNUM_P ((VALUE )key )) {
3668+ int ret = iter_data -> callback ((VALUE )key , iter_data -> data );
3669+ if (ret != ST_CONTINUE ) return ret ;
36893670 }
36903671
3691- return ret ;
3672+ return iter_data -> callback (( VALUE ) value , iter_data -> data ) ;
36923673}
36933674
36943675static int
3695- vm_weak_table_id_to_obj_keys_foreach (st_data_t key , st_data_t value , st_data_t data )
3676+ vm_weak_table_id_to_obj_foreach_update (st_data_t * key , st_data_t * value , st_data_t data , int existing )
36963677{
36973678 struct global_vm_table_foreach_data * iter_data = (struct global_vm_table_foreach_data * )data ;
36983679
3699- if (LIKELY (FIXNUM_P ((VALUE )key ))) {
3700- return ST_CONTINUE ;
3701- }
3702-
3703- int ret = iter_data -> callback ((VALUE )key , iter_data -> data );
3704-
3705- switch (ret ) {
3706- case ST_CONTINUE :
3707- return ret ;
3708-
3709- case ST_DELETE :
3710- return ST_DELETE ;
3680+ iter_data -> update_callback ((VALUE * )value , iter_data -> data );
37113681
3712- case ST_REPLACE : {
3713- VALUE new_key = (VALUE )key ;
3714- ret = iter_data -> update_callback (& new_key , iter_data -> data );
3715- if (key != new_key ) ret = ST_DELETE ;
3716- DURING_GC_COULD_MALLOC_REGION_START ();
3717- {
3718- st_insert (id_to_obj_tbl , (st_data_t )new_key , value );
3719- }
3720- DURING_GC_COULD_MALLOC_REGION_END ();
3721- key = (st_data_t )new_key ;
3722- break ;
3723- }
3682+ if (!iter_data -> weak_only && !FIXNUM_P ((VALUE )* key )) {
3683+ iter_data -> update_callback ((VALUE * )key , iter_data -> data );
37243684 }
37253685
3726- return ret ;
3686+ return ST_CONTINUE ;
37273687}
37283688
37293689static int
@@ -3855,19 +3815,12 @@ rb_gc_vm_weak_table_foreach(vm_table_foreach_callback_func callback,
38553815 }
38563816 case RB_GC_VM_ID_TO_OBJ_TABLE : {
38573817 if (id_to_obj_tbl ) {
3858- st_foreach (
3818+ st_foreach_with_replace (
38593819 id_to_obj_tbl ,
38603820 vm_weak_table_id_to_obj_foreach ,
3821+ vm_weak_table_id_to_obj_foreach_update ,
38613822 (st_data_t )& foreach_data
38623823 );
3863-
3864- if (!RB_POSFIXABLE (next_object_id )) {
3865- st_foreach (
3866- id_to_obj_tbl ,
3867- vm_weak_table_id_to_obj_keys_foreach ,
3868- (st_data_t )& foreach_data
3869- );
3870- }
38713824 }
38723825 break ;
38733826 }
0 commit comments