@@ -2105,18 +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 ();
21182115 } else {
2119- tmp &= ~MAY_BE_ARRAY_PACKED ;
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 ();
21202124 }
21212125 return tmp ;
21222126}
@@ -2224,6 +2228,7 @@ static uint32_t assign_dim_array_result_type(
22242228 if (tmp & MAY_BE_ARRAY_KEY_ANY ) {
22252229 tmp |= (value_type & MAY_BE_ANY ) << MAY_BE_ARRAY_SHIFT ;
22262230 }
2231+ tmp &= ~MAY_BE_ARRAY_EMPTY ;
22272232 return tmp ;
22282233}
22292234
@@ -3662,6 +3667,9 @@ static zend_always_inline zend_result _zend_update_type_info(
36623667 break ;
36633668 }
36643669 }
3670+ if (opline -> opcode != ZEND_FETCH_DIM_FUNC_ARG ) {
3671+ tmp &= ~MAY_BE_ARRAY_EMPTY ;
3672+ }
36653673 }
36663674 if (((tmp & MAY_BE_ARRAY ) && (tmp & MAY_BE_ARRAY_KEY_ANY ))
36673675 || opline -> opcode == ZEND_FETCH_DIM_FUNC_ARG
@@ -3829,7 +3837,7 @@ static zend_always_inline zend_result _zend_update_type_info(
38293837 UPDATE_SSA_TYPE (MAY_BE_LONG , ssa_op -> result_def );
38303838 break ;
38313839 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 );
3840+ 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 );
38333841 break ;
38343842 case ZEND_GET_CLASS :
38353843 case ZEND_GET_CALLED_CLASS :
0 commit comments