@@ -102,13 +102,18 @@ static void spl_fixedarray_init_elems(spl_fixedarray *array, zend_long from, zen
102
102
}
103
103
}
104
104
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
+
105
113
static void spl_fixedarray_init (spl_fixedarray * array , zend_long size )
106
114
{
107
115
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 );
112
117
spl_fixedarray_init_elems (array , 0 , size );
113
118
} else {
114
119
spl_fixedarray_default_ctor (array );
@@ -582,6 +587,67 @@ PHP_METHOD(SplFixedArray, __wakeup)
582
587
}
583
588
}
584
589
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
+
585
651
PHP_METHOD (SplFixedArray , count )
586
652
{
587
653
zval * object = ZEND_THIS ;
0 commit comments