@@ -699,11 +699,14 @@ static void gc_scan_black(zend_refcounted *ref, gc_stack *stack)
699
699
700
700
ht = obj -> handlers -> get_gc (obj , & zv , & n );
701
701
end = zv + n ;
702
- if (EXPECTED (!ht )) {
702
+ if (EXPECTED (!ht ) || UNEXPECTED (GC_REF_CHECK_COLOR (ht , GC_BLACK ))) {
703
+ ht = NULL ;
703
704
if (!n ) goto next ;
704
705
while (!Z_REFCOUNTED_P (-- end )) {
705
706
if (zv == end ) goto next ;
706
707
}
708
+ } else {
709
+ GC_REF_SET_BLACK (ht );
707
710
}
708
711
while (zv != end ) {
709
712
if (Z_REFCOUNTED_P (zv )) {
@@ -814,11 +817,14 @@ static void gc_mark_grey(zend_refcounted *ref, gc_stack *stack)
814
817
815
818
ht = obj -> handlers -> get_gc (obj , & zv , & n );
816
819
end = zv + n ;
817
- if (EXPECTED (!ht )) {
820
+ if (EXPECTED (!ht ) || UNEXPECTED (GC_REF_CHECK_COLOR (ht , GC_GREY ))) {
821
+ ht = NULL ;
818
822
if (!n ) goto next ;
819
823
while (!Z_REFCOUNTED_P (-- end )) {
820
824
if (zv == end ) goto next ;
821
825
}
826
+ } else {
827
+ GC_REF_SET_COLOR (ht , GC_GREY );
822
828
}
823
829
while (zv != end ) {
824
830
if (Z_REFCOUNTED_P (zv )) {
@@ -1000,11 +1006,14 @@ static void gc_scan(zend_refcounted *ref, gc_stack *stack)
1000
1006
1001
1007
ht = obj -> handlers -> get_gc (obj , & zv , & n );
1002
1008
end = zv + n ;
1003
- if (EXPECTED (!ht )) {
1009
+ if (EXPECTED (!ht ) || UNEXPECTED (!GC_REF_CHECK_COLOR (ht , GC_GREY ))) {
1010
+ ht = NULL ;
1004
1011
if (!n ) goto next ;
1005
1012
while (!Z_REFCOUNTED_P (-- end )) {
1006
1013
if (zv == end ) goto next ;
1007
1014
}
1015
+ } else {
1016
+ GC_REF_SET_COLOR (ht , GC_WHITE );
1008
1017
}
1009
1018
while (zv != end ) {
1010
1019
if (Z_REFCOUNTED_P (zv )) {
@@ -1167,7 +1176,8 @@ static int gc_collect_white(zend_refcounted *ref, uint32_t *flags, gc_stack *sta
1167
1176
}
1168
1177
ht = obj -> handlers -> get_gc (obj , & zv , & n );
1169
1178
end = zv + n ;
1170
- if (EXPECTED (!ht )) {
1179
+ if (EXPECTED (!ht ) || UNEXPECTED (GC_REF_CHECK_COLOR (ht , GC_BLACK ))) {
1180
+ ht = NULL ;
1171
1181
if (!n ) goto next ;
1172
1182
while (!Z_REFCOUNTED_P (-- end )) {
1173
1183
/* count non-refcounted for compatibility ??? */
@@ -1176,6 +1186,8 @@ static int gc_collect_white(zend_refcounted *ref, uint32_t *flags, gc_stack *sta
1176
1186
}
1177
1187
if (zv == end ) goto next ;
1178
1188
}
1189
+ } else {
1190
+ GC_REF_SET_BLACK (ht );
1179
1191
}
1180
1192
while (zv != end ) {
1181
1193
if (Z_REFCOUNTED_P (zv )) {
0 commit comments