@@ -388,11 +388,14 @@ static void gc_scan_black(zend_refcounted *ref)
388
388
ZVAL_OBJ (& tmp , obj );
389
389
ht = get_gc (& tmp , & zv , & n );
390
390
end = zv + n ;
391
- if (EXPECTED (!ht )) {
391
+ if (EXPECTED (!ht ) || UNEXPECTED (GC_REF_GET_COLOR (ht ) == GC_BLACK )) {
392
+ ht = NULL ;
392
393
if (!n ) return ;
393
394
while (!Z_REFCOUNTED_P (-- end )) {
394
395
if (zv == end ) return ;
395
396
}
397
+ } else {
398
+ GC_REF_SET_BLACK (ht );
396
399
}
397
400
while (zv != end ) {
398
401
if (Z_REFCOUNTED_P (zv )) {
@@ -498,11 +501,14 @@ static void gc_mark_grey(zend_refcounted *ref)
498
501
ZVAL_OBJ (& tmp , obj );
499
502
ht = get_gc (& tmp , & zv , & n );
500
503
end = zv + n ;
501
- if (EXPECTED (!ht )) {
504
+ if (EXPECTED (!ht ) || UNEXPECTED (GC_REF_GET_COLOR (ht ) == GC_GREY )) {
505
+ ht = NULL ;
502
506
if (!n ) return ;
503
507
while (!Z_REFCOUNTED_P (-- end )) {
504
508
if (zv == end ) return ;
505
509
}
510
+ } else {
511
+ GC_REF_SET_COLOR (ht , GC_GREY );
506
512
}
507
513
while (zv != end ) {
508
514
if (Z_REFCOUNTED_P (zv )) {
@@ -616,11 +622,14 @@ static void gc_scan(zend_refcounted *ref)
616
622
ZVAL_OBJ (& tmp , obj );
617
623
ht = get_gc (& tmp , & zv , & n );
618
624
end = zv + n ;
619
- if (EXPECTED (!ht )) {
625
+ if (EXPECTED (!ht ) || UNEXPECTED (GC_REF_GET_COLOR (ht ) != GC_GREY )) {
626
+ ht = NULL ;
620
627
if (!n ) return ;
621
628
while (!Z_REFCOUNTED_P (-- end )) {
622
629
if (zv == end ) return ;
623
630
}
631
+ } else {
632
+ GC_REF_SET_COLOR (ht , GC_WHITE );
624
633
}
625
634
while (zv != end ) {
626
635
if (Z_REFCOUNTED_P (zv )) {
@@ -791,7 +800,8 @@ static int gc_collect_white(zend_refcounted *ref, uint32_t *flags)
791
800
ZVAL_OBJ (& tmp , obj );
792
801
ht = get_gc (& tmp , & zv , & n );
793
802
end = zv + n ;
794
- if (EXPECTED (!ht )) {
803
+ if (EXPECTED (!ht ) || UNEXPECTED (GC_REF_GET_COLOR (ht ) == GC_BLACK )) {
804
+ ht = NULL ;
795
805
if (!n ) return count ;
796
806
while (!Z_REFCOUNTED_P (-- end )) {
797
807
/* count non-refcounted for compatibility ??? */
@@ -800,6 +810,8 @@ static int gc_collect_white(zend_refcounted *ref, uint32_t *flags)
800
810
}
801
811
if (zv == end ) return count ;
802
812
}
813
+ } else {
814
+ GC_REF_SET_BLACK (ht );
803
815
}
804
816
while (zv != end ) {
805
817
if (Z_REFCOUNTED_P (zv )) {
0 commit comments