diff --git a/lib/Twig/runtime.php b/lib/Twig/runtime.php index f9a06f921..3eaab7149 100644 --- a/lib/Twig/runtime.php +++ b/lib/Twig/runtime.php @@ -185,7 +185,7 @@ function twig_iterator_to_array($seq) } elseif (is_object($seq) && $seq instanceof Traversable) { - return iterator_to_array($seq); + return $seq instanceof Countable ? $seq : iterator_to_array($seq); } else { diff --git a/test/fixtures/tags/for/objects.test b/test/fixtures/tags/for/objects.test index e812eb6d1..5e328cad1 100644 --- a/test/fixtures/tags/for/objects.test +++ b/test/fixtures/tags/for/objects.test @@ -3,6 +3,10 @@ --TEMPLATE-- {% for item in items %} * {{ item }} + * {{ loop.index }}/{{ loop.index0 }} + * {{ loop.revindex }}/{{ loop.revindex0 }} + * {{ loop.first }}/{{ loop.last }}/{{ loop.length }} + {% endfor %} {% for key, value in items|items %} @@ -25,7 +29,15 @@ class ItemsIterator implements Iterator return array('items' => new ItemsIterator()) --EXPECT-- * bar + * 1/0 + * 2/1 + * 1//2 + * foo + * 2/1 + * 1/0 + * /1/2 + * foo/bar * bar/foo diff --git a/test/fixtures/tags/for/objects_countable.test b/test/fixtures/tags/for/objects_countable.test new file mode 100644 index 000000000..ef88b5e88 --- /dev/null +++ b/test/fixtures/tags/for/objects_countable.test @@ -0,0 +1,35 @@ +--TEST-- +"for" tag iterates over iterable and countable objects +--TEMPLATE-- +{% for item in items %} + * {{ item }} +{% endfor %} + +{% for key, value in items|items %} + * {{ key }}/{{ value }} +{% endfor %} + +{% for key in items|keys %} + * {{ key }} +{% endfor %} +--DATA-- +class ItemsIteratorCountable implements Iterator, Countable +{ + protected $values = array('foo' => 'bar', 'bar' => 'foo'); + public function current() { return current($this->values); } + public function key() { return key($this->values); } + public function next() { return next($this->values); } + public function rewind() { return reset($this->values); } + public function valid() { return false !== current($this->values); } + public function count() { return count($this->values); } +} +return array('items' => new ItemsIterator()) +--EXPECT-- + * bar + * foo + + * foo/bar + * bar/foo + + * foo + * bar diff --git a/test/unit/integrationTest.php b/test/unit/integrationTest.php index 688b6d874..43785b491 100644 --- a/test/unit/integrationTest.php +++ b/test/unit/integrationTest.php @@ -35,7 +35,7 @@ class Foo } } -$t = new LimeTest(50); +$t = new LimeTest(51); $fixturesDir = realpath(dirname(__FILE__).'/../fixtures/'); foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($fixturesDir), RecursiveIteratorIterator::LEAVES_ONLY) as $file)