@@ -2105,16 +2105,22 @@ ZEND_API uint32_t ZEND_FASTCALL zend_array_type_info(const zval *zv)
21052105 tmp |= MAY_BE_RCN ;
21062106 }
21072107
2108- ZEND_HASH_FOREACH_STR_KEY_VAL (ht , str , val ) {
2109- if (str ) {
2110- tmp |= MAY_BE_ARRAY_KEY_STRING ;
2111- } else {
2112- tmp |= MAY_BE_ARRAY_KEY_LONG ;
2113- }
2114- tmp |= 1 << (Z_TYPE_P (val ) + MAY_BE_ARRAY_SHIFT );
2115- } ZEND_HASH_FOREACH_END ();
2116- if (HT_IS_PACKED (ht )) {
2117- tmp &= ~(MAY_BE_ARRAY_NUMERIC_HASH |MAY_BE_ARRAY_STRING_HASH );
2108+ if (zend_hash_num_elements (ht ) == 0 ) {
2109+ tmp |= MAY_BE_ARRAY_EMPTY ;
2110+ } else if (HT_IS_PACKED (ht )) {
2111+ tmp |= MAY_BE_ARRAY_PACKED ;
2112+ ZEND_HASH_PACKED_FOREACH_VAL (ht , val ) {
2113+ tmp |= 1 << (Z_TYPE_P (val ) + MAY_BE_ARRAY_SHIFT );
2114+ } ZEND_HASH_FOREACH_END ();
2115+ } else {
2116+ ZEND_HASH_MAP_FOREACH_STR_KEY_VAL (ht , str , val ) {
2117+ if (str ) {
2118+ tmp |= MAY_BE_ARRAY_STRING_HASH ;
2119+ } else {
2120+ tmp |= MAY_BE_ARRAY_NUMERIC_HASH ;
2121+ }
2122+ tmp |= 1 << (Z_TYPE_P (val ) + MAY_BE_ARRAY_SHIFT );
2123+ } ZEND_HASH_FOREACH_END ();
21182124 }
21192125 return tmp ;
21202126}
@@ -2222,6 +2228,7 @@ static uint32_t assign_dim_array_result_type(
22222228 if (tmp & MAY_BE_ARRAY_KEY_ANY ) {
22232229 tmp |= (value_type & MAY_BE_ANY ) << MAY_BE_ARRAY_SHIFT ;
22242230 }
2231+ tmp &= ~MAY_BE_ARRAY_EMPTY ;
22252232 return tmp ;
22262233}
22272234
@@ -3656,6 +3663,9 @@ static zend_always_inline zend_result _zend_update_type_info(
36563663 break ;
36573664 }
36583665 }
3666+ if (opline -> opcode != ZEND_FETCH_DIM_FUNC_ARG ) {
3667+ tmp &= ~MAY_BE_ARRAY_EMPTY ;
3668+ }
36593669 }
36603670 if (((tmp & MAY_BE_ARRAY ) && (tmp & MAY_BE_ARRAY_KEY_ANY ))
36613671 || opline -> opcode == ZEND_FETCH_DIM_FUNC_ARG
@@ -3829,7 +3839,7 @@ static zend_always_inline zend_result _zend_update_type_info(
38293839 UPDATE_SSA_TYPE (MAY_BE_LONG , ssa_op -> result_def );
38303840 break ;
38313841 case ZEND_FUNC_GET_ARGS :
3832- UPDATE_SSA_TYPE (MAY_BE_RC1 |MAY_BE_RCN | MAY_BE_ARRAY | MAY_BE_ARRAY_PACKED | MAY_BE_ARRAY_OF_ANY , ssa_op -> result_def );
3842+ UPDATE_SSA_TYPE (MAY_BE_RC1 |MAY_BE_RCN |MAY_BE_ARRAY | MAY_BE_ARRAY_EMPTY | MAY_BE_ARRAY_PACKED | MAY_BE_ARRAY_OF_ANY , ssa_op -> result_def );
38333843 break ;
38343844 case ZEND_GET_CLASS :
38353845 case ZEND_GET_CALLED_CLASS :
0 commit comments