summaryrefslogtreecommitdiff
path: root/Zend/zend_generators.c
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2012-05-26 17:53:13 +0200
committerNikita Popov <nikic@php.net>2012-05-26 17:53:13 +0200
commitf627be52540738e124da7cb1566d7f60a2b6a48b (patch)
treeb97b7e68748e41439e94ff029b634c12205c576b /Zend/zend_generators.c
parentececcbce0e37a306afc1a039f52188b6c243fecc (diff)
downloadphp-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.c45
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);
}
/* }}} */