@@ -711,6 +711,7 @@ struct free_slot {
711711
712712struct object_metadata {
713713 unsigned char age : RVALUE_AGE_BIT_COUNT ;
714+ unsigned char seen_obj_id : 1 ;
714715};
715716STATIC_ASSERT (SIZEOF_OBJECT_METADATA , sizeof (struct object_metadata ) == 1 );
716717
@@ -833,6 +834,12 @@ RVALUE_AGE_GET(VALUE obj)
833834 return RVALUE_METADATA (obj )-> age ;
834835}
835836
837+ static bool
838+ RVALUE_SEEN_OBJ_ID (VALUE obj )
839+ {
840+ return RVALUE_METADATA (obj )-> seen_obj_id ;
841+ }
842+
836843static void
837844RVALUE_AGE_SET (VALUE obj , int age )
838845{
@@ -1577,13 +1584,13 @@ rb_gc_impl_object_id(void *objspace_ptr, VALUE obj)
15771584 rb_objspace_t * objspace = objspace_ptr ;
15781585
15791586 unsigned int lev = rb_gc_vm_lock ();
1580- if (FL_TEST (obj , FL_SEEN_OBJ_ID )) {
1587+ if (RVALUE_SEEN_OBJ_ID (obj )) {
15811588 st_data_t val ;
15821589 if (st_lookup (objspace -> obj_to_id_tbl , (st_data_t )obj , & val )) {
15831590 id = (VALUE )val ;
15841591 }
15851592 else {
1586- rb_bug ("rb_gc_impl_object_id: FL_SEEN_OBJ_ID flag set but not found in table" );
1593+ rb_bug ("rb_gc_impl_object_id: seen_obj_id flag set but not found in table" );
15871594 }
15881595 }
15891596 else {
@@ -1594,7 +1601,7 @@ rb_gc_impl_object_id(void *objspace_ptr, VALUE obj)
15941601
15951602 st_insert (objspace -> obj_to_id_tbl , (st_data_t )obj , (st_data_t )id );
15961603 st_insert (objspace -> id_to_obj_tbl , (st_data_t )id , (st_data_t )obj );
1597- FL_SET (obj , FL_SEEN_OBJ_ID ) ;
1604+ RVALUE_METADATA (obj ) -> seen_obj_id = true ;
15981605 }
15991606 rb_gc_vm_unlock (lev );
16001607
@@ -2622,7 +2629,7 @@ rb_gc_impl_pointer_to_heap_p(void *objspace_ptr, const void *ptr)
26222629 return is_pointer_to_heap (objspace_ptr , ptr );
26232630}
26242631
2625- #define ZOMBIE_OBJ_KEPT_FLAGS (FL_SEEN_OBJ_ID | FL_FINALIZE)
2632+ #define ZOMBIE_OBJ_KEPT_FLAGS (FL_FINALIZE)
26262633
26272634void
26282635rb_gc_impl_make_zombie (void * objspace_ptr , VALUE obj , void (* dfree )(void * ), void * data )
@@ -2649,8 +2656,8 @@ obj_free_object_id(rb_objspace_t *objspace, VALUE obj)
26492656{
26502657 st_data_t o = (st_data_t )obj , id ;
26512658
2652- GC_ASSERT (BUILTIN_TYPE (obj ) == T_NONE || FL_TEST (obj , FL_SEEN_OBJ_ID ));
2653- FL_UNSET (obj , FL_SEEN_OBJ_ID ) ;
2659+ GC_ASSERT (BUILTIN_TYPE (obj ) == T_NONE || RVALUE_SEEN_OBJ_ID (obj ));
2660+ RVALUE_METADATA (obj ) -> seen_obj_id = false ;
26542661
26552662 if (st_delete (objspace -> obj_to_id_tbl , & o , & id )) {
26562663 GC_ASSERT (id );
@@ -2883,7 +2890,7 @@ rb_gc_impl_copy_finalizer(void *objspace_ptr, VALUE dest, VALUE obj)
28832890static VALUE
28842891get_object_id_in_finalizer (rb_objspace_t * objspace , VALUE obj )
28852892{
2886- if (FL_TEST_RAW (obj , FL_SEEN_OBJ_ID )) {
2893+ if (RVALUE_SEEN_OBJ_ID (obj )) {
28872894 return rb_gc_impl_object_id (objspace , obj );
28882895 }
28892896 else {
@@ -2939,7 +2946,7 @@ finalize_list(rb_objspace_t *objspace, VALUE zombie)
29392946 int lev = rb_gc_vm_lock ();
29402947 {
29412948 GC_ASSERT (BUILTIN_TYPE (zombie ) == T_ZOMBIE );
2942- if (FL_TEST_RAW (zombie , FL_SEEN_OBJ_ID )) {
2949+ if (RVALUE_SEEN_OBJ_ID (zombie )) {
29432950 obj_free_object_id (objspace , zombie );
29442951 }
29452952
@@ -3547,7 +3554,7 @@ gc_sweep_plane(rb_objspace_t *objspace, rb_heap_t *heap, uintptr_t p, bits_t bit
35473554
35483555 rb_gc_event_hook (vp , RUBY_INTERNAL_EVENT_FREEOBJ );
35493556
3550- bool has_object_id = FL_TEST_RAW (vp , FL_SEEN_OBJ_ID );
3557+ bool has_object_id = RVALUE_SEEN_OBJ_ID (vp );
35513558 rb_gc_obj_free_vm_weak_references (vp );
35523559 if (rb_gc_obj_free (objspace , vp )) {
35533560 if (has_object_id ) {
@@ -6232,7 +6239,7 @@ rb_gc_impl_object_metadata(void *objspace_ptr, VALUE obj)
62326239 if (RVALUE_MARKING (objspace , obj )) SET_ENTRY (marking , Qtrue );
62336240 if (RVALUE_MARKED (objspace , obj )) SET_ENTRY (marked , Qtrue );
62346241 if (RVALUE_PINNED (objspace , obj )) SET_ENTRY (pinned , Qtrue );
6235- if (FL_TEST (obj , FL_SEEN_OBJ_ID )) SET_ENTRY (object_id , rb_obj_id (obj ));
6242+ if (RVALUE_SEEN_OBJ_ID (obj )) SET_ENTRY (object_id , rb_obj_id (obj ));
62366243
62376244 object_metadata_entries [n ].name = 0 ;
62386245 object_metadata_entries [n ].val = 0 ;
@@ -6950,7 +6957,7 @@ gc_move(rb_objspace_t *objspace, VALUE src, VALUE dest, size_t src_slot_size, si
69506957 CLEAR_IN_BITMAP (GET_HEAP_UNCOLLECTIBLE_BITS (src ), src );
69516958 CLEAR_IN_BITMAP (GET_HEAP_PAGE (src )-> remembered_bits , src );
69526959
6953- if (FL_TEST_RAW (src , FL_SEEN_OBJ_ID )) {
6960+ if (RVALUE_SEEN_OBJ_ID (src )) {
69546961 /* If the source object's object_id has been seen, we need to update
69556962 * the object to object id mapping. */
69566963 st_data_t srcid = (st_data_t )src , id ;
0 commit comments