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.
This commit is contained in:
Nikita Popov 2012-05-26 17:53:13 +02:00
parent ececcbce0e
commit f627be5254
6 changed files with 132 additions and 68 deletions

View file

@ -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);
}
/* }}} */