From 60158e16f1df308ae95572a3ef57bc81ccdb88be Mon Sep 17 00:00:00 2001 From: fabien Date: Sun, 8 Nov 2009 08:22:36 +0000 Subject: [PATCH] made a optimization when a loop iterator also implements Countable git-svn-id: http://svn.twig-project.org/trunk@120 93ef8e89-cb99-4229-a87c-7fa0fa45744b --- lib/Twig/runtime.php | 2 +- test/fixtures/tags/for/objects.test | 12 ++++++++ test/fixtures/tags/for/objects_countable.test | 35 +++++++++++++++++++++++++ test/unit/integrationTest.php | 2 +- 4 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/tags/for/objects_countable.test diff --git a/lib/Twig/runtime.php b/lib/Twig/runtime.php index f9a06f9..3eaab71 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 e812eb6..5e328ca 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 0000000..ef88b5e --- /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 688b6d8..43785b4 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) -- 1.7.2.5