diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-08-26 17:52:56 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-08-26 17:52:56 +0200 |
commit | fa8565a0f1d8276f478eb0bd495e535828ff124c (patch) | |
tree | 041ef34ead9af92a04a9bb0c1e6e83868cc3dc1d | |
parent | e2b49d6c45f0c5ed69268d32da2f4972265db663 (diff) | |
parent | 461db524001fbcbd3344a08651f3a64c775967d6 (diff) | |
download | php-git-fa8565a0f1d8276f478eb0bd495e535828ff124c.tar.gz |
Merge branch 'PHP-7.3' into PHP-7.4
-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; } |