]> granicus.if.org Git - php/commitdiff
implement #67886
authorJulien Pauli <jpauli@php.net>
Mon, 25 Aug 2014 16:32:40 +0000 (18:32 +0200)
committerJulien Pauli <jpauli@php.net>
Tue, 26 Aug 2014 08:02:55 +0000 (10:02 +0200)
NEWS
ext/spl/spl_heap.c
ext/spl/tests/heap_corruption.phpt
ext/spl/tests/spl_pq_top_basic.phpt

diff --git a/NEWS b/NEWS
index 16d8b26b2dfa8d8accf5babe0627b74c32b1fea3..74dd688838cf17a12964b1c5136d603530726efb 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -34,4 +34,8 @@ PHP                                                                        NEWS
 - Session:
   . Fixed bug #67694 (Regression in session_regenerate_id()). (Tjerk)
 
+- SPL:
+  . Implemented #67886 (SplPriorityQueue/SplHeap doesn't expose extractFlags
+    nor curruption state). (Julien)
+
 <<< NOTE: Insert NEWS from last stable release here prior to actual release! >>>
index b0f06ada69cd07c1671d9dca012898acc1e41518..97d95d2acf22a28ac42bb23f9a55967f6502da28 100644 (file)
@@ -761,7 +761,8 @@ SPL_METHOD(SplPriorityQueue, top)
 }
 /* }}} */
 
-/* {{{ proto int SplPriorityQueue::setIteratorMode($flags)
+
+/* {{{ proto int SplPriorityQueue::setExtractFlags($flags)
  Set the flags of extraction*/
 SPL_METHOD(SplPriorityQueue, setExtractFlags)
 {
@@ -780,6 +781,22 @@ SPL_METHOD(SplPriorityQueue, setExtractFlags)
 }
 /* }}} */
 
+/* {{{ proto int SplPriorityQueue::getExtractFlags()
+ Get the flags of extraction*/
+SPL_METHOD(SplPriorityQueue, getExtractFlags)
+{
+       spl_heap_object *intern;
+
+       if (zend_parse_parameters_none() == FAILURE) {
+               return;
+       }
+
+       intern = Z_SPLHEAP_P(getThis());
+
+       RETURN_LONG(intern->flags);
+}
+/* }}} */
+
 /* {{{ proto int SplHeap::recoverFromCorruption()
  Recover from a corrupted state*/
 SPL_METHOD(SplHeap, recoverFromCorruption)
@@ -798,6 +815,22 @@ SPL_METHOD(SplHeap, recoverFromCorruption)
 }
 /* }}} */
 
+/* {{{ proto int SplHeap::isCorrupted()
+ Tells if the heap is in a corrupted state*/
+SPL_METHOD(SplHeap, isCorrupted)
+{
+       spl_heap_object *intern;
+
+       if (zend_parse_parameters_none() == FAILURE) {
+               return;
+       }
+
+       intern = Z_SPLHEAP_P(getThis());
+
+       RETURN_BOOL(intern->heap->flags & SPL_HEAP_CORRUPTED);
+}
+/* }}} */
+
 /* {{{ proto bool SplPriorityQueue::compare(mixed $a, mixed $b)
           compare the priorities */
 SPL_METHOD(SplPriorityQueue, compare)
