@@ -6736,40 +6736,68 @@ PHP_FUNCTION(array_map)
67366736 ZEND_PARSE_PARAMETERS_END ();
67376737
67386738 if (n_arrays == 1 ) {
6739- zend_ulong num_key ;
6740- zend_string * str_key ;
6741-
67426739 if (Z_TYPE (arrays [0 ]) != IS_ARRAY ) {
67436740 zend_argument_type_error (2 , "must be of type array, %s given" , zend_zval_value_name (& arrays [0 ]));
67446741 RETURN_THROWS ();
67456742 }
6746- maxlen = zend_hash_num_elements (Z_ARRVAL (arrays [0 ]));
6743+ const HashTable * input = Z_ARRVAL (arrays [0 ]);
6744+ maxlen = zend_hash_num_elements (input );
67476745
67486746 /* Short-circuit: if no callback and only one array, just return it. */
67496747 if (!ZEND_FCI_INITIALIZED (fci ) || !maxlen ) {
67506748 ZVAL_COPY (return_value , & arrays [0 ]);
67516749 return ;
67526750 }
67536751
6754- array_init_size (return_value , maxlen );
6755- zend_hash_real_init (Z_ARRVAL_P (return_value ), HT_IS_PACKED (Z_ARRVAL (arrays [0 ])));
6752+ HashTable * output ;
6753+ if (HT_IS_PACKED (input )) {
6754+ array_init_size (return_value , input -> nNumUsed );
6755+ output = Z_ARRVAL_P (return_value );
6756+ zend_hash_real_init_packed (output );
6757+ } else {
6758+ array_init_size (return_value , maxlen );
6759+ output = Z_ARRVAL_P (return_value );
6760+ zend_hash_real_init_mixed (output );
6761+ }
67566762
67576763 fci .retval = & result ;
67586764 fci .param_count = 1 ;
67596765
6760- ZEND_HASH_FOREACH_KEY_VAL (Z_ARRVAL (arrays [0 ]), num_key , str_key , fci .params ) {
6761- zend_result ret = zend_call_function (& fci , & fci_cache );
6762- ZEND_ASSERT (ret == SUCCESS );
6763- if (Z_TYPE (result ) == IS_UNDEF ) {
6764- zend_array_destroy (Z_ARR_P (return_value ));
6765- RETURN_NULL ();
6766- }
6767- if (str_key ) {
6768- _zend_hash_append (Z_ARRVAL_P (return_value ), str_key , & result );
6769- } else {
6770- zend_hash_index_add_new (Z_ARRVAL_P (return_value ), num_key , & result );
6771- }
6772- } ZEND_HASH_FOREACH_END ();
6766+ if (HT_IS_PACKED (input )) {
6767+ ZEND_HASH_FILL_PACKED (output ) {
6768+ for (zval * cur = input -> arPacked , * end = input -> arPacked + input -> nNumUsed ; cur != end ; cur ++ ) {
6769+ if (EXPECTED (!Z_ISUNDEF_P (cur ))) {
6770+ fci .params = cur ;
6771+ zend_result ret = zend_call_function (& fci , & fci_cache );
6772+ ZEND_ASSERT (ret == SUCCESS );
6773+ if (UNEXPECTED (Z_ISUNDEF (result ))) {
6774+ ZEND_HASH_FILL_FINISH ();
6775+ zend_array_destroy (output );
6776+ RETURN_NULL ();
6777+ }
6778+ } else {
6779+ ZVAL_UNDEF (& result );
6780+ }
6781+ ZEND_HASH_FILL_ADD (& result );
6782+ }
6783+ } ZEND_HASH_FILL_END ();
6784+ } else {
6785+ zend_ulong num_key ;
6786+ zend_string * str_key ;
6787+ ZEND_HASH_MAP_FOREACH_KEY_VAL (input , num_key , str_key , fci .params ) {
6788+ zend_result ret = zend_call_function (& fci , & fci_cache );
6789+ ZEND_ASSERT (ret == SUCCESS );
6790+ if (UNEXPECTED (Z_ISUNDEF (result ))) {
6791+ zend_array_destroy (output );
6792+ RETURN_NULL ();
6793+ }
6794+ if (str_key ) {
6795+ _zend_hash_append (output , str_key , & result );
6796+ } else {
6797+ zend_hash_index_add_new (output , num_key , & result );
6798+ }
6799+ } ZEND_HASH_FOREACH_END ();
6800+ }
67736801 } else {
67746802 uint32_t * array_pos = (HashPosition * )ecalloc (n_arrays , sizeof (HashPosition ));
67756803
0 commit comments