diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-08-26 17:50:46 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-08-26 17:52:37 +0200 |
commit | 461db524001fbcbd3344a08651f3a64c775967d6 (patch) | |
tree | e8cfa01ec058a2e60218991e12b267026a7fa1cc | |
parent | e4ecadcb626d00feb5df17d66a43cabc0b440560 (diff) | |
parent | 589542f50cbaf2bfc88aea79092df9db54f75ac6 (diff) | |
download | php-git-461db524001fbcbd3344a08651f3a64c775967d6.tar.gz |
Merge branch 'PHP-7.2' into PHP-7.3
-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 b6510153f0..3a36a8cc0d 100644 --- a/Zend/zend_gc.c +++ b/Zend/zend_gc.c @@ -1400,6 +1400,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; } |