]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.2' into PHP-7.3
authorNikita Popov <nikita.ppv@gmail.com>
Mon, 26 Aug 2019 15:50:46 +0000 (17:50 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 26 Aug 2019 15:52:37 +0000 (17:52 +0200)
1  2 
Zend/tests/gc_042.phpt
Zend/zend_gc.c

index 0000000000000000000000000000000000000000,a7c40fe1ffa2435bd815bfd0a593cf7801f76427..c8dfc0ef861002e25941ac513e7ac9a799d5b71b
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,26 +1,28 @@@
 -// TODO: The destructor *should* be running here, but doesn't.
 -// This works in PHP >= 7.3 though.
 -
+ --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);
 ---EXPECTF--
 -Notice: Undefined variable: x in %s on line %d
 -NULL
+ ?>
++--EXPECT--
++object(Test)#1 (1) {
++  ["x"]=>
++  object(stdClass)#2 (1) {
++    ["t"]=>
++    *RECURSION*
++  }
++}
diff --cc Zend/zend_gc.c
index b6510153f096a245b71018105a8f8bb733834526,1b6d53a83d97b9a3893fd6e0d25ba1f36d14544a..3a36a8cc0d7a915e6fa5fcc3a35488c1bb824451
@@@ -1400,6 -1007,10 +1400,10 @@@ tail_call
                                        ref = Z_COUNTED_P(zv);
                                        goto tail_call;
                                }
 -                              if (GC_ADDRESS(GC_INFO(ht)) != 0 && GC_REF_GET_COLOR(ht) == GC_BLACK) {
++                              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;
                        }