@@ -2058,6 +2058,16 @@ remove_obj_from_freelist(rb_heap_t *heap, VALUE obj)
2058
2058
GC_ASSERT (prev == NULL );
2059
2059
heap -> freelist = next ;
2060
2060
}
2061
+
2062
+ if (p == GET_HEAP_PAGE (p )-> freelist ) {
2063
+ GC_ASSERT (prev == NULL );
2064
+ GET_HEAP_PAGE (p )-> freelist = next ;
2065
+ }
2066
+
2067
+ if (p == GET_HEAP_PAGE (p )-> freelist_tail ) {
2068
+ GC_ASSERT (next == NULL );
2069
+ GET_HEAP_PAGE (p )-> freelist_tail = prev ;
2070
+ }
2061
2071
}
2062
2072
2063
2073
static inline VALUE
@@ -4443,6 +4453,8 @@ gc_page_sweep(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *sweep_
4443
4453
RVALUE * p = pstart + i ;
4444
4454
VALUE vp = (VALUE )p ;
4445
4455
4456
+ GC_ASSERT (!RVALUE_PAGE_MARKING (sweep_page , p ) || sweep_page -> flags .has_remembered_objects );
4457
+
4446
4458
bitset = (~bits [BITMAP_INDEX (p )] >> BITMAP_OFFSET (p )) & 1 ;
4447
4459
4448
4460
asan_unpoison_object (vp , false);
@@ -4452,7 +4464,6 @@ gc_page_sweep(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *sweep_
4452
4464
gc_report (2 , objspace , "page_sweep: free %p\n" , (void * )p );
4453
4465
#if RGENGC_CHECK_MODE
4454
4466
if (!is_full_marking (objspace )) {
4455
- // if (RVALUE_OLD_P(vp)) rb_bug("page_sweep: %p - old while minor GC.", (void *)p);
4456
4467
if (RVALUE_OLD_P (vp )) rb_bug ("page_sweep: old while minor GC: %s." , obj_info (p ));
4457
4468
if (rgengc_remembered_sweep (objspace , vp )) rb_bug ("page_sweep: %p - remembered." , (void * )p );
4458
4469
}
@@ -7843,6 +7854,7 @@ gc_is_moveable_obj(rb_objspace_t *objspace, VALUE obj)
7843
7854
case T_NIL :
7844
7855
case T_MOVED :
7845
7856
case T_ZOMBIE :
7857
+ case T_GARBAGE :
7846
7858
return FALSE;
7847
7859
case T_SYMBOL :
7848
7860
if (DYNAMIC_SYM_P (obj ) && (RSYMBOL (obj )-> id & ~ID_SCOPE_MASK )) {
@@ -7925,6 +7937,8 @@ gc_move(rb_objspace_t *objspace, VALUE scan, VALUE free, struct RMoved * moved_l
7925
7937
st_insert (objspace -> obj_to_id_tbl , (st_data_t )dest , id );
7926
7938
}
7927
7939
7940
+ remove_obj_from_freelist (heap_eden , (VALUE )dest );
7941
+
7928
7942
/* Move the object */
7929
7943
memcpy (dest , src , sizeof (RVALUE ));
7930
7944
memset (src , 0 , sizeof (RVALUE ));
@@ -7978,12 +7992,12 @@ static void
7978
7992
advance_cursor (struct heap_cursor * free , struct heap_page * * page_list )
7979
7993
{
7980
7994
if (free -> slot == free -> page -> start + free -> page -> total_slots - 1 ) {
7981
- free -> index -- ;
7995
+ free -> index ++ ;
7982
7996
free -> page = page_list [free -> index ];
7983
7997
free -> slot = free -> page -> start ;
7984
7998
}
7985
7999
else {
7986
- free -> slot -- ;
8000
+ free -> slot ++ ;
7987
8001
}
7988
8002
}
7989
8003
@@ -8027,7 +8041,7 @@ init_cursors(rb_objspace_t *objspace, struct heap_cursor *free, struct heap_curs
8027
8041
page = page_list [total_pages - 1 ];
8028
8042
scan -> index = total_pages - 1 ;
8029
8043
scan -> page = page ;
8030
- scan -> slot = page -> start + page -> total_slots * 2 - 2 ;
8044
+ scan -> slot = page -> start + page -> total_slots - 1 ;
8031
8045
scan -> objspace = objspace ;
8032
8046
}
8033
8047
@@ -8703,16 +8717,10 @@ gc_ref_update(void *vstart, void *vend, size_t stride, void * data)
8703
8717
{
8704
8718
rb_objspace_t * objspace ;
8705
8719
struct heap_page * page ;
8706
- short free_slots = 0 ;
8707
8720
8708
8721
VALUE v = (VALUE )vstart ;
8709
8722
objspace = (rb_objspace_t * )data ;
8710
8723
page = GET_HEAP_PAGE (v );
8711
- asan_unpoison_memory_region (& page -> freelist , sizeof (RVALUE * ), false);
8712
- page -> freelist = NULL ;
8713
- asan_poison_memory_region (& page -> freelist , sizeof (RVALUE * ));
8714
- page -> flags .has_uncollectible_shady_objects = FALSE;
8715
- page -> flags .has_remembered_objects = FALSE;
8716
8724
8717
8725
/* For each object on the page */
8718
8726
for (; v != (VALUE )vend ; v += stride ) {
@@ -8722,11 +8730,7 @@ gc_ref_update(void *vstart, void *vend, size_t stride, void * data)
8722
8730
8723
8731
switch (BUILTIN_TYPE (v )) {
8724
8732
case T_NONE :
8725
- heap_page_add_freeobj (objspace , page , v );
8726
- free_slots ++ ;
8727
- break ;
8728
8733
case T_MOVED :
8729
- break ;
8730
8734
case T_ZOMBIE :
8731
8735
break ;
8732
8736
default :
@@ -8746,7 +8750,6 @@ gc_ref_update(void *vstart, void *vend, size_t stride, void * data)
8746
8750
}
8747
8751
}
8748
8752
8749
- page -> free_slots = free_slots ;
8750
8753
return 0 ;
8751
8754
}
8752
8755
0 commit comments