Index: ext/spl/spl_dllist.c =================================================================== RCS file: /repository/php-src/ext/spl/spl_dllist.c,v retrieving revision 1.1.2.19 diff -u -p -r1.1.2.19 spl_dllist.c --- ext/spl/spl_dllist.c 17 Jun 2009 13:27:09 -0000 1.1.2.19 +++ ext/spl/spl_dllist.c 20 Jun 2009 11:34:00 -0000 @@ -560,6 +560,65 @@ SPL_METHOD(SplDoublyLinkedList, push) } /* }}} */ +/* {{{ proto void SplDoublyLinkedList::insert(mixed $data) U + Inserts an element before the current iterator position */ +SPL_METHOD(SplDoublyLinkedList, insert) +{ + zval *value; + spl_dllist_object *intern; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == FAILURE) { + return; + } + + SEPARATE_ARG_IF_REF(value); + + intern = (spl_dllist_object*)zend_object_store_get_object(getThis() TSRMLS_CC); + + if (intern->traverse_pointer) { + spl_ptr_llist_element *elem = emalloc(sizeof(spl_ptr_llist_element)); + spl_ptr_llist *llist = intern->llist; + + elem->data = value; + elem->rc = 1; + + if (intern->flags & SPL_DLLIST_IT_LIFO) { + elem->prev = intern->traverse_pointer; + elem->next = intern->traverse_pointer->next; + intern->traverse_pointer->next = elem; + + if (elem->next == NULL) { + llist->tail = elem; + } else { + elem->next->prev = elem; + } + } else { + elem->prev = intern->traverse_pointer->prev; + elem->next = intern->traverse_pointer; + intern->traverse_pointer->prev = elem; + + if (elem->prev == NULL) { + llist->head = elem; + } else { + elem->prev->next = elem; + } + } + + llist->count++; + + if (llist->ctor) { + llist->ctor(elem TSRMLS_CC); + } + + } else if (intern->traverse_position < 0) { + spl_ptr_llist_unshift(intern->llist, value TSRMLS_CC); + } else { + spl_ptr_llist_push(intern->llist, value TSRMLS_CC); + } + + RETURN_TRUE; +} + /* {{{ proto bool SplDoublyLinkedList::unshift(mixed $value) U Unshift $value on the SplDoublyLinkedList */ SPL_METHOD(SplDoublyLinkedList, unshift) @@ -1161,6 +1220,7 @@ static const zend_function_entry spl_fun SPL_ME(SplDoublyLinkedList, shift, NULL, ZEND_ACC_PUBLIC) SPL_ME(SplDoublyLinkedList, push, arginfo_dllist_push, ZEND_ACC_PUBLIC) SPL_ME(SplDoublyLinkedList, unshift, arginfo_dllist_push, ZEND_ACC_PUBLIC) + SPL_ME(SplDoublyLinkedList, insert, arginfo_dllist_push, ZEND_ACC_PUBLIC) SPL_ME(SplDoublyLinkedList, top, NULL, ZEND_ACC_PUBLIC) SPL_ME(SplDoublyLinkedList, bottom, NULL, ZEND_ACC_PUBLIC) SPL_ME(SplDoublyLinkedList, count, NULL, ZEND_ACC_PUBLIC)