ID:               49723
 Updated by:       ka...@php.net
 Reported By:      goetas at lignano dot it
 Status:           Assigned
 Bug Type:         SPL related
 Operating System: *
 PHP Version:      5.3.0
 Assigned To:      colder
 New Comment:

The implementation you are looking at (defined in the php files) is an
outdated illustration to show how the iterator is implemented, check
out:
spl_limit_it_seek() inside php-src/ext/spl/spl_iterators.c for the
actual implementation.

As for whether this is a bug or not, sounds expected behaviour to me
that when trying to loop over an empty range it would cause an
OutOfRangeException, rather check the iterator size before trying to
loop.


Previous Comments:
------------------------------------------------------------------------

[2009-10-02 18:29:05] goetas at lignano dot it

source code of LimitIterator, "seek" method at line 63:

if ($this->it instanceof SeekableIterator) {
   $this->it->seek($position);  <-- there is no check if i can move
pointer to $position like  on else branch
   $this->pos = $position;
} else {
  while($this->pos < $position && $this->it->valid()) {  <-- valid()
ensures that i can move to $position 
    $this->next();
  }
}

------------------------------------------------------------------------

[2009-10-02 18:23:57] goetas at lignano dot it

the problem is not resolved  with php 5.3.2-dev on my apache2/winxp

------------------------------------------------------------------------

[2009-10-01 16:09:43] j...@php.net

Please try using this snapshot:

  http://snaps.php.net/php5.3-latest.tar.gz
 
For Windows:

  http://windows.php.net/snapshots/



------------------------------------------------------------------------

[2009-09-30 13:48:01] goetas at lignano dot it

Description:
------------
iterating over an empty seekable iterator causes an unexpected
exception.

with actual implementation of LimitIterator::rewind() there is  no way
to do  an empty loop over an empty ArrayIterator.


i suggest this implementation for  LimitIterator::rewind() method
function rewind(){
  $this->it->rewind();
  $this->pos = 0;
  if($this->it->valid()){ // check for empty iterators
      $this->seek($this->offset);
  }
}

Reproduce code:
---------------
$it = new ArrayIterator(array());

$limIt = new LimitIterator($it, 0, 5);
foreach ($limIt as $item){
        echo $item;
}

Expected result:
----------------
an empty loop

Actual result:
--------------
Uncaught exception 'OutOfBoundsException' with message 'Seek position 0
is out of range'


------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=49723&edit=1

Reply via email to