diff options
Diffstat (limited to 'Zend/zend_gc.c')
-rw-r--r-- | Zend/zend_gc.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c index d1fcbf00ca..b6510153f0 100644 --- a/Zend/zend_gc.c +++ b/Zend/zend_gc.c @@ -1350,16 +1350,24 @@ static void gc_remove_nested_data_from_buffer(zend_refcounted *ref, gc_root_buff zval *zv; tail_call: - if (root || - (GC_REF_ADDRESS(ref) != 0 && - GC_REF_CHECK_COLOR(ref, GC_BLACK))) { - GC_TRACE_REF(ref, "removing from buffer"); + do { if (root) { + GC_TRACE_REF(ref, "removing from buffer"); gc_remove_from_roots(root); GC_REF_SET_INFO(ref, 0); root = NULL; - } else { + } else if (GC_REF_ADDRESS(ref) != 0 + && GC_REF_CHECK_COLOR(ref, GC_BLACK)) { + GC_TRACE_REF(ref, "removing from buffer"); GC_REMOVE_FROM_BUFFER(ref); + } else if (GC_TYPE(ref) == IS_REFERENCE) { + if (Z_REFCOUNTED(((zend_reference*)ref)->val)) { + ref = Z_COUNTED(((zend_reference*)ref)->val); + goto tail_call; + } + return; + } else { + return; } if (GC_TYPE(ref) == IS_OBJECT) { @@ -1397,12 +1405,6 @@ tail_call: } } else if (GC_TYPE(ref) == IS_ARRAY) { ht = (zend_array*)ref; - } else if (GC_TYPE(ref) == IS_REFERENCE) { - if (Z_REFCOUNTED(((zend_reference*)ref)->val)) { - ref = Z_COUNTED(((zend_reference*)ref)->val); - goto tail_call; - } - return; } else { return; } @@ -1438,7 +1440,7 @@ tail_call: } ref = Z_COUNTED_P(zv); goto tail_call; - } + } while (0); } ZEND_API int zend_gc_collect_cycles(void) |