@@ -701,11 +701,14 @@ static void gc_scan_black(zend_refcounted *ref, gc_stack *stack)
701
701
ZVAL_OBJ (& tmp , obj );
702
702
ht = get_gc (& tmp , & zv , & n );
703
703
end = zv + n ;
704
- if (EXPECTED (!ht )) {
704
+ if (EXPECTED (!ht ) || UNEXPECTED (GC_REF_CHECK_COLOR (ht , GC_BLACK ))) {
705
+ ht = NULL ;
705
706
if (!n ) goto next ;
706
707
while (!Z_REFCOUNTED_P (-- end )) {
707
708
if (zv == end ) goto next ;
708
709
}
710
+ } else {
711
+ GC_REF_SET_BLACK (ht );
709
712
}
710
713
while (zv != end ) {
711
714
if (Z_REFCOUNTED_P (zv )) {
@@ -820,11 +823,14 @@ static void gc_mark_grey(zend_refcounted *ref, gc_stack *stack)
820
823
ZVAL_OBJ (& tmp , obj );
821
824
ht = get_gc (& tmp , & zv , & n );
822
825
end = zv + n ;
823
- if (EXPECTED (!ht )) {
826
+ if (EXPECTED (!ht ) || UNEXPECTED (GC_REF_CHECK_COLOR (ht , GC_GREY ))) {
827
+ ht = NULL ;
824
828
if (!n ) goto next ;
825
829
while (!Z_REFCOUNTED_P (-- end )) {
826
830
if (zv == end ) goto next ;
827
831
}
832
+ } else {
833
+ GC_REF_SET_COLOR (ht , GC_GREY );
828
834
}
829
835
while (zv != end ) {
830
836
if (Z_REFCOUNTED_P (zv )) {
@@ -1010,11 +1016,14 @@ static void gc_scan(zend_refcounted *ref, gc_stack *stack)
1010
1016
ZVAL_OBJ (& tmp , obj );
1011
1017
ht = get_gc (& tmp , & zv , & n );
1012
1018
end = zv + n ;
1013
- if (EXPECTED (!ht )) {
1019
+ if (EXPECTED (!ht ) || UNEXPECTED (!GC_REF_CHECK_COLOR (ht , GC_GREY ))) {
1020
+ ht = NULL ;
1014
1021
if (!n ) goto next ;
1015
1022
while (!Z_REFCOUNTED_P (-- end )) {
1016
1023
if (zv == end ) goto next ;
1017
1024
}
1025
+ } else {
1026
+ GC_REF_SET_COLOR (ht , GC_WHITE );
1018
1027
}
1019
1028
while (zv != end ) {
1020
1029
if (Z_REFCOUNTED_P (zv )) {
@@ -1181,7 +1190,8 @@ static int gc_collect_white(zend_refcounted *ref, uint32_t *flags, gc_stack *sta
1181
1190
ZVAL_OBJ (& tmp , obj );
1182
1191
ht = get_gc (& tmp , & zv , & n );
1183
1192
end = zv + n ;
1184
- if (EXPECTED (!ht )) {
1193
+ if (EXPECTED (!ht ) || UNEXPECTED (GC_REF_CHECK_COLOR (ht , GC_BLACK ))) {
1194
+ ht = NULL ;
1185
1195
if (!n ) goto next ;
1186
1196
while (!Z_REFCOUNTED_P (-- end )) {
1187
1197
/* count non-refcounted for compatibility ??? */
@@ -1190,6 +1200,8 @@ static int gc_collect_white(zend_refcounted *ref, uint32_t *flags, gc_stack *sta
1190
1200
}
1191
1201
if (zv == end ) goto next ;
1192
1202
}
1203
+ } else {
1204
+ GC_REF_SET_BLACK (ht );
1193
1205
}
1194
1206
while (zv != end ) {
1195
1207
if (Z_REFCOUNTED_P (zv )) {
0 commit comments