]> granicus.if.org Git - php/commit
Simplify and fix generator tree management
authorNikita Popov <nikita.ppv@gmail.com>
Thu, 15 Oct 2020 14:42:59 +0000 (16:42 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 22 Oct 2020 08:25:25 +0000 (10:25 +0200)
commitdd4a080133b7b0570b629cdfb7c9e2651bdf88f7
treeb4b8ed5ca117f0870d86d0e6eb2e2c0ef770e915
parentac87880addfd22e651b210346178dc1ed851b1dd
Simplify and fix generator tree management

This makes a number of related changes to the generator tree
management, that should hopefully make it easier to understand,
more robust and faster for the common linear-chain case. Fixes
https://bugs.php.net/bug.php?id=80240, which was the original
motivation here.

 * Generators now only add a ref to their direct parent.
 * Nodes only store their children, not their leafs, which avoids
   any need for leaf updating. This means it's no longer possible
   to fetch the child for a certain leaf, which is something we
   only needed in one place (update_current). If multi-children
   nodes are involved, this will require doing a walk in the other
   direction (from leaf to root). It does not affect the common
   case of single-child nodes.
 * The root/leaf pointers are now seen as a pair. One leaf generator
   can point to the current root. If a different leaf generator is
   used, we'll move the root pointer over to that one. Again, this
   is a cache to make the common linear chain case fast, trees may
   need to scan up the parent link.

Closes GH-6344.
Zend/tests/generators/backtrace_multi_yield_from.phpt [new file with mode: 0644]
Zend/tests/generators/bug80240.phpt [new file with mode: 0644]
Zend/tests/generators/yield_from_chain_dtor_order.phpt [new file with mode: 0644]
Zend/zend_generators.c
Zend/zend_generators.h