com php-src: Merge branch 'PHP-7.0': Zend/zend_generators.c
| From: | Bob Weinand | Date: | Mon, 15 Feb 2016 21:43:58 +0000 |
| Subject: | com php-src: Merge branch 'PHP-7.0': Zend/zend_generators.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-91061@lists.php.net to get a copy of this message | ||
Commit: 77ca527c91a253c00850ea4bab242af25fd71df5
Author: Bob Weinand <bobwei9@hotmail.com> Mon, 15 Feb 2016 22:43:58 +0100
Parents: 492711289faaf94cc61d286cef4fbec64861dc59 23b770f31fdf893239a185bdb36876c5438eb813
Branches: master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=77ca527c91a253c00850ea4bab242af25fd71df5
Log:
Merge branch 'PHP-7.0'
Changed paths:
MM Zend/zend_generators..c
Diff:
diff --cc Zend/zend_generators.c
index 1c798cc,646e46b...9633fc4
--- a/Zend/zend_generators.c
+++ b/Zend/zend_generators.c
@@@ -228,65 -193,9 +230,65 @@@ static uint32_t calc_gc_buffer_size(zen
static HashTable *zend_generator_get_gc(zval *object, zval **table, int *n) /* {{{ */
{
zend_generator *generator = (zend_generator*) Z_OBJ_P(object);
- *table = &generator->value;
- *n = 3;
- return NULL;
+ zend_execute_data *execute_data = generator->execute_data;
+ zend_op_array *op_array;
+ zval *gc_buffer;
+ uint32_t gc_buffer_size;
+
+ if (!execute_data) {
+ /* If the generator has been closed, it can only hold on to three values: The value, key
+ * and retval. These three zvals are stored sequentially starting at &generator->value.
*/
+ *table = &generator->value;
+ *n = 3;
+ return NULL;
+ }
+
+ op_array = &EX(func)->op_array;
+ gc_buffer_size = calc_gc_buffer_size(generator);
+ if (generator->gc_buffer_size < gc_buffer_size) {
+ generator->gc_buffer = safe_erealloc(generator->gc_buffer, sizeof(zval), gc_buffer_size,
0);
+ generator->gc_buffer_size = gc_buffer_size;
+ }
+
+ *n = gc_buffer_size;
+ *table = gc_buffer = generator->gc_buffer;
+
+ ZVAL_COPY_VALUE(gc_buffer++, &generator->value);
+ ZVAL_COPY_VALUE(gc_buffer++, &generator->key);
+ ZVAL_COPY_VALUE(gc_buffer++, &generator->retval);
+ ZVAL_COPY_VALUE(gc_buffer++, &generator->values);
+
+ if (!execute_data->symbol_table) {
+ uint32_t i, num_cvs = EX(func)->op_array.last_var;
+ for (i = 0; i < num_cvs; i++) {
+ ZVAL_COPY_VALUE(gc_buffer++, EX_VAR_NUM(i));
+ }
+ }
+
+ if (EX_CALL_INFO() & ZEND_CALL_FREE_EXTRA_ARGS) {
+ zval *zv = EX_VAR_NUM(op_array->last_var + op_array->T);
+ zval *end = zv + (EX_NUM_ARGS() - op_array->num_args);
+ while (zv != end) {
+ ZVAL_COPY_VALUE(gc_buffer++, zv++);
+ }
+ }
+
+ if (Z_OBJ(execute_data->This)) {
+ ZVAL_OBJ(gc_buffer++, Z_OBJ(execute_data->This));
+ }
+ if (EX_CALL_INFO() & ZEND_CALL_CLOSURE) {
+ ZVAL_OBJ(gc_buffer++, (zend_object *) EX(func)->common.prototype);
+ }
+
+ if (generator->node.children == 0) {
- zend_generator *root = generator->node.ptr.root;
- while (root != generator) {
- ZVAL_OBJ(gc_buffer++, &root->std);
- root = zend_generator_get_child(&root->node, generator);
++ zend_generator *child = generator, *root = generator->node.ptr.root;
++ while (root != child) {
++ ZVAL_OBJ(gc_buffer++, &child->std);
++ child = child->node.parent;
+ }
+ }
+
+ return execute_data->symbol_table;
}
/* }}} */