{
HashTable *ht;
Bucket *p, *end;
+ zval *zv;
tail_call:
ht = NULL;
if (!ht->nNumUsed) return;
p = ht->arData;
end = p + ht->nNumUsed;
- while (!Z_REFCOUNTED((--end)->val)) {
+ while (1) {
+ end--;
+ zv = &end->val;
+ if (Z_TYPE_P(zv) == IS_INDIRECT) {
+ zv = Z_INDIRECT_P(zv);
+ }
+ if (Z_REFCOUNTED_P(zv)) {
+ break;
+ }
if (p == end) return;
}
while (p != end) {
- if (Z_REFCOUNTED(p->val)) {
- ref = Z_COUNTED(p->val);
+ zv = &p->val;
+ if (Z_TYPE_P(zv) == IS_INDIRECT) {
+ zv = Z_INDIRECT_P(zv);
+ }
+ if (Z_REFCOUNTED_P(zv)) {
+ ref = Z_COUNTED_P(zv);
GC_REFCOUNT(ref)++;
if (GC_REF_GET_COLOR(ref) != GC_BLACK) {
gc_scan_black(ref);
}
p++;
}
- ref = Z_COUNTED(p->val);
+ zv = &p->val;
+ if (Z_TYPE_P(zv) == IS_INDIRECT) {
+ zv = Z_INDIRECT_P(zv);
+ }
+ ref = Z_COUNTED_P(zv);
GC_REFCOUNT(ref)++;
if (GC_REF_GET_COLOR(ref) != GC_BLACK) {
goto tail_call;
{
HashTable *ht;
Bucket *p, *end;
+ zval *zv;
tail_call:
if (GC_REF_GET_COLOR(ref) != GC_GREY) {
if (!ht->nNumUsed) return;
p = ht->arData;
end = p + ht->nNumUsed;
- while (!Z_REFCOUNTED((--end)->val)) {
+ while (1) {
+ end--;
+ zv = &end->val;
+ if (Z_TYPE_P(zv) == IS_INDIRECT) {
+ zv = Z_INDIRECT_P(zv);
+ }
+ if (Z_REFCOUNTED_P(zv)) {
+ break;
+ }
if (p == end) return;
}
while (p != end) {
- if (Z_REFCOUNTED(p->val)) {
- if (Z_TYPE(p->val) == IS_OBJECT &&
+ zv = &p->val;
+ if (Z_TYPE_P(zv) == IS_INDIRECT) {
+ zv = Z_INDIRECT_P(zv);
+ }
+ if (Z_REFCOUNTED_P(zv)) {
+ if (Z_TYPE_P(zv) == IS_OBJECT &&
UNEXPECTED(!EG(objects_store).object_buckets)) {
- Z_TYPE_INFO(p->val) = IS_NULL;
+ Z_TYPE_INFO_P(zv) = IS_NULL;
} else {
- ref = Z_COUNTED(p->val);
+ ref = Z_COUNTED_P(zv);
GC_REFCOUNT(ref)--;
gc_mark_grey(ref);
}
}
p++;
}
- if (Z_TYPE(p->val) == IS_OBJECT &&
+ zv = &p->val;
+ if (Z_TYPE_P(zv) == IS_INDIRECT) {
+ zv = Z_INDIRECT_P(zv);
+ }
+ if (Z_TYPE_P(zv) == IS_OBJECT &&
UNEXPECTED(!EG(objects_store).object_buckets)) {
- Z_TYPE_INFO(p->val) = IS_NULL;
+ Z_TYPE_INFO_P(zv) = IS_NULL;
} else {
- ref = Z_COUNTED(p->val);
+ ref = Z_COUNTED_P(zv);
GC_REFCOUNT(ref)--;
goto tail_call;
}
{
HashTable *ht;
Bucket *p, *end;
+ zval *zv;
tail_call:
if (GC_REF_GET_COLOR(ref) == GC_GREY) {
if (!ht->nNumUsed) return;
p = ht->arData;
end = p + ht->nNumUsed;
- while (!Z_REFCOUNTED((--end)->val)) {
+ while (1) {
+ end--;
+ zv = &end->val;
+ if (Z_TYPE_P(zv) == IS_INDIRECT) {
+ zv = Z_INDIRECT_P(zv);
+ }
+ if (Z_REFCOUNTED_P(zv)) {
+ break;
+ }
if (p == end) return;
}
while (p != end) {
- if (Z_REFCOUNTED(p->val)) {
- ref = Z_COUNTED(p->val);
+ zv = &p->val;
+ if (Z_TYPE_P(zv) == IS_INDIRECT) {
+ zv = Z_INDIRECT_P(zv);
+ }
+ if (Z_REFCOUNTED_P(zv)) {
+ ref = Z_COUNTED_P(zv);
gc_scan(ref);
}
p++;
}
- ref = Z_COUNTED(p->val);
+ zv = &p->val;
+ if (Z_TYPE_P(zv) == IS_INDIRECT) {
+ zv = Z_INDIRECT_P(zv);
+ }
+ ref = Z_COUNTED_P(zv);
goto tail_call;
}
}
int count = 0;
HashTable *ht;
Bucket *p, *end;
+ zval *zv;
tail_call:
if (GC_REF_GET_COLOR(ref) == GC_WHITE) {
if (!ht->nNumUsed) return count;
p = ht->arData;
end = p + ht->nNumUsed;
- while (!Z_REFCOUNTED((--end)->val)) {
+ while (1) {
+ end--;
+ zv = &end->val;
+ if (Z_TYPE_P(zv) == IS_INDIRECT) {
+ zv = Z_INDIRECT_P(zv);
+ }
+ if (Z_REFCOUNTED_P(zv)) {
+ break;
+ }
/* count non-refcounted for compatibility ??? */
- if (Z_TYPE(end->val) != IS_UNDEF && Z_TYPE(end->val) != IS_INDIRECT) {
+ if (Z_TYPE_P(zv) != IS_UNDEF) {
count++;
}
- if (p == end) return count;
+ if (p == end) return;
}
while (p != end) {
- if (Z_REFCOUNTED(p->val)) {
- ref = Z_COUNTED(p->val);
+ zv = &p->val;
+ if (Z_TYPE_P(zv) == IS_INDIRECT) {
+ zv = Z_INDIRECT_P(zv);
+ }
+ if (Z_REFCOUNTED_P(zv)) {
+ ref = Z_COUNTED_P(zv);
GC_REFCOUNT(ref)++;
count += gc_collect_white(ref, flags, additional_buffer);
/* count non-refcounted for compatibility ??? */
- } else if (Z_TYPE(p->val) != IS_UNDEF && Z_TYPE(p->val) != IS_INDIRECT) {
- count++;
+ } else if (Z_TYPE_P(zv) != IS_UNDEF) {
+ count++;
}
p++;
}
- ref = Z_COUNTED(p->val);
+ zv = &p->val;
+ if (Z_TYPE_P(zv) == IS_INDIRECT) {
+ zv = Z_INDIRECT_P(zv);
+ }
+ ref = Z_COUNTED_P(zv);
GC_REFCOUNT(ref)++;
goto tail_call;
}
{
HashTable *ht = NULL;
Bucket *p, *end;
+ zval *zv;
tail_call:
if (root ||
if (!ht->nNumUsed) return;
p = ht->arData;
end = p + ht->nNumUsed;
- while (!Z_REFCOUNTED((--end)->val)) {
+ while (1) {
+ end--;
+ zv = &end->val;
+ if (Z_TYPE_P(zv) == IS_INDIRECT) {
+ zv = Z_INDIRECT_P(zv);
+ }
+ if (Z_REFCOUNTED_P(zv)) {
+ break;
+ }
if (p == end) return;
}
while (p != end) {
- if (Z_REFCOUNTED(p->val)) {
- ref = Z_COUNTED(p->val);
+ zv = &p->val;
+ if (Z_TYPE_P(zv) == IS_INDIRECT) {
+ zv = Z_INDIRECT_P(zv);
+ }
+ if (Z_REFCOUNTED_P(zv)) {
+ ref = Z_COUNTED_P(zv);
gc_remove_nested_data_from_buffer(ref, NULL);
}
p++;
}
- ref = Z_COUNTED(p->val);
+ zv = &p->val;
+ if (Z_TYPE_P(zv) == IS_INDIRECT) {
+ zv = Z_INDIRECT_P(zv);
+ }
+ ref = Z_COUNTED_P(zv);
goto tail_call;
}
}