summaryrefslogtreecommitdiff
path: root/Zend/zend_generators.h
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2012-08-25 17:40:08 +0200
committerNikita Popov <nikic@php.net>2012-08-25 17:40:08 +0200
commitf53225a99ebae56c7a20d6e3ad4efe6772dda3f9 (patch)
tree8b77248bca9fb041abb14947a77fb4eada624783 /Zend/zend_generators.h
parent4d8edda341efef1901365f10213c027e745ac7ab (diff)
downloadphp-git-f53225a99ebae56c7a20d6e3ad4efe6772dda3f9.tar.gz
Fix several issues and allow rewind only at/before first yield
* Trying to resume a generator while it is already running now throws a fatal error. * Trying to use yield in finally while the generator is being force-closed (by GC) throws a fatal error. * Rewinding after the first yield now throws an Exception
Diffstat (limited to 'Zend/zend_generators.h')
-rw-r--r--Zend/zend_generators.h11
1 files changed, 8 insertions, 3 deletions
diff --git a/Zend/zend_generators.h b/Zend/zend_generators.h
index 37ffbbd6cc..e47b7ad885 100644
--- a/Zend/zend_generators.h
+++ b/Zend/zend_generators.h
@@ -22,6 +22,8 @@
#define ZEND_GENERATORS_H
BEGIN_EXTERN_C()
+extern ZEND_API zend_class_entry *zend_ce_generator;
+END_EXTERN_C()
typedef struct _zend_generator {
zend_object std;
@@ -46,17 +48,20 @@ typedef struct _zend_generator {
temp_variable *send_target;
/* Largest used integer key for auto-incrementing keys */
long largest_used_integer_key;
+
+ /* ZEND_GENERATOR_* flags */
+ zend_uchar flags;
} zend_generator;
-extern ZEND_API zend_class_entry *zend_ce_generator;
+static const zend_uchar ZEND_GENERATOR_CURRENTLY_RUNNING = 0x1;
+static const zend_uchar ZEND_GENERATOR_FORCED_CLOSE = 0x2;
+static const zend_uchar ZEND_GENERATOR_AT_FIRST_YIELD = 0x4;
void zend_register_generator_ce(TSRMLS_D);
zval *zend_generator_create_zval(zend_op_array *op_array TSRMLS_DC);
void zend_generator_close(zend_generator *generator, zend_bool finished_execution TSRMLS_DC);
void zend_generator_resume(zend_generator *generator TSRMLS_DC);
-END_EXTERN_C()
-
#endif
/*