}
spl_ptr_llist_destroy(intern->llist TSRMLS_CC);
+ SPL_LLIST_CHECK_DELREF(intern->traverse_pointer);
zval_ptr_dtor(&intern->retval);
efree(object);
}
/* }}} */
+/* {{{ proto void SplDoublyLinkedList::prev() U
+ Move to next entry */
+SPL_METHOD(SplDoublyLinkedList, prev)
+{
+ spl_dllist_object *intern = (spl_dllist_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
+
+ spl_dllist_it_helper_move_forward(&intern->traverse_pointer, &intern->traverse_position, intern->llist, intern->flags ^ SPL_DLLIST_IT_LIFO TSRMLS_CC);
+}
+/* }}} */
+
/* {{{ proto void SplDoublyLinkedList::next() U
Move to next entry */
SPL_METHOD(SplDoublyLinkedList, next)
SPL_ME(SplDoublyLinkedList, current, NULL, ZEND_ACC_PUBLIC)
SPL_ME(SplDoublyLinkedList, key, NULL, ZEND_ACC_PUBLIC)
SPL_ME(SplDoublyLinkedList, next, NULL, ZEND_ACC_PUBLIC)
+ SPL_ME(SplDoublyLinkedList, prev, NULL, ZEND_ACC_PUBLIC)
SPL_ME(SplDoublyLinkedList, valid, NULL, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
};
--- /dev/null
+--TEST--
+SPL: DoublyLinkedList: prev
+--FILE--
+<?php
+$dll = new SplDoublyLinkedList();
+$dll->push(1);
+$dll->push(2);
+$dll->push(3);
+$dll->push(4);
+
+
+$dll->rewind();
+echo $dll->current()."\n";
+$dll->next();
+$dll->next();
+echo $dll->current()."\n";
+$dll->prev();
+echo $dll->current()."\n";
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+1
+3
+2
+===DONE===
--- /dev/null
+--TEST--
+SPL: DoublyLinkedList: memory leak when iterator pointer isn't at the last element
+--FILE--
+<?php
+$dll = new SplDoublyLinkedList();
+$dll->push(1);
+$dll->push(2);
+$dll->push(3);
+$dll->push(4);
+
+
+$dll->rewind();
+echo $dll->current()."\n";
+$dll->next();
+$dll->next();
+echo $dll->current()."\n";
+
+?>
+===DONE===
+<?php exit(0); ?>
+--EXPECTF--
+1
+3
+===DONE===