diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-11-18 12:44:31 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-11-18 12:45:29 +0100 |
commit | 99a8ec6e24d2788bb533ab5be8618a958adf24cf (patch) | |
tree | fc9424f45d66014b80d65b1eabee83d09956ea6a /Zend/zend_generators.c | |
parent | 79a606bd95abcceda3da668819426ddb583f7c56 (diff) | |
download | php-git-99a8ec6e24d2788bb533ab5be8618a958adf24cf.tar.gz |
Short-circuit get_gc for currently running generator
Diffstat (limited to 'Zend/zend_generators.c')
-rw-r--r-- | Zend/zend_generators.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index 805bff38ab..3fbbd49c0a 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -340,6 +340,16 @@ static HashTable *zend_generator_get_gc(zval *object, zval **table, int *n) /* { return NULL; } + if (generator->flags & ZEND_GENERATOR_CURRENTLY_RUNNING) { + /* If the generator is currently running, we certainly won't be able to GC any values it + * holds on to. The execute_data state might be inconsistent during execution (e.g. because + * GC has been triggered in the middle of a variable reassignment), so we should not try + * to inspect it here. */ + *table = NULL; + *n = 0; + return NULL; + } + op_array = &EX(func)->op_array; gc_buffer_size = calc_gc_buffer_size(generator); if (generator->gc_buffer_size < gc_buffer_size) { |