@@ -76,12 +76,19 @@ static inline spl_fixedarray_object *spl_fixed_array_from_obj(zend_object *obj)
76
76
77
77
#define Z_SPLFIXEDARRAY_P (zv ) spl_fixed_array_from_obj(Z_OBJ_P((zv)))
78
78
79
+ static inline void spl_fixedarray_init_elems (spl_fixedarray * array , size_t from , size_t to ) {
80
+ for (size_t i = from ; i < to ; i ++ ) {
81
+ ZVAL_NULL (& array -> elements [i ]);
82
+ }
83
+ }
84
+
79
85
static void spl_fixedarray_init (spl_fixedarray * array , zend_long size ) /* {{{ */
80
86
{
81
87
if (size > 0 ) {
82
88
array -> size = 0 ; /* reset size in case ecalloc() fails */
83
- array -> elements = ecalloc (size , sizeof (zval ));
89
+ array -> elements = safe_emalloc (size , sizeof (zval ), 0 );
84
90
array -> size = size ;
91
+ spl_fixedarray_init_elems (array , 0 , size );
85
92
} else {
86
93
array -> elements = NULL ;
87
94
array -> size = 0 ;
@@ -116,7 +123,7 @@ static void spl_fixedarray_resize(spl_fixedarray *array, zend_long size) /* {{{
116
123
}
117
124
} else if (size > array -> size ) {
118
125
array -> elements = safe_erealloc (array -> elements , size , sizeof (zval ), 0 );
119
- memset (array -> elements + array -> size , '\0' , sizeof ( zval ) * ( size - array -> size ) );
126
+ spl_fixedarray_init_elems (array , array -> size , size );
120
127
} else { /* size < array->size */
121
128
zend_long i ;
122
129
@@ -161,12 +168,8 @@ static HashTable* spl_fixedarray_object_get_properties(zend_object *obj) /* {{{{
161
168
zend_long j = zend_hash_num_elements (ht );
162
169
163
170
for (i = 0 ; i < intern -> array .size ; i ++ ) {
164
- if (!Z_ISUNDEF (intern -> array .elements [i ])) {
165
- zend_hash_index_update (ht , i , & intern -> array .elements [i ]);
166
- Z_TRY_ADDREF (intern -> array .elements [i ]);
167
- } else {
168
- zend_hash_index_update (ht , i , & EG (uninitialized_zval ));
169
- }
171
+ zend_hash_index_update (ht , i , & intern -> array .elements [i ]);
172
+ Z_TRY_ADDREF (intern -> array .elements [i ]);
170
173
}
171
174
if (j > intern -> array .size ) {
172
175
for (i = intern -> array .size ; i < j ; ++ i ) {
@@ -323,8 +326,6 @@ static inline zval *spl_fixedarray_object_read_dimension_helper(spl_fixedarray_o
323
326
if (index < 0 || index >= intern -> array .size ) {
324
327
zend_throw_exception (spl_ce_RuntimeException , "Index invalid or out of range" , 0 );
325
328
return NULL ;
326
- } else if (Z_ISUNDEF (intern -> array .elements [index ])) {
327
- return NULL ;
328
329
} else {
329
330
return & intern -> array .elements [index ];
330
331
}
@@ -392,9 +393,7 @@ static inline void spl_fixedarray_object_write_dimension_helper(spl_fixedarray_o
392
393
zend_throw_exception (spl_ce_RuntimeException , "Index invalid or out of range" , 0 );
393
394
return ;
394
395
} else {
395
- if (!Z_ISUNDEF (intern -> array .elements [index ])) {
396
- zval_ptr_dtor (& (intern -> array .elements [index ]));
397
- }
396
+ zval_ptr_dtor (& (intern -> array .elements [index ]));
398
397
ZVAL_COPY_DEREF (& intern -> array .elements [index ], value );
399
398
}
400
399
}
@@ -440,7 +439,7 @@ static inline void spl_fixedarray_object_unset_dimension_helper(spl_fixedarray_o
440
439
return ;
441
440
} else {
442
441
zval_ptr_dtor (& (intern -> array .elements [index ]));
443
- ZVAL_UNDEF (& intern -> array .elements [index ]);
442
+ ZVAL_NULL (& intern -> array .elements [index ]);
444
443
}
445
444
}
446
445
/* }}} */
@@ -459,7 +458,6 @@ static void spl_fixedarray_object_unset_dimension(zend_object *object, zval *off
459
458
}
460
459
461
460
spl_fixedarray_object_unset_dimension_helper (intern , offset );
462
-
463
461
}
464
462
/* }}} */
465
463
@@ -477,16 +475,10 @@ static inline int spl_fixedarray_object_has_dimension_helper(spl_fixedarray_obje
477
475
if (index < 0 || index >= intern -> array .size ) {
478
476
retval = 0 ;
479
477
} else {
480
- if (Z_ISUNDEF (intern -> array .elements [index ])) {
481
- retval = 0 ;
482
- } else if (check_empty ) {
483
- if (zend_is_true (& intern -> array .elements [index ])) {
484
- retval = 1 ;
485
- } else {
486
- retval = 0 ;
487
- }
488
- } else { /* != NULL and !check_empty */
489
- retval = 1 ;
478
+ if (check_empty ) {
479
+ retval = zend_is_true (& intern -> array .elements [index ]);
480
+ } else {
481
+ retval = Z_TYPE (intern -> array .elements [index ]) != IS_NULL ;
490
482
}
491
483
}
492
484
@@ -628,12 +620,8 @@ SPL_METHOD(SplFixedArray, toArray)
628
620
629
621
array_init (return_value );
630
622
for (; i < intern -> array .size ; i ++ ) {
631
- if (!Z_ISUNDEF (intern -> array .elements [i ])) {
632
- zend_hash_index_update (Z_ARRVAL_P (return_value ), i , & intern -> array .elements [i ]);
633
- Z_TRY_ADDREF (intern -> array .elements [i ]);
634
- } else {
635
- zend_hash_index_update (Z_ARRVAL_P (return_value ), i , & EG (uninitialized_zval ));
636
- }
623
+ zend_hash_index_update (Z_ARRVAL_P (return_value ), i , & intern -> array .elements [i ]);
624
+ Z_TRY_ADDREF (intern -> array .elements [i ]);
637
625
}
638
626
} else {
639
627
RETURN_EMPTY_ARRAY ();
0 commit comments