diff options
| author | Nikita Popov <nikic@php.net> | 2012-07-26 17:07:24 +0200 |
|---|---|---|
| committer | Nikita Popov <nikic@php.net> | 2012-07-26 17:13:25 +0200 |
| commit | 268740d9848d435054ce73a8cfe36b2b732cd1f7 (patch) | |
| tree | 6bc93aa64f5e913f660fa652cb0ae75c9e16ad0a /Zend | |
| parent | 99f93dd9a846e3d615ec61c734aca2e7ee256600 (diff) | |
| download | php-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')
| -rw-r--r-- | Zend/tests/generators/generator_in_multipleiterator.phpt | 37 | ||||
| -rw-r--r-- | Zend/zend_generators.c | 4 |
2 files changed, 40 insertions, 1 deletions
diff --git a/Zend/tests/generators/generator_in_multipleiterator.phpt b/Zend/tests/generators/generator_in_multipleiterator.phpt new file mode 100644 index 0000000000..611dbc9652 --- /dev/null +++ b/Zend/tests/generators/generator_in_multipleiterator.phpt @@ -0,0 +1,37 @@ +--TEST-- +Generators work properly in MultipleIterator +--FILE-- +<?php + +function gen1() { + yield 'a'; + yield 'aa'; +} + +function gen2() { + yield 'b'; + yield 'bb'; +} + +$it = new MultipleIterator; +$it->attachIterator(gen1()); +$it->attachIterator(gen2()); + +foreach ($it as $values) { + var_dump($values); +} + +?> +--EXPECT-- +array(2) { + [0]=> + string(1) "a" + [1]=> + string(1) "b" +} +array(2) { + [0]=> + string(2) "aa" + [1]=> + string(2) "bb" +} 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; |
