summaryrefslogtreecommitdiff
path: root/Zend/zend_generators.h
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_generators.h')
-rw-r--r--Zend/zend_generators.h29
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()