Bug #48052 [Com]: SPLStack::setIteratorMode() throw exception on keep/delete flag
Edit report at https://bugs.php.net/bug.php?id=48052&edit=1
ID: 48052
Comment by: claudio at z-files dot de
Reported by: ralph at smashlabs dot com
Summary: SPLStack::setIteratorMode() throw exception on
keep/delete flag
Status: Not a bug
Type: Bug
Package: SPL related
Operating System: *
PHP Version: 5.3, 6CVS (2009-04-25)
Assigned To: colder
Block user comment: N
Private report: N
New Comment:
While SplStack throws an exception on setting the keep/delete flag, SplQueue is fine with those
changes. They both do have a different behaviour for setIteratorMode().
Previous Comments:
------------------------------------------------------------------------
[2009-05-06 15:29:50] ralph at smashlabs dot com
Thats fine, and that works.
I guess this needs to be documented inside of setIteratorMode(), I would have never guessed that
flags are replaced, my initial assumption would be that they are OR'd with the existing flags.
Thanks for clearing this up.
-ralph
------------------------------------------------------------------------
[2009-05-02 13:29:36] colder@php.net
The reason is that setIteratorMode replaces the iterator flags entirely, so you need to specify the
order of iteration as well if you want to change the KEEP/DELETE.
Since you use a stack, simply use:
SplDoublyLinkedList:: IT_MODE_DELETE | SplDoublyLinkedList::IT_MODE_LIFO
------------------------------------------------------------------------
[2009-04-22 16:50:24] ralph at smashlabs dot com
Description:
------------
Attempting to change the IteratorMode throws an exception.
The is probably due to the code that changes the LIFO/FIFO ordering that is also settable via the
inherited method of SplDoublyLinkedList::setIteratorMode().
Reproduce code:
---------------
<?php
$s = new SPLStack();
$s->setIteratorMode(SplDoublyLinkedList::IT_MODE_DELETE);
Expected result:
----------------
Do not throw exception on the following use cases:
->setIteratorMode(SplDoublyLinkedList::IT_MODE_DELETE)
->setIteratorMode(SplDoublyLinkedList::IT_MODE_KEEP)
Actual result:
--------------
PHP Fatal error: Uncaught exception 'RuntimeException' with message 'Iterators'
LIFO/FIFO modes for SplStack/SplQueue objects are frozen' in path/to/test-splstack.php:4
Stack trace:
#0 path/to/test-splstack.php(4): SplDoublyLinkedList->setIteratorMode(1)
#1 {main}
thrown in path/to/test-splstack.php on line 4
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=48052&edit=1
Thread (5 messages)