diff options
| author | Bob Weinand <bobwei9@hotmail.com> | 2015-09-20 02:19:31 +0200 |
|---|---|---|
| committer | Bob Weinand <bobwei9@hotmail.com> | 2015-09-20 02:19:31 +0200 |
| commit | 14af0f6dcb83dd8c33b771c34163357f934ec9b8 (patch) | |
| tree | 3bfff69e4e7feb99e102f6a450619cde49c5fa1e /Zend/zend_generators.h | |
| parent | e878dff5d866f3e004153c34e83d87d6801bc1b8 (diff) | |
| download | php-git-14af0f6dcb83dd8c33b771c34163357f934ec9b8.tar.gz | |
Set expectations in generator handling
Diffstat (limited to 'Zend/zend_generators.h')
| -rw-r--r-- | Zend/zend_generators.h | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/Zend/zend_generators.h b/Zend/zend_generators.h index 3b41ec9fb1..7ab9c5e0b6 100644 --- a/Zend/zend_generators.h +++ b/Zend/zend_generators.h @@ -104,9 +104,30 @@ ZEND_API void zend_generator_close(zend_generator *generator, zend_bool finished ZEND_API void zend_generator_resume(zend_generator *generator); void zend_generator_yield_from(zend_generator *generator, zend_generator *from); -ZEND_API zend_generator *zend_generator_get_current(zend_generator *generator); ZEND_API zend_execute_data *zend_generator_check_placeholder_frame(zend_execute_data *ptr); +ZEND_API zend_generator *zend_generator_update_current(zend_generator *generator, zend_generator *leaf); +static zend_always_inline zend_generator *zend_generator_get_current(zend_generator *generator) +{ + zend_generator *leaf; + zend_generator *root, *old_root; + + if (EXPECTED(generator->node.parent == NULL)) { + /* we're not in yield from mode */ + return generator; + } + + leaf = generator->node.children ? generator->node.ptr.leaf : generator; + root = leaf->node.ptr.root; + + if (EXPECTED(root->execute_data && root->node.parent == NULL)) { + /* generator still running */ + return root; + } + + return zend_generator_update_current(generator, leaf); +} + END_EXTERN_C() #endif |
