summaryrefslogtreecommitdiff
path: root/Zend/zend_generators.c
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2012-07-26 17:07:24 +0200
committerNikita Popov <nikic@php.net>2012-07-26 17:13:25 +0200
commit268740d9848d435054ce73a8cfe36b2b732cd1f7 (patch)
tree6bc93aa64f5e913f660fa652cb0ae75c9e16ad0a /Zend/zend_generators.c
parent99f93dd9a846e3d615ec61c734aca2e7ee256600 (diff)
downloadphp-git-268740d9848d435054ce73a8cfe36b2b732cd1f7.tar.gz
Fix implementation of Iterator interface
It looks like you have to implement the Iterator interface *before* assigning get_iterator. Otherwise the structure for user iterators isn't correctly zeroed out. Additionaly I'm setting class_entry->iterator_funcs.funcs now. Not sure if this is strictly necessary, but better safe than sorry ;)
Diffstat (limited to 'Zend/zend_generators.c')
-rw-r--r--Zend/zend_generators.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c
index d7ffb3055a..716b0a782e 100644
--- a/Zend/zend_generators.c
+++ b/Zend/zend_generators.c
@@ -759,9 +759,11 @@ void zend_register_generator_ce(TSRMLS_D) /* {{{ */
zend_ce_generator = zend_register_internal_class(&ce TSRMLS_CC);
zend_ce_generator->ce_flags |= ZEND_ACC_FINAL_CLASS;
zend_ce_generator->create_object = zend_generator_create;
- zend_ce_generator->get_iterator = zend_generator_get_iterator;
+ /* get_iterator has to be assigned *after* implementing the inferface */
zend_class_implements(zend_ce_generator TSRMLS_CC, 1, zend_ce_iterator);
+ zend_ce_generator->get_iterator = zend_generator_get_iterator;
+ zend_ce_generator->iterator_funcs.funcs = &zend_generator_iterator_functions;
memcpy(&zend_generator_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
zend_generator_handlers.get_constructor = zend_generator_get_constructor;