@@ -102,13 +102,18 @@ static void spl_fixedarray_init_elems(spl_fixedarray *array, zend_long from, zen
102102 }
103103}
104104
105+ static void spl_fixedarray_init_non_empty_struct (spl_fixedarray * array , zend_long size )
106+ {
107+ array -> size = 0 ; /* reset size in case ecalloc() fails */
108+ array -> elements = safe_emalloc (size , sizeof (zval ), 0 );
109+ array -> size = size ;
110+ array -> should_rebuild_properties = true;
111+ }
112+
105113static void spl_fixedarray_init (spl_fixedarray * array , zend_long size )
106114{
107115 if (size > 0 ) {
108- array -> size = 0 ; /* reset size in case ecalloc() fails */
109- array -> elements = safe_emalloc (size , sizeof (zval ), 0 );
110- array -> size = size ;
111- array -> should_rebuild_properties = true;
116+ spl_fixedarray_init_non_empty_struct (array , size );
112117 spl_fixedarray_init_elems (array , 0 , size );
113118 } else {
114119 spl_fixedarray_default_ctor (array );
@@ -582,6 +587,67 @@ PHP_METHOD(SplFixedArray, __wakeup)
582587 }
583588}
584589
590+ PHP_METHOD (SplFixedArray , __serialize )
591+ {
592+ spl_fixedarray_object * intern = Z_SPLFIXEDARRAY_P (ZEND_THIS );
593+ zval * current , tmp ;
594+
595+ if (zend_parse_parameters_none () == FAILURE ) {
596+ RETURN_THROWS ();
597+ }
598+
599+ array_init (return_value );
600+
601+ /* elements */
602+ array_init_size (& tmp , intern -> array .size );
603+
604+ for (zend_long i = 0 ; i < intern -> array .size ; i ++ ) {
605+ current = & intern -> array .elements [i ];
606+ zend_hash_next_index_insert (Z_ARRVAL (tmp ), current );
607+ Z_TRY_ADDREF_P (current );
608+ }
609+
610+ zend_hash_next_index_insert (Z_ARRVAL_P (return_value ), & tmp );
611+
612+ /* members */
613+ ZVAL_ARR (& tmp , zend_proptable_to_symtable (
614+ zend_std_get_properties (& intern -> std ), /* always_duplicate */ 1 ));
615+ zend_hash_next_index_insert (Z_ARRVAL_P (return_value ), & tmp );
616+ }
617+
618+ PHP_METHOD (SplFixedArray , __unserialize )
619+ {
620+ spl_fixedarray_object * intern = Z_SPLFIXEDARRAY_P (ZEND_THIS );
621+ HashTable * data ;
622+ zval * storage_zv , * members_zv , * elem ;
623+
624+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "h" , & data ) == FAILURE ) {
625+ RETURN_THROWS ();
626+ }
627+
628+ if (intern -> array .size == 0 ) {
629+ storage_zv = zend_hash_index_find (data , 0 );
630+ members_zv = zend_hash_index_find (data , 1 );
631+ if (!storage_zv || !members_zv ||
632+ Z_TYPE_P (storage_zv ) != IS_ARRAY || Z_TYPE_P (members_zv ) != IS_ARRAY
633+ ) {
634+ zend_throw_exception (spl_ce_UnexpectedValueException ,
635+ "Incomplete or ill-typed serialization data" , 0 );
636+ RETURN_THROWS ();
637+ }
638+
639+ zend_long size = zend_hash_num_elements (Z_ARRVAL_P (storage_zv ));
640+ spl_fixedarray_init_non_empty_struct (& intern -> array , size );
641+
642+ zend_long i = 0 ;
643+ ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (storage_zv ), elem ) {
644+ ZVAL_COPY (& intern -> array .elements [i ++ ], elem );
645+ } ZEND_HASH_FOREACH_END ();
646+
647+ object_properties_load (& intern -> std , Z_ARRVAL_P (members_zv ));
648+ }
649+ }
650+
585651PHP_METHOD (SplFixedArray , count )
586652{
587653 zval * object = ZEND_THIS ;
0 commit comments