@@ -3660,70 +3660,30 @@ vm_weak_table_gen_fields_foreach_too_complex_replace_i(st_data_t *_key, st_data_
3660
3660
struct st_table * rb_generic_fields_tbl_get (void );
3661
3661
3662
3662
static 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 )
3664
3664
{
3665
3665
struct global_vm_table_foreach_data * iter_data = (struct global_vm_table_foreach_data * )data ;
3666
3666
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 ;
3689
3670
}
3690
3671
3691
- return ret ;
3672
+ return iter_data -> callback (( VALUE ) value , iter_data -> data ) ;
3692
3673
}
3693
3674
3694
3675
static 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 )
3696
3677
{
3697
3678
struct global_vm_table_foreach_data * iter_data = (struct global_vm_table_foreach_data * )data ;
3698
3679
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 );
3711
3681
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 );
3724
3684
}
3725
3685
3726
- return ret ;
3686
+ return ST_CONTINUE ;
3727
3687
}
3728
3688
3729
3689
static int
@@ -3855,19 +3815,12 @@ rb_gc_vm_weak_table_foreach(vm_table_foreach_callback_func callback,
3855
3815
}
3856
3816
case RB_GC_VM_ID_TO_OBJ_TABLE : {
3857
3817
if (id_to_obj_tbl ) {
3858
- st_foreach (
3818
+ st_foreach_with_replace (
3859
3819
id_to_obj_tbl ,
3860
3820
vm_weak_table_id_to_obj_foreach ,
3821
+ vm_weak_table_id_to_obj_foreach_update ,
3861
3822
(st_data_t )& foreach_data
3862
3823
);
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
- }
3871
3824
}
3872
3825
break ;
3873
3826
}
0 commit comments