zval *zv, *end;
ht = obj->handlers->get_gc(obj, &zv, &n);
- end = zv + n;
if (EXPECTED(!ht) || UNEXPECTED(GC_REF_CHECK_COLOR(ht, GC_BLACK))) {
ht = NULL;
if (!n) goto next;
+ end = zv + n;
while (!Z_REFCOUNTED_P(--end)) {
if (zv == end) goto next;
}
} else {
GC_REF_SET_BLACK(ht);
+ if (!n) goto handle_ht;
+ end = zv + n;
}
while (zv != end) {
if (Z_REFCOUNTED_P(zv)) {
goto next;
}
+handle_ht:
if (!ht->nNumUsed) goto next;
p = ht->arData;
end = p + ht->nNumUsed;
zval *zv, *end;
ht = obj->handlers->get_gc(obj, &zv, &n);
- end = zv + n;
if (EXPECTED(!ht) || UNEXPECTED(GC_REF_CHECK_COLOR(ht, GC_GREY))) {
ht = NULL;
if (!n) goto next;
+ end = zv + n;
while (!Z_REFCOUNTED_P(--end)) {
if (zv == end) goto next;
}
} else {
GC_REF_SET_COLOR(ht, GC_GREY);
+ if (!n) goto handle_ht;
+ end = zv + n;
}
while (zv != end) {
if (Z_REFCOUNTED_P(zv)) {
goto next;
}
+handle_ht:
if (!ht->nNumUsed) goto next;
p = ht->arData;
end = p + ht->nNumUsed;
zval *zv, *end;
ht = obj->handlers->get_gc(obj, &zv, &n);
- end = zv + n;
if (EXPECTED(!ht) || UNEXPECTED(!GC_REF_CHECK_COLOR(ht, GC_GREY))) {
ht = NULL;
if (!n) goto next;
+ end = zv + n;
while (!Z_REFCOUNTED_P(--end)) {
if (zv == end) goto next;
}
} else {
GC_REF_SET_COLOR(ht, GC_WHITE);
+ if (!n) goto handle_ht;
+ end = zv + n;
}
while (zv != end) {
if (Z_REFCOUNTED_P(zv)) {
goto next;
}
+handle_ht:
if (!ht->nNumUsed) goto next;
p = ht->arData;
end = p + ht->nNumUsed;
*flags |= GC_HAS_DESTRUCTORS;
}
ht = obj->handlers->get_gc(obj, &zv, &n);
- end = zv + n;
if (EXPECTED(!ht) || UNEXPECTED(GC_REF_CHECK_COLOR(ht, GC_BLACK))) {
ht = NULL;
if (!n) goto next;
+ end = zv + n;
while (!Z_REFCOUNTED_P(--end)) {
if (zv == end) goto next;
}
} else {
GC_REF_SET_BLACK(ht);
+ if (!n) goto handle_ht;
+ end = zv + n;
}
while (zv != end) {
if (Z_REFCOUNTED_P(zv)) {
goto next;
}
+handle_ht:
if (!ht->nNumUsed) goto next;
p = ht->arData;
end = p + ht->nNumUsed;
zval *zv, *end;
ht = obj->handlers->get_gc(obj, &zv, &n);
- end = zv + n;
if (EXPECTED(!ht)) {
if (!n) return count;
+ end = zv + n;
while (!Z_REFCOUNTED_P(--end)) {
if (zv == end) return count;
}
+ } else {
+ if (!n) goto handle_ht;
+ end = zv + n;
}
while (zv != end) {
if (Z_REFCOUNTED_P(zv)) {
return count;
}
+handle_ht:
if (!ht->nNumUsed) return count;
p = ht->arData;
end = p + ht->nNumUsed;