Merge branch 'PHP-7.4'

* PHP-7.4:
  Fix #69264: __debugInfo() ignored while extending SPL classes
This commit is contained in:
Christoph M. Becker 2020-04-06 12:03:01 +02:00
commit 9809713844
16 changed files with 227 additions and 33 deletions

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -90,6 +90,9 @@ class SplFileInfo
public function __toString(): string {}
/** @return array */
public function __debugInfo() {}
/** @return void */
final public function _bad_state_ex() {}
}

View File

@ -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)

View File

@ -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;

View File

@ -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() {}

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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() {}
}

View File

@ -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
View 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)
}