@@ -1158,6 +1191,7 @@ static const zend_function_entry spl_funcs_SplPriorityQueue[] = {
        SPL_ME(SplPriorityQueue, compare,               arginfo_heap_compare,    ZEND_ACC_PUBLIC)
        SPL_ME(SplPriorityQueue, insert,                arginfo_pqueue_insert,   ZEND_ACC_PUBLIC)
        SPL_ME(SplPriorityQueue, setExtractFlags,       arginfo_pqueue_setflags, ZEND_ACC_PUBLIC)
+       SPL_ME(SplPriorityQueue, getExtractFlags,       arginfo_splheap_void,    ZEND_ACC_PUBLIC)
        SPL_ME(SplPriorityQueue, top,                   arginfo_splheap_void,    ZEND_ACC_PUBLIC)
        SPL_ME(SplPriorityQueue, extract,               arginfo_splheap_void,    ZEND_ACC_PUBLIC)
        SPL_ME(SplHeap,          count,                 arginfo_splheap_void,    ZEND_ACC_PUBLIC)
@@ -1168,6 +1202,7 @@ static const zend_function_entry spl_funcs_SplPriorityQueue[] = {
        SPL_ME(SplHeap,          next,                  arginfo_splheap_void,    ZEND_ACC_PUBLIC)
        SPL_ME(SplHeap,          valid,                 arginfo_splheap_void,    ZEND_ACC_PUBLIC)
        SPL_ME(SplHeap,          recoverFromCorruption, arginfo_splheap_void,    ZEND_ACC_PUBLIC)
+       SPL_ME(SplHeap,          isCorrupted,           arginfo_splheap_void,    ZEND_ACC_PUBLIC)
        {NULL, NULL, NULL}
 };
 
@@ -1183,6 +1218,7 @@ static const zend_function_entry spl_funcs_SplHeap[] = {
        SPL_ME(SplHeap, next,                  arginfo_splheap_void, ZEND_ACC_PUBLIC)
        SPL_ME(SplHeap, valid,                 arginfo_splheap_void, ZEND_ACC_PUBLIC)
        SPL_ME(SplHeap, recoverFromCorruption, arginfo_splheap_void, ZEND_ACC_PUBLIC)
+       SPL_ME(SplHeap, isCorrupted,           arginfo_splheap_void, ZEND_ACC_PUBLIC)
        ZEND_FENTRY(compare, NULL, NULL, ZEND_ACC_PROTECTED|ZEND_ACC_ABSTRACT)
        {NULL, NULL, NULL}
 };
index 284ee1db8128825103e022ccd5b83a5dbd823a83..5e9dec78559bbfb285a4165b2a600113069b82b8 100644 (file)
@@ -42,6 +42,8 @@ $heap->insert(4);
 
 $heap->allow_compare = false;
 
+var_dump($heap->isCorrupted());
+
 try {
        $heap->extract();
 }
@@ -56,7 +58,13 @@ catch (Exception $e) {
        echo "Corruption Exception: " . $e->getMessage() . PHP_EOL;
 }
 
+var_dump($heap->isCorrupted());
+$heap->recoverFromCorruption();
+var_dump($heap->isCorrupted());
 ?>
 --EXPECT--
+bool(false)
 Compare Exception: Compare exception
-Corruption Exception: Heap is corrupted, heap properties are no longer ensured.
\ No newline at end of file
+Corruption Exception: Heap is corrupted, heap properties are no longer ensured.
+bool(true)
+bool(false)
\ No newline at end of file
index dcc1cbe4c015ef8a25ea3a37a9d9a761240aea70..14e0af51cbefabb621e851355fb90b57ff74809a 100644 (file)
@@ -8,6 +8,8 @@ Nathaniel McHugh nat@fishtrap.co.uk
 
 $priorityQueue = new SplPriorityQueue();
 
+var_dump($priorityQueue->getExtractFlags());
+
 $priorityQueue->insert("a", 1);
 $priorityQueue->insert("b", 2);
 $priorityQueue->insert("c", 0);
@@ -16,6 +18,8 @@ echo "EXTR DEFAULT",PHP_EOL;
 echo "value: ",$priorityQueue->top(),PHP_EOL;
 
 $priorityQueue->setExtractFlags(SplPriorityQueue::EXTR_PRIORITY);
+var_dump($priorityQueue->getExtractFlags() & SplPriorityQueue::EXTR_PRIORITY);
+
 echo "EXTR_PRIORITY",PHP_EOL;
 echo "priority: ",$priorityQueue->top(),PHP_EOL;
 
@@ -28,8 +32,10 @@ $priorityQueue->setExtractFlags(SplPriorityQueue::EXTR_DATA);
 echo "value: ",$priorityQueue->top(),PHP_EOL;
 ?>
 --EXPECT--
+int(1)
 EXTR DEFAULT
 value: b
+int(2)
 EXTR_PRIORITY
 priority: 2
 EXTR_BOTH