summaryrefslogtreecommitdiff
path: root/ext/spl/spl_heap.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/spl/spl_heap.c')
-rw-r--r--ext/spl/spl_heap.c61
1 files changed, 26 insertions, 35 deletions
diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c
index 2afee6cd49..8523978584 100644
--- a/ext/spl/spl_heap.c
+++ b/ext/spl/spl_heap.c
@@ -82,7 +82,6 @@ struct _spl_heap_object {
struct _spl_heap_it {
zend_user_iterator intern;
int flags;
- spl_heap_object *object;
};
static void spl_ptr_heap_zval_dtor(zval *elem TSRMLS_DC) { /* {{{ */
@@ -869,7 +868,7 @@ static void spl_heap_it_dtor(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
spl_heap_it *iterator = (spl_heap_it *)iter;
zend_user_it_invalidate_current(iter TSRMLS_CC);
- zval_ptr_dtor(iterator->intern.it.data);
+ zval_ptr_dtor(&iterator->intern.it.data);
efree(iterator);
}
@@ -883,23 +882,21 @@ static void spl_heap_it_rewind(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
static int spl_heap_it_valid(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
{
- spl_heap_it *iterator = (spl_heap_it *)iter;
-
- return (iterator->object->heap->count != 0 ? SUCCESS : FAILURE);
+ return (((spl_heap_object *)Z_OBJ(iter->data))->heap->count != 0 ? SUCCESS : FAILURE);
}
/* }}} */
static zval *spl_heap_it_get_current_data(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
{
- spl_heap_it *iterator = (spl_heap_it *)iter;
- zval *element = &iterator->object->heap->elements[0];
+ spl_heap_object *object = (spl_heap_object*)Z_OBJ(iter->data);
+ zval *element = &object->heap->elements[0];
- if (iterator->object->heap->flags & SPL_HEAP_CORRUPTED) {
+ if (object->heap->flags & SPL_HEAP_CORRUPTED) {
zend_throw_exception(spl_ce_RuntimeException, "Heap is corrupted, heap properties are no longer ensured.", 0 TSRMLS_CC);
return NULL;
}
- if (iterator->object->heap->count == 0 || ZVAL_IS_UNDEF(element)) {
+ if (object->heap->count == 0 || ZVAL_IS_UNDEF(element)) {
return NULL;
} else {
return element;
@@ -909,18 +906,18 @@ static zval *spl_heap_it_get_current_data(zend_object_iterator *iter TSRMLS_DC)
static zval *spl_pqueue_it_get_current_data(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
{
- spl_heap_it *iterator = (spl_heap_it *)iter;
- zval *element = &iterator->object->heap->elements[0];
+ spl_heap_object *object = (spl_heap_object*)Z_OBJ(iter->data);
+ zval *element = &object->heap->elements[0];
- if (iterator->object->heap->flags & SPL_HEAP_CORRUPTED) {
+ if (object->heap->flags & SPL_HEAP_CORRUPTED) {
zend_throw_exception(spl_ce_RuntimeException, "Heap is corrupted, heap properties are no longer ensured.", 0 TSRMLS_CC);
return NULL;
}
- if (iterator->object->heap->count == 0 || ZVAL_IS_UNDEF(element)) {
+ if (object->heap->count == 0 || ZVAL_IS_UNDEF(element)) {
return NULL;
} else {
- zval *data = spl_pqueue_extract_helper(element, iterator->object->flags);
+ zval *data = spl_pqueue_extract_helper(element, object->flags);
if (!data) {
zend_error(E_RECOVERABLE_ERROR, "Unable to extract from the PriorityQueue node");
}
@@ -931,24 +928,23 @@ static zval *spl_pqueue_it_get_current_data(zend_object_iterator *iter TSRMLS_DC
static void spl_heap_it_get_current_key(zend_object_iterator *iter, zval *key TSRMLS_DC) /* {{{ */
{
- spl_heap_it *iterator = (spl_heap_it *)iter;
+ spl_heap_object *object = (spl_heap_object*)Z_OBJ(iter->data);
- ZVAL_LONG(key, iterator->object->heap->count - 1);
+ ZVAL_LONG(key, object->heap->count - 1);
}
/* }}} */
static void spl_heap_it_move_forward(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
{
- zval *object = (zval*)((zend_user_iterator *)iter)->it.data;
- spl_heap_it *iterator = (spl_heap_it *)iter;
+ spl_heap_object *object = (spl_heap_object*)Z_OBJ(iter->data);
zval *elem;
- if (iterator->object->heap->flags & SPL_HEAP_CORRUPTED) {
+ if (object->heap->flags & SPL_HEAP_CORRUPTED) {
zend_throw_exception(spl_ce_RuntimeException, "Heap is corrupted, heap properties are no longer ensured.", 0 TSRMLS_CC);
return;
}
- elem = spl_ptr_heap_delete_top(iterator->object->heap, object TSRMLS_CC);
+ elem = spl_ptr_heap_delete_top(object->heap, &iter->data TSRMLS_CC);
if (elem != NULL) {
zval_ptr_dtor(elem);
@@ -1088,20 +1084,17 @@ zend_object_iterator *spl_heap_get_iterator(zend_class_entry *ce, zval *object,
return NULL;
}
- Z_ADDREF_P(object);
-
- iterator = emalloc(sizeof(spl_heap_it));
+ iterator = emalloc(sizeof(spl_heap_it));
- zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC);
+ zend_iterator_init(&iterator->intern.it TSRMLS_CC);
- iterator->intern.it.data = (void*)object;
+ ZVAL_COPY(&iterator->intern.it.data, object);
iterator->intern.it.funcs = &spl_heap_it_funcs;
iterator->intern.ce = ce;
- iterator->intern.value = NULL;
iterator->flags = heap_object->flags;
- iterator->object = heap_object;
+ ZVAL_UNDEF(&iterator->intern.value);
- return (zend_object_iterator*)iterator;
+ return &iterator->intern.it;
}
/* }}} */
@@ -1115,20 +1108,18 @@ zend_object_iterator *spl_pqueue_get_iterator(zend_class_entry *ce, zval *object
return NULL;
}
- Z_ADDREF_P(object);
-
- iterator = emalloc(sizeof(spl_heap_it));
+ iterator = emalloc(sizeof(spl_heap_it));
zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC);
- iterator->intern.it.data = (void*)object;
+ ZVAL_COPY(&iterator->intern.it.data, object);
iterator->intern.it.funcs = &spl_pqueue_it_funcs;
iterator->intern.ce = ce;
- iterator->intern.value = NULL;
iterator->flags = heap_object->flags;
- iterator->object = heap_object;
- return (zend_object_iterator*)iterator;
+ ZVAL_UNDEF(&iterator->intern.value);
+
+ return &iterator->intern.it;
}
/* }}} */