Bug #48052 [Com]: SPLStack::setIteratorMode() throw exception on keep/delete flag

From: Date: Mon, 09 Jul 2018 20:55:16 +0000
Subject: Bug #48052 [Com]: SPLStack::setIteratorMode() throw exception on keep/delete flag
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-216247@lists.php.net to get a copy of this message
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)

« previous php.bugs (#216247) next »