diff options
-rw-r--r-- | Zend/tests/gc_042.phpt | 28 | ||||
-rw-r--r-- | Zend/zend_gc.c | 4 |
2 files changed, 32 insertions, 0 deletions
diff --git a/Zend/tests/gc_042.phpt b/Zend/tests/gc_042.phpt new file mode 100644 index 0000000000..c8dfc0ef86 --- /dev/null +++ b/Zend/tests/gc_042.phpt @@ -0,0 +1,28 @@ +--TEST-- +Object properties HT may need to be removed from nested data +--FILE-- +<?php + +class Test { + public function __destruct() { + $GLOBALS['x'] = $this; + } +} + +$t = new Test; +$t->x = new stdClass; +$t->x->t = $t; +$a = (array) $t->x; +unset($t, $a); +gc_collect_cycles(); +var_dump($x); + +?> +--EXPECT-- +object(Test)#1 (1) { + ["x"]=> + object(stdClass)#2 (1) { + ["t"]=> + *RECURSION* + } +} diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c index 60e128ef19..b74a8e79b9 100644 --- a/Zend/zend_gc.c +++ b/Zend/zend_gc.c @@ -1379,6 +1379,10 @@ tail_call: ref = Z_COUNTED_P(zv); goto tail_call; } + if (GC_REF_ADDRESS(ht) != 0 && GC_REF_CHECK_COLOR(ht, GC_BLACK)) { + GC_TRACE_REF(ht, "removing from buffer"); + GC_REMOVE_FROM_BUFFER(ht); + } } else { return count; } |