@@ -2632,7 +2632,7 @@ rb_gc_impl_pointer_to_heap_p(void *objspace_ptr, const void *ptr)
2632
2632
return is_pointer_to_heap (objspace_ptr , ptr );
2633
2633
}
2634
2634
2635
- #define ZOMBIE_OBJ_KEPT_FLAGS (FL_SEEN_OBJ_ID | FL_FINALIZE)
2635
+ #define ZOMBIE_OBJ_KEPT_FLAGS (FL_FINALIZE)
2636
2636
2637
2637
void
2638
2638
rb_gc_impl_make_zombie (void * objspace_ptr , VALUE obj , void (* dfree )(void * ), void * data )
@@ -2856,7 +2856,7 @@ rb_gc_impl_define_finalizer(void *objspace_ptr, VALUE obj, VALUE block)
2856
2856
rb_ary_push (table , block );
2857
2857
}
2858
2858
else {
2859
- table = rb_ary_new3 (1 , block );
2859
+ table = rb_ary_new3 (2 , rb_gc_impl_object_id ( objspace , obj ) , block );
2860
2860
rb_obj_hide (table );
2861
2861
st_add_direct (finalizer_table , obj , table );
2862
2862
}
@@ -2897,25 +2897,12 @@ rb_gc_impl_copy_finalizer(void *objspace_ptr, VALUE dest, VALUE obj)
2897
2897
}
2898
2898
}
2899
2899
2900
- static VALUE
2901
- get_object_id_in_finalizer (rb_objspace_t * objspace , VALUE obj )
2902
- {
2903
- if (FL_TEST_RAW (obj , FL_SEEN_OBJ_ID )) {
2904
- return rb_gc_impl_object_id (objspace , obj );
2905
- }
2906
- else {
2907
- VALUE id = ULL2NUM (objspace -> next_object_id );
2908
- objspace -> next_object_id += OBJ_ID_INCREMENT ;
2909
- return id ;
2910
- }
2911
- }
2912
-
2913
2900
static VALUE
2914
2901
get_final (long i , void * data )
2915
2902
{
2916
2903
VALUE table = (VALUE )data ;
2917
2904
2918
- return RARRAY_AREF (table , i );
2905
+ return RARRAY_AREF (table , i + 1 );
2919
2906
}
2920
2907
2921
2908
static void
@@ -2930,7 +2917,7 @@ run_final(rb_objspace_t *objspace, VALUE zombie)
2930
2917
FL_UNSET (zombie , FL_FINALIZE );
2931
2918
st_data_t table ;
2932
2919
if (st_delete (finalizer_table , & key , & table )) {
2933
- rb_gc_run_obj_finalizer (get_object_id_in_finalizer ( objspace , zombie ), RARRAY_LEN (table ), get_final , (void * )table );
2920
+ rb_gc_run_obj_finalizer (RARRAY_AREF ( table , 0 ), RARRAY_LEN (table ) - 1 , get_final , (void * )table );
2934
2921
}
2935
2922
else {
2936
2923
rb_bug ("FL_FINALIZE flag is set, but finalizers are not found" );
@@ -2956,10 +2943,6 @@ finalize_list(rb_objspace_t *objspace, VALUE zombie)
2956
2943
int lev = rb_gc_vm_lock ();
2957
2944
{
2958
2945
GC_ASSERT (BUILTIN_TYPE (zombie ) == T_ZOMBIE );
2959
- if (FL_TEST_RAW (zombie , FL_SEEN_OBJ_ID )) {
2960
- obj_free_object_id (objspace , zombie );
2961
- }
2962
-
2963
2946
GC_ASSERT (page -> heap -> final_slots_count > 0 );
2964
2947
GC_ASSERT (page -> final_slots > 0 );
2965
2948
@@ -3071,16 +3054,15 @@ rb_gc_impl_shutdown_free_objects(void *objspace_ptr)
3071
3054
}
3072
3055
3073
3056
static int
3074
- rb_gc_impl_shutdown_call_finalizer_i (st_data_t key , st_data_t val , st_data_t data )
3057
+ rb_gc_impl_shutdown_call_finalizer_i (st_data_t key , st_data_t val , st_data_t _data )
3075
3058
{
3076
- rb_objspace_t * objspace = (rb_objspace_t * )data ;
3077
3059
VALUE obj = (VALUE )key ;
3078
3060
VALUE table = (VALUE )val ;
3079
3061
3080
3062
GC_ASSERT (RB_FL_TEST (obj , FL_FINALIZE ));
3081
3063
GC_ASSERT (RB_BUILTIN_TYPE (val ) == T_ARRAY );
3082
3064
3083
- rb_gc_run_obj_finalizer (rb_gc_impl_object_id ( objspace , obj ), RARRAY_LEN (table ), get_final , (void * )table );
3065
+ rb_gc_run_obj_finalizer (RARRAY_AREF ( table , 0 ), RARRAY_LEN (table ) - 1 , get_final , (void * )table );
3084
3066
3085
3067
FL_UNSET (obj , FL_FINALIZE );
3086
3068
@@ -3107,7 +3089,7 @@ rb_gc_impl_shutdown_call_finalizer(void *objspace_ptr)
3107
3089
}
3108
3090
3109
3091
while (finalizer_table -> num_entries ) {
3110
- st_foreach (finalizer_table , rb_gc_impl_shutdown_call_finalizer_i , ( st_data_t ) objspace );
3092
+ st_foreach (finalizer_table , rb_gc_impl_shutdown_call_finalizer_i , 0 );
3111
3093
}
3112
3094
3113
3095
/* run finalizers */
@@ -3564,12 +3546,11 @@ gc_sweep_plane(rb_objspace_t *objspace, rb_heap_t *heap, uintptr_t p, bits_t bit
3564
3546
3565
3547
rb_gc_event_hook (vp , RUBY_INTERNAL_EVENT_FREEOBJ );
3566
3548
3567
- bool has_object_id = FL_TEST_RAW (vp , FL_SEEN_OBJ_ID );
3549
+ if (FL_TEST_RAW (vp , FL_SEEN_OBJ_ID )) {
3550
+ obj_free_object_id (objspace , vp );
3551
+ }
3568
3552
rb_gc_obj_free_vm_weak_references (vp );
3569
3553
if (rb_gc_obj_free (objspace , vp )) {
3570
- if (has_object_id ) {
3571
- obj_free_object_id (objspace , vp );
3572
- }
3573
3554
// always add free slots back to the swept pages freelist,
3574
3555
// so that if we're compacting, we can re-use the slots
3575
3556
(void )VALGRIND_MAKE_MEM_UNDEFINED ((void * )p , BASE_SLOT_SIZE );
0 commit comments