@@ -9126,41 +9126,43 @@ gc_ref_update(void *vstart, void *vend, size_t stride, void * data)
91269126{
91279127 rb_objspace_t * objspace ;
91289128 struct heap_page * page ;
9129+ short free_slots = 0 ;
91299130
91309131 VALUE v = (VALUE )vstart ;
91319132 objspace = (rb_objspace_t * )data ;
91329133 page = GET_HEAP_PAGE (v );
9134+ asan_unpoison_memory_region (& page -> freelist , sizeof (RVALUE * ), false);
9135+ asan_poison_memory_region (& page -> freelist , sizeof (RVALUE * ));
9136+ page -> flags .has_uncollectible_shady_objects = FALSE;
9137+ page -> flags .has_remembered_objects = FALSE;
91339138
91349139 /* For each object on the page */
91359140 for (; v != (VALUE )vend ; v += stride ) {
91369141 void * poisoned = asan_poisoned_object_p (v );
91379142 asan_unpoison_object (v , false);
91389143
9139- switch (BUILTIN_TYPE (v )) {
9140- case T_NONE :
9141- case T_MOVED :
9142- case T_ZOMBIE :
9143- break ;
9144- default :
9145- if (RVALUE_WB_UNPROTECTED (v )) {
9146- page -> flags .has_uncollectible_shady_objects = TRUE;
9147- }
9148- if (RVALUE_PAGE_MARKING (page , v )) {
9149- page -> flags .has_remembered_objects = TRUE;
9150- }
9151- gc_update_object_references (objspace , v );
9144+ switch (BUILTIN_TYPE (v )) {
9145+ case T_NONE :
9146+ case T_MOVED :
9147+ case T_ZOMBIE :
9148+ break ;
9149+ default :
9150+ if (RVALUE_WB_UNPROTECTED (v )) {
9151+ page -> flags .has_uncollectible_shady_objects = TRUE;
91529152 }
91539153 if (RVALUE_PAGE_MARKING (page , v )) {
9154- page -> flags .has_remembered_objects = TRUE;
9154+ page -> flags .has_remembered_objects = TRUE;
91559155 }
91569156 gc_update_object_references (objspace , v );
91579157 }
91589158
91599159 if (poisoned ) {
9160+ GC_ASSERT (BUILTIN_TYPE (v ) == T_NONE );
91609161 asan_poison_object (v );
91619162 }
91629163 }
91639164
9165+ page -> free_slots = free_slots ;
91649166 return 0 ;
91659167}
91669168
0 commit comments