diff options
author | Nikita Popov <nikic@php.net> | 2012-08-25 17:40:08 +0200 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2012-08-25 17:40:08 +0200 |
commit | f53225a99ebae56c7a20d6e3ad4efe6772dda3f9 (patch) | |
tree | 8b77248bca9fb041abb14947a77fb4eada624783 /Zend/zend_generators.h | |
parent | 4d8edda341efef1901365f10213c027e745ac7ab (diff) | |
download | php-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.h | 11 |
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 /* |