Commit: 1a99d1c8874936f7e232840a580d7bc588d63a6c Author: Nikita Popov <ni...@php.net> Sat, 26 May 2012 19:40:29 +0200 Parents: f627be52540738e124da7cb1566d7f60a2b6a48b Branches: master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=1a99d1c8874936f7e232840a580d7bc588d63a6c Log: Add way to pass generator object to opcode handlers The generator zval is put into the return_value_ptr_ptr. Changed paths: M Zend/zend_generators.c Diff: diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index de1271f..1ea910b 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -86,17 +86,23 @@ static zend_function *zend_generator_get_constructor(zval *object TSRMLS_DC) /* } /* }}} */ -static void zend_generator_resume(zend_generator *generator TSRMLS_DC) /* {{{ */ +static void zend_generator_resume(zval *object, zend_generator *generator TSRMLS_DC) /* {{{ */ { + /* Go to next opcode (we don't want to run the last one again) */ generator->execute_data->opline++; + + /* We (mis) use the return_value_ptr_ptr to provide the generator object + * to the executor. This way YIELD will be able to set the yielded value */ + EG(return_value_ptr_ptr) = &object; + execute_ex(generator->execute_data TSRMLS_CC); } /* }}} */ -static void zend_generator_ensure_initialized(zend_generator *generator TSRMLS_DC) /* {{{ */ +static void zend_generator_ensure_initialized(zval *object, zend_generator *generator TSRMLS_DC) /* {{{ */ { if (!generator->value) { - zend_generator_resume(generator TSRMLS_CC); + zend_generator_resume(object, generator TSRMLS_CC); } } /* }}} */ @@ -105,15 +111,17 @@ static void zend_generator_ensure_initialized(zend_generator *generator TSRMLS_D * Rewind the generator */ ZEND_METHOD(Generator, rewind) { + zval *object; zend_generator *generator; if (zend_parse_parameters_none() == FAILURE) { return; } - generator = (zend_generator *) zend_object_store_get_object(getThis() TSRMLS_CC); + object = getThis(); + generator = (zend_generator *) zend_object_store_get_object(object TSRMLS_CC); - zend_generator_ensure_initialized(generator TSRMLS_CC); + zend_generator_ensure_initialized(object, generator TSRMLS_CC); } /* }}} */ @@ -121,15 +129,17 @@ ZEND_METHOD(Generator, rewind) * Check whether the generator is valid */ ZEND_METHOD(Generator, valid) { + zval *object; zend_generator *generator; if (zend_parse_parameters_none() == FAILURE) { return; } - generator = (zend_generator *) zend_object_store_get_object(getThis() TSRMLS_CC); + object = getThis(); + generator = (zend_generator *) zend_object_store_get_object(object TSRMLS_CC); - zend_generator_ensure_initialized(generator TSRMLS_CC); + zend_generator_ensure_initialized(object, generator TSRMLS_CC); } /* }}} */ @@ -137,15 +147,17 @@ ZEND_METHOD(Generator, valid) * Get the current value */ ZEND_METHOD(Generator, current) { + zval *object; zend_generator *generator; if (zend_parse_parameters_none() == FAILURE) { return; } - generator = (zend_generator *) zend_object_store_get_object(getThis() TSRMLS_CC); + object = getThis(); + generator = (zend_generator *) zend_object_store_get_object(object TSRMLS_CC); - zend_generator_ensure_initialized(generator TSRMLS_CC); + zend_generator_ensure_initialized(object, generator TSRMLS_CC); } /* }}} */ @@ -153,15 +165,17 @@ ZEND_METHOD(Generator, current) * Get the current key */ ZEND_METHOD(Generator, key) { + zval *object; zend_generator *generator; if (zend_parse_parameters_none() == FAILURE) { return; } - generator = (zend_generator *) zend_object_store_get_object(getThis() TSRMLS_CC); + object = getThis(); + generator = (zend_generator *) zend_object_store_get_object(object TSRMLS_CC); - zend_generator_ensure_initialized(generator TSRMLS_CC); + zend_generator_ensure_initialized(object, generator TSRMLS_CC); } /* }}} */ @@ -169,15 +183,16 @@ ZEND_METHOD(Generator, key) * Advances the generator */ ZEND_METHOD(Generator, next) { + zval *object; zend_generator *generator; if (zend_parse_parameters_none() == FAILURE) { return; } - generator = (zend_generator *) zend_object_store_get_object(getThis() TSRMLS_CC); + generator = (zend_generator *) zend_object_store_get_object(object TSRMLS_CC); - zend_generator_ensure_initialized(generator TSRMLS_CC); + zend_generator_ensure_initialized(object, generator TSRMLS_CC); } /* }}} */ -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php