diff options
| author | Nikita Popov <nikic@php.net> | 2012-05-26 17:53:13 +0200 |
|---|---|---|
| committer | Nikita Popov <nikic@php.net> | 2012-05-26 17:53:13 +0200 |
| commit | f627be52540738e124da7cb1566d7f60a2b6a48b (patch) | |
| tree | b97b7e68748e41439e94ff029b634c12205c576b /Zend/zend_generators.c | |
| parent | ececcbce0e37a306afc1a039f52188b6c243fecc (diff) | |
| download | php-git-f627be52540738e124da7cb1566d7f60a2b6a48b.tar.gz | |
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.
Diffstat (limited to 'Zend/zend_generators.c')
| -rw-r--r-- | Zend/zend_generators.c | 45 |
1 files changed, 45 insertions, 0 deletions
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); } /* }}} */ |
