]> granicus.if.org Git - php/commitdiff
Fixed bug #78412
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 14 Aug 2019 15:48:57 +0000 (17:48 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 14 Aug 2019 15:50:58 +0000 (17:50 +0200)
$this should only be included in the generator GC buffer, if it
will be released on destruction.

NEWS
Zend/zend_generators.c

diff --git a/NEWS b/NEWS
index 723be17c71b9a102e2312949f52c649b5ca782f5..8ad64104fb37d81ca7335fdac77e0d0f8552b9fd 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,10 @@ PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? 2019, PHP 7.2.23
 
+- Core:
+  . Fixed bug #78412 (Generator incorrectly reports non-releasable $this as GC
+    child). (Nikita)
+
 29 Aug 2019, PHP 7.2.22
 
 - Core:
index 666a12fdebdc366cb80f11634178481187b20a80..042ddbc1784bf54af287aba4072ca73b7adc0a85 100644 (file)
@@ -271,7 +271,7 @@ static uint32_t calc_gc_buffer_size(zend_generator *generator) /* {{{ */
                if (EX_CALL_INFO() & ZEND_CALL_FREE_EXTRA_ARGS) {
                        size += EX_NUM_ARGS() - op_array->num_args;
                }
-               size += Z_TYPE(execute_data->This) == IS_OBJECT; /* $this */
+               size += (EX_CALL_INFO() & ZEND_CALL_RELEASE_THIS) != 0; /* $this */
                size += (EX_CALL_INFO() & ZEND_CALL_CLOSURE) != 0; /* Closure object */
 
                /* Live vars */
@@ -352,7 +352,7 @@ static HashTable *zend_generator_get_gc(zval *object, zval **table, int *n) /* {
                }
        }
 
-       if (Z_TYPE(execute_data->This) == IS_OBJECT) {
+       if (EX_CALL_INFO() & ZEND_CALL_RELEASE_THIS) {
                ZVAL_OBJ(gc_buffer++, Z_OBJ(execute_data->This));
        }
        if (EX_CALL_INFO() & ZEND_CALL_CLOSURE) {