@@ -1812,6 +1812,80 @@ SPL_METHOD(Array, unserialize)
18121812
18131813} /* }}} */
18141814
1815+ /* {{{ proto array ArrayObject::__serialize() */
1816+ SPL_METHOD (Array , __serialize )
1817+ {
1818+ spl_array_object * intern = Z_SPLARRAY_P (ZEND_THIS );
1819+ zval tmp ;
1820+
1821+ if (zend_parse_parameters_none_throw () == FAILURE ) {
1822+ return ;
1823+ }
1824+
1825+ array_init (return_value );
1826+
1827+ /* flags */
1828+ ZVAL_LONG (& tmp , (intern -> ar_flags & SPL_ARRAY_CLONE_MASK ));
1829+ zend_hash_next_index_insert (Z_ARRVAL_P (return_value ), & tmp );
1830+
1831+ /* storage */
1832+ if (intern -> ar_flags & SPL_ARRAY_IS_SELF ) {
1833+ ZVAL_NULL (& tmp );
1834+ } else {
1835+ ZVAL_COPY (& tmp , & intern -> array );
1836+ }
1837+ zend_hash_next_index_insert (Z_ARRVAL_P (return_value ), & tmp );
1838+
1839+ /* members */
1840+ ZVAL_ARR (& tmp , zend_std_get_properties (ZEND_THIS ));
1841+ Z_TRY_ADDREF (tmp );
1842+ zend_hash_next_index_insert (Z_ARRVAL_P (return_value ), & tmp );
1843+ }
1844+ /* }}} */
1845+
1846+
1847+ /* {{{ proto void ArrayObject::__unserialize(array data) */
1848+ SPL_METHOD (Array , __unserialize )
1849+ {
1850+ spl_array_object * intern = Z_SPLARRAY_P (ZEND_THIS );
1851+ HashTable * data ;
1852+ zval * flags_zv , * storage_zv , * members_zv ;
1853+ zend_long flags ;
1854+
1855+ if (zend_parse_parameters_throw (ZEND_NUM_ARGS (), "h" , & data ) == FAILURE ) {
1856+ return ;
1857+ }
1858+
1859+ flags_zv = zend_hash_index_find (data , 0 );
1860+ storage_zv = zend_hash_index_find (data , 1 );
1861+ members_zv = zend_hash_index_find (data , 2 );
1862+ if (!flags_zv || !storage_zv || !members_zv ||
1863+ Z_TYPE_P (flags_zv ) != IS_LONG || Z_TYPE_P (members_zv ) != IS_ARRAY ) {
1864+ zend_throw_exception (spl_ce_UnexpectedValueException ,
1865+ "Incomplete or ill-typed serialization data" , 0 );
1866+ return ;
1867+ }
1868+
1869+ flags = Z_LVAL_P (flags_zv );
1870+ intern -> ar_flags &= ~SPL_ARRAY_CLONE_MASK ;
1871+ intern -> ar_flags |= flags & SPL_ARRAY_CLONE_MASK ;
1872+
1873+ if (flags & SPL_ARRAY_IS_SELF ) {
1874+ zval_ptr_dtor (& intern -> array );
1875+ ZVAL_UNDEF (& intern -> array );
1876+ } else if (Z_TYPE_P (storage_zv ) == IS_ARRAY ) {
1877+ zval_ptr_dtor (& intern -> array );
1878+ ZVAL_COPY_VALUE (& intern -> array , storage_zv );
1879+ ZVAL_NULL (storage_zv );
1880+ SEPARATE_ARRAY (& intern -> array );
1881+ } else {
1882+ spl_array_set_array (ZEND_THIS , intern , storage_zv , 0L , 1 );
1883+ }
1884+
1885+ object_properties_load (& intern -> std , Z_ARRVAL_P (members_zv ));
1886+ }
1887+ /* }}} */
1888+
18151889/* {{{ arginfo and function table */
18161890ZEND_BEGIN_ARG_INFO_EX (arginfo_array___construct , 0 , 0 , 0 )
18171891 ZEND_ARG_INFO (0 , input )
@@ -1884,6 +1958,8 @@ static const zend_function_entry spl_funcs_ArrayObject[] = {
18841958 SPL_ME (Array , natcasesort , arginfo_array_void , ZEND_ACC_PUBLIC )
18851959 SPL_ME (Array , unserialize , arginfo_array_unserialize , ZEND_ACC_PUBLIC )
18861960 SPL_ME (Array , serialize , arginfo_array_void , ZEND_ACC_PUBLIC )
1961+ SPL_ME (Array , __unserialize , arginfo_array_unserialize , ZEND_ACC_PUBLIC )
1962+ SPL_ME (Array , __serialize , arginfo_array_void , ZEND_ACC_PUBLIC )
18871963 /* ArrayObject specific */
18881964 SPL_ME (Array , getIterator , arginfo_array_void , ZEND_ACC_PUBLIC )
18891965 SPL_ME (Array , exchangeArray , arginfo_array_exchangeArray , ZEND_ACC_PUBLIC )
@@ -1911,6 +1987,8 @@ static const zend_function_entry spl_funcs_ArrayIterator[] = {
19111987 SPL_ME (Array , natcasesort , arginfo_array_void , ZEND_ACC_PUBLIC )
19121988 SPL_ME (Array , unserialize , arginfo_array_unserialize , ZEND_ACC_PUBLIC )
19131989 SPL_ME (Array , serialize , arginfo_array_void , ZEND_ACC_PUBLIC )
1990+ SPL_ME (Array , __unserialize , arginfo_array_unserialize , ZEND_ACC_PUBLIC )
1991+ SPL_ME (Array , __serialize , arginfo_array_void , ZEND_ACC_PUBLIC )
19141992 /* ArrayIterator specific */
19151993 SPL_ME (Array , rewind , arginfo_array_void , ZEND_ACC_PUBLIC )
19161994 SPL_ME (Array , current , arginfo_array_void , ZEND_ACC_PUBLIC )
0 commit comments