]> granicus.if.org Git - php/commitdiff
Fix #49723 (Skip seek when unnecessary)
authorEtienne Kneuss <colder@php.net>
Tue, 27 Apr 2010 04:57:48 +0000 (04:57 +0000)
committerEtienne Kneuss <colder@php.net>
Tue, 27 Apr 2010 04:57:48 +0000 (04:57 +0000)
ext/spl/spl_iterators.c
ext/spl/tests/bug49723.phpt [new file with mode: 0644]

index 0b0acc3e7824461ff60f41b6f5b87b6756c50cb2..199adf65fa9b40f8633ccce8668d1e9b348050eb 100755 (executable)
@@ -2080,7 +2080,7 @@ static inline void spl_limit_it_seek(spl_dual_it_object *intern, long pos TSRMLS
                zend_throw_exception_ex(spl_ce_OutOfBoundsException, 0 TSRMLS_CC, "Cannot seek to %ld which is behind offset %ld plus count %ld", pos, intern->u.limit.offset, intern->u.limit.count);
                return;
        }
-       if (instanceof_function(intern->inner.ce, spl_ce_SeekableIterator TSRMLS_CC)) {
+       if (pos != intern->current.pos && instanceof_function(intern->inner.ce, spl_ce_SeekableIterator TSRMLS_CC)) {
                MAKE_STD_ZVAL(zpos);
                ZVAL_LONG(zpos, pos);
                spl_dual_it_free(intern TSRMLS_CC);
diff --git a/ext/spl/tests/bug49723.phpt b/ext/spl/tests/bug49723.phpt
new file mode 100644 (file)
index 0000000..221e806
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+LimitIterator: do not seek if not needed 
+--FILE--
+<?php
+
+$it = new ArrayIterator(array());
+
+$lit = new LimitIterator($it, 0, 5);
+
+foreach ($lit as $v) {
+    echo $v;
+}
+?>
+===DONE===
+--EXPECT--
+===DONE===