diff options
Diffstat (limited to 'Zend/zend_generators.h')
| -rw-r--r-- | Zend/zend_generators.h | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/Zend/zend_generators.h b/Zend/zend_generators.h index abccf3a529..35ff09c99d 100644 --- a/Zend/zend_generators.h +++ b/Zend/zend_generators.h @@ -42,21 +42,21 @@ struct _zend_generator_node { union { HashTable *ht; /* if multiple children */ struct { /* if one child */ - zend_generator *leaf; + zend_generator *leaf; /* TODO: Unused, remove. */ zend_generator *child; } single; } child; + /* One generator can cache a direct pointer to the current root. + * The leaf member points back to the generator using the root cache. */ union { - zend_generator *leaf; /* if > 0 children */ - zend_generator *root; /* if 0 children */ + zend_generator *leaf; /* if parent != NULL */ + zend_generator *root; /* if parent == NULL */ } ptr; }; struct _zend_generator { zend_object std; - zend_object_iterator *iterator; - /* The suspended execution context. */ zend_execute_data *execute_data; @@ -89,9 +89,6 @@ struct _zend_generator { /* ZEND_GENERATOR_* flags */ zend_uchar flags; - - zval *gc_buffer; - uint32_t gc_buffer_size; }; static const zend_uchar ZEND_GENERATOR_CURRENTLY_RUNNING = 0x1; @@ -109,26 +106,26 @@ ZEND_API zend_execute_data* zend_generator_freeze_call_stack(zend_execute_data * void zend_generator_yield_from(zend_generator *generator, zend_generator *from); 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); +ZEND_API zend_generator *zend_generator_update_current(zend_generator *generator); +ZEND_API zend_generator *zend_generator_update_root(zend_generator *generator); static zend_always_inline zend_generator *zend_generator_get_current(zend_generator *generator) { - zend_generator *leaf; - zend_generator *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; + zend_generator *root = generator->node.ptr.root; + if (!root) { + root = zend_generator_update_root(generator); + } - if (EXPECTED(root->execute_data && root->node.parent == NULL)) { + if (EXPECTED(root->execute_data)) { /* generator still running */ return root; } - return zend_generator_update_current(generator, leaf); + return zend_generator_update_current(generator); } END_EXTERN_C() |
