mirror of
https://github.com/php/php-src.git
synced 2024-09-21 18:07:23 +00:00
Merge branch 'PHP-7.4'
* PHP-7.4: Fix #69264: __debugInfo() ignored while extending SPL classes
This commit is contained in:
commit
9809713844
@ -824,7 +824,7 @@ static HashTable *spl_array_get_properties_for(zend_object *object, zend_prop_pu
|
||||
return ht;
|
||||
} /* }}} */
|
||||
|
||||
static HashTable* spl_array_get_debug_info(zend_object *obj, int *is_temp) /* {{{ */
|
||||
static inline HashTable* spl_array_get_debug_info(zend_object *obj) /* {{{ */
|
||||
{
|
||||
zval *storage;
|
||||
zend_string *zname;
|
||||
@ -836,11 +836,9 @@ static HashTable* spl_array_get_debug_info(zend_object *obj, int *is_temp) /* {{
|
||||
}
|
||||
|
||||
if (intern->ar_flags & SPL_ARRAY_IS_SELF) {
|
||||
*is_temp = 0;
|
||||
return intern->std.properties;
|
||||
return zend_array_dup(intern->std.properties);
|
||||
} else {
|
||||
HashTable *debug_info;
|
||||
*is_temp = 1;
|
||||
|
||||
debug_info = zend_new_array(zend_hash_num_elements(intern->std.properties) + 1);
|
||||
zend_hash_copy(debug_info, intern->std.properties, (copy_ctor_func_t) zval_add_ref);
|
||||
@ -1893,6 +1891,16 @@ SPL_METHOD(Array, __unserialize)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto void Array::__debugInfo() */
|
||||
SPL_METHOD(Array, __debugInfo)
|
||||
{
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
RETURN_ARR(spl_array_get_debug_info(Z_OBJ_P(ZEND_THIS)));
|
||||
} /* }}} */
|
||||
|
||||
static const zend_function_entry spl_funcs_ArrayObject[] = {
|
||||
SPL_ME(Array, __construct, arginfo_class_ArrayObject___construct, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(Array, offsetExists, arginfo_class_ArrayObject_offsetExists, ZEND_ACC_PUBLIC)
|
||||
@ -1914,6 +1922,7 @@ static const zend_function_entry spl_funcs_ArrayObject[] = {
|
||||
SPL_ME(Array, serialize, arginfo_class_ArrayObject_serialize, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(Array, __unserialize, arginfo_class_ArrayObject___unserialize, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(Array, __serialize, arginfo_class_ArrayObject___serialize, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(Array, __debugInfo, arginfo_class_ArrayObject___debugInfo, ZEND_ACC_PUBLIC)
|
||||
/* ArrayObject specific */
|
||||
SPL_ME(Array, getIterator, arginfo_class_ArrayObject_getIterator, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(Array, exchangeArray, arginfo_class_ArrayObject_exchangeArray, ZEND_ACC_PUBLIC)
|
||||
@ -1943,6 +1952,7 @@ static const zend_function_entry spl_funcs_ArrayIterator[] = {
|
||||
SPL_ME(Array, serialize, arginfo_class_ArrayIterator_serialize, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(Array, __unserialize, arginfo_class_ArrayIterator___unserialize, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(Array, __serialize, arginfo_class_ArrayIterator___serialize, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(Array, __debugInfo, arginfo_class_ArrayIterator___debugInfo, ZEND_ACC_PUBLIC)
|
||||
/* ArrayIterator specific */
|
||||
SPL_ME(Array, rewind, arginfo_class_ArrayIterator_rewind, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(Array, current, arginfo_class_ArrayIterator_current, ZEND_ACC_PUBLIC)
|
||||
@ -1980,7 +1990,6 @@ PHP_MINIT_FUNCTION(spl_array)
|
||||
spl_handler_ArrayObject.count_elements = spl_array_object_count_elements;
|
||||
|
||||
spl_handler_ArrayObject.get_properties_for = spl_array_get_properties_for;
|
||||
spl_handler_ArrayObject.get_debug_info = spl_array_get_debug_info;
|
||||
spl_handler_ArrayObject.get_gc = spl_array_get_gc;
|
||||
spl_handler_ArrayObject.read_property = spl_array_read_property;
|
||||
spl_handler_ArrayObject.write_property = spl_array_write_property;
|
||||
|
@ -104,6 +104,9 @@ class ArrayObject implements IteratorAggregate, ArrayAccess, Serializable, Count
|
||||
|
||||
/** @return string */
|
||||
public function getIteratorClass() {}
|
||||
|
||||
/** @return array */
|
||||
public function __debugInfo() {}
|
||||
}
|
||||
|
||||
class ArrayIterator implements SeekableIterator, ArrayAccess, Serializable, Countable
|
||||
@ -213,6 +216,9 @@ class ArrayIterator implements SeekableIterator, ArrayAccess, Serializable, Coun
|
||||
|
||||
/** @return void */
|
||||
public function seek(int $position) {}
|
||||
|
||||
/** @return array */
|
||||
public function __debugInfo() {}
|
||||
}
|
||||
|
||||
class RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator
|
||||
|
@ -74,6 +74,8 @@ ZEND_END_ARG_INFO()
|
||||
|
||||
#define arginfo_class_ArrayObject_getIteratorClass arginfo_class_ArrayObject_getArrayCopy
|
||||
|
||||
#define arginfo_class_ArrayObject___debugInfo arginfo_class_ArrayObject_getArrayCopy
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ArrayIterator___construct, 0, 0, 0)
|
||||
ZEND_ARG_INFO(0, array)
|
||||
ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 0)
|
||||
@ -131,6 +133,8 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ArrayIterator_seek, 0, 0, 1)
|
||||
ZEND_ARG_TYPE_INFO(0, position, IS_LONG, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
#define arginfo_class_ArrayIterator___debugInfo arginfo_class_ArrayObject_getArrayCopy
|
||||
|
||||
#define arginfo_class_RecursiveArrayIterator_hasChildren arginfo_class_ArrayObject_getArrayCopy
|
||||
|
||||
#define arginfo_class_RecursiveArrayIterator_getChildren arginfo_class_ArrayObject_getArrayCopy
|
||||
|
@ -596,7 +596,7 @@ static char *spl_filesystem_object_get_pathname(spl_filesystem_object *intern, s
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static HashTable *spl_filesystem_object_get_debug_info(zend_object *object, int *is_temp) /* {{{ */
|
||||
static inline HashTable *spl_filesystem_object_get_debug_info(zend_object *object) /* {{{ */
|
||||
{
|
||||
spl_filesystem_object *intern = spl_filesystem_from_obj(object);
|
||||
zval tmp;
|
||||
@ -606,8 +606,6 @@ static HashTable *spl_filesystem_object_get_debug_info(zend_object *object, int
|
||||
size_t path_len;
|
||||
char stmp[2];
|
||||
|
||||
*is_temp = 1;
|
||||
|
||||
if (!intern->std.properties) {
|
||||
rebuild_object_properties(&intern->std);
|
||||
}
|
||||
@ -1403,6 +1401,16 @@ SPL_METHOD(SplFileInfo, getPathInfo)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto void SplFileInfo::__debugInfo() */
|
||||
SPL_METHOD(SplFileInfo, __debugInfo)
|
||||
{
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
RETURN_ARR(spl_filesystem_object_get_debug_info(Z_OBJ_P(ZEND_THIS)));
|
||||
} /* }}} */
|
||||
|
||||
/* {{{ proto SplFileInfo::_bad_state_ex(void) */
|
||||
SPL_METHOD(SplFileInfo, _bad_state_ex)
|
||||
{
|
||||
@ -1904,6 +1912,7 @@ static const zend_function_entry spl_SplFileInfo_functions[] = {
|
||||
SPL_ME(SplFileInfo, openFile, arginfo_class_SplFileInfo_openFile, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(SplFileInfo, setFileClass, arginfo_class_SplFileInfo_setFileClass, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(SplFileInfo, setInfoClass, arginfo_class_SplFileInfo_setInfoClass, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(SplFileInfo, __debugInfo, arginfo_class_SplFileInfo___debugInfo, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(SplFileInfo, _bad_state_ex, arginfo_class_SplFileInfo__bad_state_ex, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL)
|
||||
SPL_MA(SplFileInfo, __toString, SplFileInfo, getPathname, arginfo_class_SplFileInfo___toString, ZEND_ACC_PUBLIC)
|
||||
PHP_FE_END
|
||||
@ -2981,7 +2990,6 @@ PHP_MINIT_FUNCTION(spl_directory)
|
||||
spl_filesystem_object_handlers.offset = XtOffsetOf(spl_filesystem_object, std);
|
||||
spl_filesystem_object_handlers.clone_obj = spl_filesystem_object_clone;
|
||||
spl_filesystem_object_handlers.cast_object = spl_filesystem_object_cast;
|
||||
spl_filesystem_object_handlers.get_debug_info = spl_filesystem_object_get_debug_info;
|
||||
spl_filesystem_object_handlers.dtor_obj = spl_filesystem_object_destroy_object;
|
||||
spl_filesystem_object_handlers.free_obj = spl_filesystem_object_free_storage;
|
||||
spl_ce_SplFileInfo->serialize = zend_class_serialize_deny;
|
||||
|
@ -90,6 +90,9 @@ class SplFileInfo
|
||||
|
||||
public function __toString(): string {}
|
||||
|
||||
/** @return array */
|
||||
public function __debugInfo() {}
|
||||
|
||||
/** @return void */
|
||||
final public function _bad_state_ex() {}
|
||||
}
|
||||
|
@ -70,6 +70,8 @@ ZEND_END_ARG_INFO()
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_SplFileInfo___toString, 0, 0, IS_STRING, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
#define arginfo_class_SplFileInfo___debugInfo arginfo_class_SplFileInfo_getPath
|
||||
|
||||
#define arginfo_class_SplFileInfo__bad_state_ex arginfo_class_SplFileInfo_getPath
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_DirectoryIterator___construct, 0, 0, 1)
|
||||
|
@ -488,7 +488,7 @@ static int spl_dllist_object_count_elements(zend_object *object, zend_long *coun
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static HashTable* spl_dllist_object_get_debug_info(zend_object *obj, int *is_temp) /* {{{{ */
|
||||
static inline HashTable* spl_dllist_object_get_debug_info(zend_object *obj) /* {{{{ */
|
||||
{
|
||||
spl_dllist_object *intern = spl_dllist_from_obj(obj);
|
||||
spl_ptr_llist_element *current = intern->llist->head, *next;
|
||||
@ -496,7 +496,6 @@ static HashTable* spl_dllist_object_get_debug_info(zend_object *obj, int *is_tem
|
||||
zend_string *pnstr;
|
||||
int i = 0;
|
||||
HashTable *debug_info;
|
||||
*is_temp = 1;
|
||||
|
||||
if (!intern->std.properties) {
|
||||
rebuild_object_properties(&intern->std);
|
||||
@ -1331,6 +1330,16 @@ SPL_METHOD(SplDoublyLinkedList, add)
|
||||
}
|
||||
} /* }}} */
|
||||
|
||||
/* {{{ proto void SplDoublyLinkedList::__debugInfo() */
|
||||
SPL_METHOD(SplDoublyLinkedList, __debugInfo)
|
||||
{
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
RETURN_ARR(spl_dllist_object_get_debug_info(Z_OBJ_P(ZEND_THIS)));
|
||||
} /* }}} */
|
||||
|
||||
/* {{{ iterator handler table */
|
||||
static const zend_object_iterator_funcs spl_dllist_it_funcs = {
|
||||
spl_dllist_it_dtor,
|
||||
@ -1387,6 +1396,7 @@ static const zend_function_entry spl_funcs_SplDoublyLinkedList[] = {
|
||||
SPL_ME(SplDoublyLinkedList, isEmpty, arginfo_class_SplDoublyLinkedList_isEmpty, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(SplDoublyLinkedList, setIteratorMode, arginfo_class_SplDoublyLinkedList_setIteratorMode, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(SplDoublyLinkedList, getIteratorMode, arginfo_class_SplDoublyLinkedList_getIteratorMode, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(SplDoublyLinkedList, __debugInfo, arginfo_class_SplDoublyLinkedList___debugInfo, ZEND_ACC_PUBLIC)
|
||||
/* Countable */
|
||||
SPL_ME(SplDoublyLinkedList, count, arginfo_class_SplDoublyLinkedList_count, ZEND_ACC_PUBLIC)
|
||||
/* ArrayAccess */
|
||||
@ -1421,7 +1431,6 @@ PHP_MINIT_FUNCTION(spl_dllist) /* {{{ */
|
||||
spl_handler_SplDoublyLinkedList.offset = XtOffsetOf(spl_dllist_object, std);
|
||||
spl_handler_SplDoublyLinkedList.clone_obj = spl_dllist_object_clone;
|
||||
spl_handler_SplDoublyLinkedList.count_elements = spl_dllist_object_count_elements;
|
||||
spl_handler_SplDoublyLinkedList.get_debug_info = spl_dllist_object_get_debug_info;
|
||||
spl_handler_SplDoublyLinkedList.get_gc = spl_dllist_object_get_gc;
|
||||
spl_handler_SplDoublyLinkedList.dtor_obj = zend_objects_destroy_object;
|
||||
spl_handler_SplDoublyLinkedList.free_obj = spl_dllist_object_free_storage;
|
||||
|
@ -33,6 +33,9 @@ class SplDoublyLinkedList implements Iterator, Countable, ArrayAccess, Serializa
|
||||
/** @return mixed */
|
||||
public function bottom() {}
|
||||
|
||||
/** @return array */
|
||||
public function __debugInfo() {}
|
||||
|
||||
/** @return int */
|
||||
public function count() {}
|
||||
|
||||
|
@ -20,6 +20,8 @@ ZEND_END_ARG_INFO()
|
||||
|
||||
#define arginfo_class_SplDoublyLinkedList_bottom arginfo_class_SplDoublyLinkedList_pop
|
||||
|
||||
#define arginfo_class_SplDoublyLinkedList___debugInfo arginfo_class_SplDoublyLinkedList_pop
|
||||
|
||||
#define arginfo_class_SplDoublyLinkedList_count arginfo_class_SplDoublyLinkedList_pop
|
||||
|
||||
#define arginfo_class_SplDoublyLinkedList_isEmpty arginfo_class_SplDoublyLinkedList_pop
|
||||
|
@ -490,15 +490,13 @@ static int spl_heap_object_count_elements(zend_object *object, zend_long *count)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static HashTable* spl_heap_object_get_debug_info_helper(zend_class_entry *ce, zend_object *obj, int *is_temp) { /* {{{ */
|
||||
static inline HashTable* spl_heap_object_get_debug_info(zend_class_entry *ce, zend_object *obj) { /* {{{ */
|
||||
spl_heap_object *intern = spl_heap_from_obj(obj);
|
||||
zval tmp, heap_array;
|
||||
zend_string *pnstr;
|
||||
HashTable *debug_info;
|
||||
int i;
|
||||
|
||||
*is_temp = 1;
|
||||
|
||||
if (!intern->std.properties) {
|
||||
rebuild_object_properties(&intern->std);
|
||||
}
|
||||
@ -560,18 +558,6 @@ static HashTable *spl_pqueue_object_get_gc(zend_object *obj, zval **gc_data, int
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static HashTable* spl_heap_object_get_debug_info(zend_object *obj, int *is_temp) /* {{{ */
|
||||
{
|
||||
return spl_heap_object_get_debug_info_helper(spl_ce_SplHeap, obj, is_temp);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static HashTable* spl_pqueue_object_get_debug_info(zend_object *obj, int *is_temp) /* {{{ */
|
||||
{
|
||||
return spl_heap_object_get_debug_info_helper(spl_ce_SplPriorityQueue, obj, is_temp);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int SplHeap::count()
|
||||
Return the number of elements in the heap. */
|
||||
SPL_METHOD(SplHeap, count)
|
||||
@ -1054,6 +1040,26 @@ SPL_METHOD(SplPriorityQueue, current)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto void SplHeap::__debugInfo() */
|
||||
SPL_METHOD(SplHeap, __debugInfo)
|
||||
{
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
RETURN_ARR(spl_heap_object_get_debug_info(spl_ce_SplHeap, Z_OBJ_P(ZEND_THIS)));
|
||||
} /* }}} */
|
||||
|
||||
/* {{{ proto void SplPriorityQueue::__debugInfo() */
|
||||
SPL_METHOD(SplPriorityQueue, __debugInfo)
|
||||
{
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
RETURN_ARR(spl_heap_object_get_debug_info(spl_ce_SplPriorityQueue, Z_OBJ_P(ZEND_THIS)));
|
||||
} /* }}} */
|
||||
|
||||
/* iterator handler table */
|
||||
static const zend_object_iterator_funcs spl_heap_it_funcs = {
|
||||
spl_heap_it_dtor,
|
||||
@ -1151,6 +1157,7 @@ static const zend_function_entry spl_funcs_SplPriorityQueue[] = {
|
||||
SPL_ME(SplHeap, valid, arginfo_class_SplPriorityQueue_valid, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(SplHeap, recoverFromCorruption, arginfo_class_SplPriorityQueue_recoverFromCorruption, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(SplHeap, isCorrupted, arginfo_class_SplPriorityQueue_isCorrupted, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(SplPriorityQueue, __debugInfo, arginfo_class_SplPriorityQueue___debugInfo, ZEND_ACC_PUBLIC)
|
||||
PHP_FE_END
|
||||
};
|
||||
|
||||
@ -1167,6 +1174,7 @@ static const zend_function_entry spl_funcs_SplHeap[] = {
|
||||
SPL_ME(SplHeap, valid, arginfo_class_SplHeap_valid, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(SplHeap, recoverFromCorruption, arginfo_class_SplHeap_recoverFromCorruption, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(SplHeap, isCorrupted, arginfo_class_SplHeap_isCorrupted, ZEND_ACC_PUBLIC)
|
||||
SPL_ME(SplHeap, __debugInfo, arginfo_class_SplHeap___debugInfo, ZEND_ACC_PUBLIC)
|
||||
ZEND_FENTRY(compare, NULL, arginfo_class_SplHeap_compare, ZEND_ACC_PROTECTED|ZEND_ACC_ABSTRACT)
|
||||
PHP_FE_END
|
||||
};
|
||||
@ -1180,7 +1188,6 @@ PHP_MINIT_FUNCTION(spl_heap) /* {{{ */
|
||||
spl_handler_SplHeap.offset = XtOffsetOf(spl_heap_object, std);
|
||||
spl_handler_SplHeap.clone_obj = spl_heap_object_clone;
|
||||
spl_handler_SplHeap.count_elements = spl_heap_object_count_elements;
|
||||
spl_handler_SplHeap.get_debug_info = spl_heap_object_get_debug_info;
|
||||
spl_handler_SplHeap.get_gc = spl_heap_object_get_gc;
|
||||
spl_handler_SplHeap.dtor_obj = zend_objects_destroy_object;
|
||||
spl_handler_SplHeap.free_obj = spl_heap_object_free_storage;
|
||||
@ -1202,7 +1209,6 @@ PHP_MINIT_FUNCTION(spl_heap) /* {{{ */
|
||||
spl_handler_SplPriorityQueue.offset = XtOffsetOf(spl_heap_object, std);
|
||||
spl_handler_SplPriorityQueue.clone_obj = spl_heap_object_clone;
|
||||
spl_handler_SplPriorityQueue.count_elements = spl_heap_object_count_elements;
|
||||
spl_handler_SplPriorityQueue.get_debug_info = spl_pqueue_object_get_debug_info;
|
||||
spl_handler_SplPriorityQueue.get_gc = spl_pqueue_object_get_gc;
|
||||
spl_handler_SplPriorityQueue.dtor_obj = zend_objects_destroy_object;
|
||||
spl_handler_SplPriorityQueue.free_obj = spl_heap_object_free_storage;
|
||||
|
@ -54,6 +54,9 @@ class SplPriorityQueue implements Iterator, Countable
|
||||
|
||||
/** @return int */
|
||||
public function getExtractFlags() {}
|
||||
|
||||
/** @return array */
|
||||
public function __debugInfo() {}
|
||||
}
|
||||
|
||||
abstract class SplHeap implements Iterator, Countable
|
||||
@ -103,6 +106,9 @@ abstract class SplHeap implements Iterator, Countable
|
||||
|
||||
/** @return bool */
|
||||
public function isCorrupted() {}
|
||||
|
||||
/** @return array */
|
||||
public function __debugInfo() {}
|
||||
}
|
||||
|
||||
class SplMinHeap extends SplHeap
|
||||
|
@ -39,6 +39,8 @@ ZEND_END_ARG_INFO()
|
||||
|
||||
#define arginfo_class_SplPriorityQueue_getExtractFlags arginfo_class_SplPriorityQueue_top
|
||||
|
||||
#define arginfo_class_SplPriorityQueue___debugInfo arginfo_class_SplPriorityQueue_top
|
||||
|
||||
#define arginfo_class_SplHeap_extract arginfo_class_SplPriorityQueue_top
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SplHeap_insert, 0, 0, 1)
|
||||
@ -70,6 +72,8 @@ ZEND_END_ARG_INFO()
|
||||
|
||||
#define arginfo_class_SplHeap_isCorrupted arginfo_class_SplPriorityQueue_top
|
||||
|
||||
#define arginfo_class_SplHeap___debugInfo arginfo_class_SplPriorityQueue_top
|
||||
|
||||
#define arginfo_class_SplMinHeap_compare arginfo_class_SplHeap_compare
|
||||
|
||||
#define arginfo_class_SplMaxHeap_compare arginfo_class_SplHeap_compare
|
||||
|
@ -262,7 +262,7 @@ static zend_object *spl_object_storage_clone(zend_object *old_object)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static HashTable* spl_object_storage_debug_info(zend_object *obj, int *is_temp) /* {{{ */
|
||||
static inline HashTable* spl_object_storage_debug_info(zend_object *obj) /* {{{ */
|
||||
{
|
||||
spl_SplObjectStorage *intern = spl_object_storage_from_obj(obj);
|
||||
spl_SplObjectStorageElement *element;
|
||||
@ -272,8 +272,6 @@ static HashTable* spl_object_storage_debug_info(zend_object *obj, int *is_temp)
|
||||
zend_string *zname;
|
||||
HashTable *debug_info;
|
||||
|
||||
*is_temp = 1;
|
||||
|
||||
props = obj->handlers->get_properties(obj);
|
||||
|
||||
debug_info = zend_new_array(zend_hash_num_elements(props) + 1);
|
||||
@ -923,6 +921,17 @@ SPL_METHOD(SplObjectStorage, __unserialize)
|
||||
object_properties_load(&intern->std, Z_ARRVAL_P(members_zv));
|
||||
}
|
||||
|
||||
/* {{{ proto array SplObjectStorage::__debugInfo() */
|
||||
SPL_METHOD(SplObjectStorage, __debugInfo)
|
||||
{
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
RETURN_ARR(spl_object_storage_debug_info(Z_OBJ_P(ZEND_THIS)));
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static const zend_function_entry spl_funcs_SplObjectStorage[] = {
|
||||
SPL_ME(SplObjectStorage, attach, arginfo_class_SplObjectStorage_attach, 0)
|
||||
SPL_ME(SplObjectStorage, detach, arginfo_class_SplObjectStorage_detach, 0)
|
||||
@ -933,6 +942,7 @@ static const zend_function_entry spl_funcs_SplObjectStorage[] = {
|
||||
SPL_ME(SplObjectStorage, getInfo, arginfo_class_SplObjectStorage_getInfo,0)
|
||||
SPL_ME(SplObjectStorage, setInfo, arginfo_class_SplObjectStorage_setInfo, 0)
|
||||
SPL_ME(SplObjectStorage, getHash, arginfo_class_SplObjectStorage_getHash, 0)
|
||||
SPL_ME(SplObjectStorage, __debugInfo, arginfo_class_SplObjectStorage___debugInfo, 0)
|
||||
/* Countable */
|
||||
SPL_ME(SplObjectStorage, count, arginfo_class_SplObjectStorage_count,0)
|
||||
/* Iterator */
|
||||
@ -1266,6 +1276,7 @@ static const zend_function_entry spl_funcs_MultipleIterator[] = {
|
||||
SPL_ME(MultipleIterator, detachIterator, arginfo_class_MultipleIterator_detachIterator, 0)
|
||||
SPL_ME(MultipleIterator, containsIterator, arginfo_class_MultipleIterator_containsIterator, 0)
|
||||
SPL_MA(MultipleIterator, countIterators, SplObjectStorage, count, arginfo_class_MultipleIterator_countIterators, 0)
|
||||
SPL_MA(MultipleIterator, __debugInfo, SplObjectStorage, __debugInfo, arginfo_class_MultipleIterator___debugInfo, 0)
|
||||
/* Iterator */
|
||||
SPL_ME(MultipleIterator, rewind, arginfo_class_MultipleIterator_rewind, 0)
|
||||
SPL_ME(MultipleIterator, valid, arginfo_class_MultipleIterator_valid, 0)
|
||||
@ -1285,7 +1296,6 @@ PHP_MINIT_FUNCTION(spl_observer)
|
||||
memcpy(&spl_handler_SplObjectStorage, &std_object_handlers, sizeof(zend_object_handlers));
|
||||
|
||||
spl_handler_SplObjectStorage.offset = XtOffsetOf(spl_SplObjectStorage, std);
|
||||
spl_handler_SplObjectStorage.get_debug_info = spl_object_storage_debug_info;
|
||||
spl_handler_SplObjectStorage.compare = spl_object_storage_compare_objects;
|
||||
spl_handler_SplObjectStorage.clone_obj = spl_object_storage_clone;
|
||||
spl_handler_SplObjectStorage.get_gc = spl_object_storage_get_gc;
|
||||
|
@ -107,6 +107,9 @@ class SplObjectStorage implements Countable, Iterator, Serializable, ArrayAccess
|
||||
|
||||
/** @return void */
|
||||
public function __unserialize(array $data) {}
|
||||
|
||||
/** @return array */
|
||||
public function __debugInfo() {}
|
||||
}
|
||||
|
||||
class MultipleIterator implements Iterator
|
||||
@ -149,4 +152,7 @@ class MultipleIterator implements Iterator
|
||||
|
||||
/** @return void */
|
||||
public function next() {}
|
||||
|
||||
/** @return array */
|
||||
public function __debugInfo() {}
|
||||
}
|
||||
|
@ -79,6 +79,8 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SplObjectStorage___unserialize, 0, 0, 1)
|
||||
ZEND_ARG_TYPE_INFO(0, data, IS_ARRAY, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
#define arginfo_class_SplObjectStorage___debugInfo arginfo_class_SplSubject_notify
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_MultipleIterator___construct, 0, 0, 0)
|
||||
ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
@ -111,3 +113,5 @@ ZEND_END_ARG_INFO()
|
||||
#define arginfo_class_MultipleIterator_current arginfo_class_SplSubject_notify
|
||||
|
||||
#define arginfo_class_MultipleIterator_next arginfo_class_SplSubject_notify
|
||||
|
||||
#define arginfo_class_MultipleIterator___debugInfo arginfo_class_SplSubject_notify
|
||||
|
112
ext/spl/tests/bug69264.phpt
Normal file
112
ext/spl/tests/bug69264.phpt
Normal file
@ -0,0 +1,112 @@
|
||||
--TEST--
|
||||
Bug #69264 (__debugInfo() ignored while extending SPL classes)
|
||||
--FILE--
|
||||
<?php
|
||||
class MyFileInfo extends SplFileInfo {
|
||||
public function __debugInfo() {
|
||||
return ['child' => 42, 'parent' => count(parent::__debugInfo())];
|
||||
}
|
||||
}
|
||||
|
||||
class MyDoublyLinkedList extends SplDoublyLinkedList {
|
||||
public function __debugInfo() {
|
||||
return ['child' => 42, 'parent' => count(parent::__debugInfo())];
|
||||
}
|
||||
}
|
||||
|
||||
class MyObjectStorage extends SplObjectStorage {
|
||||
public function __debugInfo() {
|
||||
return ['child' => 42, 'parent' => count(parent::__debugInfo())];
|
||||
}
|
||||
}
|
||||
|
||||
class MyMultipleIterator extends MultipleIterator {
|
||||
public function __debugInfo() {
|
||||
return ['child' => 42, 'parent' => count(parent::__debugInfo())];
|
||||
}
|
||||
}
|
||||
|
||||
class MyArrayObject extends ArrayObject {
|
||||
public function __debugInfo() {
|
||||
return ['child' => 42, 'parent' => count(parent::__debugInfo())];
|
||||
}
|
||||
}
|
||||
|
||||
class MyArrayIterator extends ArrayIterator {
|
||||
public function __debugInfo() {
|
||||
return ['child' => 42, 'parent' => count(parent::__debugInfo())];
|
||||
}
|
||||
}
|
||||
|
||||
class MyMaxHeap extends SplMaxHeap {
|
||||
public function __debugInfo() {
|
||||
return ['child' => 42, 'parent' => count(parent::__debugInfo())];
|
||||
}
|
||||
}
|
||||
|
||||
class MyPriorityQueue extends SplPriorityQueue {
|
||||
public function __debugInfo() {
|
||||
return ['child' => 42, 'parent' => count(parent::__debugInfo())];
|
||||
}
|
||||
}
|
||||
|
||||
var_dump(
|
||||
new MyFileInfo(__FILE__),
|
||||
new MyDoublyLinkedList(),
|
||||
new MyObjectStorage(),
|
||||
new MyMultipleIterator(),
|
||||
new MyArrayObject(),
|
||||
new MyArrayIterator(),
|
||||
new MyMaxHeap(),
|
||||
new MyPriorityQueue(),
|
||||
);
|
||||
?>
|
||||
--EXPECTF--
|
||||
object(MyFileInfo)#%d (2) {
|
||||
["child"]=>
|
||||
int(42)
|
||||
["parent"]=>
|
||||
int(2)
|
||||
}
|
||||
object(MyDoublyLinkedList)#%d (2) {
|
||||
["child"]=>
|
||||
int(42)
|
||||
["parent"]=>
|
||||
int(2)
|
||||
}
|
||||
object(MyObjectStorage)#%d (2) {
|
||||
["child"]=>
|
||||
int(42)
|
||||
["parent"]=>
|
||||
int(1)
|
||||
}
|
||||
object(MyMultipleIterator)#%d (2) {
|
||||
["child"]=>
|
||||
int(42)
|
||||
["parent"]=>
|
||||
int(1)
|
||||
}
|
||||
object(MyArrayObject)#%d (2) {
|
||||
["child"]=>
|
||||
int(42)
|
||||
["parent"]=>
|
||||
int(1)
|
||||
}
|
||||
object(MyArrayIterator)#%d (2) {
|
||||
["child"]=>
|
||||
int(42)
|
||||
["parent"]=>
|
||||
int(1)
|
||||
}
|
||||
object(MyMaxHeap)#%d (2) {
|
||||
["child"]=>
|
||||
int(42)
|
||||
["parent"]=>
|
||||
int(3)
|
||||
}
|
||||
object(MyPriorityQueue)#%d (2) {
|
||||
["child"]=>
|
||||
int(42)
|
||||
["parent"]=>
|
||||
int(3)
|
||||
}
|
Loading…
Reference in New Issue
Block a user