From f627be52540738e124da7cb1566d7f60a2b6a48b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 26 May 2012 17:53:13 +0200 Subject: Add support for executing a zend_execute_data This adds another function execute_ex(), which accepts a zend_execute_data struct to run (contrary to execute(), which accepts a zend_op_array from which it initialized the execute_data). This needs a bit more cleanup. --- Zend/zend_generators.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'Zend/zend_generators.c') diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index 00af65538a..de1271fdf1 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -86,13 +86,34 @@ static zend_function *zend_generator_get_constructor(zval *object TSRMLS_DC) /* } /* }}} */ +static void zend_generator_resume(zend_generator *generator TSRMLS_DC) /* {{{ */ +{ + generator->execute_data->opline++; + execute_ex(generator->execute_data TSRMLS_CC); +} +/* }}} */ + +static void zend_generator_ensure_initialized(zend_generator *generator TSRMLS_DC) /* {{{ */ +{ + if (!generator->value) { + zend_generator_resume(generator TSRMLS_CC); + } +} +/* }}} */ + /* {{{ proto void Generator::rewind() * Rewind the generator */ ZEND_METHOD(Generator, rewind) { + zend_generator *generator; + if (zend_parse_parameters_none() == FAILURE) { return; } + + generator = (zend_generator *) zend_object_store_get_object(getThis() TSRMLS_CC); + + zend_generator_ensure_initialized(generator TSRMLS_CC); } /* }}} */ @@ -100,9 +121,15 @@ ZEND_METHOD(Generator, rewind) * Check whether the generator is valid */ ZEND_METHOD(Generator, valid) { + zend_generator *generator; + if (zend_parse_parameters_none() == FAILURE) { return; } + + generator = (zend_generator *) zend_object_store_get_object(getThis() TSRMLS_CC); + + zend_generator_ensure_initialized(generator TSRMLS_CC); } /* }}} */ @@ -110,9 +137,15 @@ ZEND_METHOD(Generator, valid) * Get the current value */ ZEND_METHOD(Generator, current) { + zend_generator *generator; + if (zend_parse_parameters_none() == FAILURE) { return; } + + generator = (zend_generator *) zend_object_store_get_object(getThis() TSRMLS_CC); + + zend_generator_ensure_initialized(generator TSRMLS_CC); } /* }}} */ @@ -120,9 +153,15 @@ ZEND_METHOD(Generator, current) * Get the current key */ ZEND_METHOD(Generator, key) { + zend_generator *generator; + if (zend_parse_parameters_none() == FAILURE) { return; } + + generator = (zend_generator *) zend_object_store_get_object(getThis() TSRMLS_CC); + + zend_generator_ensure_initialized(generator TSRMLS_CC); } /* }}} */ @@ -130,9 +169,15 @@ ZEND_METHOD(Generator, key) * Advances the generator */ ZEND_METHOD(Generator, next) { + zend_generator *generator; + if (zend_parse_parameters_none() == FAILURE) { return; } + + generator = (zend_generator *) zend_object_store_get_object(getThis() TSRMLS_CC); + + zend_generator_ensure_initialized(generator TSRMLS_CC); } /* }}} */ -- cgit v1.2.1