diff --git a/NEWS b/NEWS index a94dba55f9c..96a584999bb 100644 --- a/NEWS +++ b/NEWS @@ -2,10 +2,6 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.3.0RC4 -- Core: - . Fixed bug GH-10008 (Narrowing occurred during type inference of - ZEND_ADD_ARRAY_ELEMENT). (nielsdos, arnaud-lb) - - CType: . Fixed bug GH-11997 (ctype_alnum 5 times slower in PHP 8.1 or greater). (nielsdos) diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 3c192577529..dd71215980f 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -1942,21 +1942,6 @@ ZEND_API uint32_t zend_array_element_type(uint32_t t1, uint8_t op_type, int writ return tmp; } -static zend_always_inline uint32_t assign_long_dim_array_result_type(uint32_t arr_type) -{ - /* Rules: - * HASH_ONLY -> MAY_BE_ARRAY_NUMERIC_HASH - * PACKED_ONLY -> MAY_BE_ARRAY_NUMERIC_HASH | MAY_BE_ARRAY_PACKED (== MAY_BE_ARRAY_KEY_LONG) - * HASH || PACKED -> MAY_BE_ARRAY_NUMERIC_HASH | MAY_BE_ARRAY_PACKED (== MAY_BE_ARRAY_KEY_LONG) - * 0 -> MAY_BE_ARRAY_NUMERIC_HASH - */ - if (MAY_BE_PACKED(arr_type)) { - return MAY_BE_ARRAY_KEY_LONG; - } else { - return MAY_BE_ARRAY_NUMERIC_HASH; - } -} - static uint32_t assign_dim_array_result_type( uint32_t arr_type, uint32_t dim_type, uint32_t value_type, uint8_t dim_op_type) { uint32_t tmp = 0; @@ -1970,13 +1955,13 @@ static uint32_t assign_dim_array_result_type( if (arr_type & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE)) { tmp |= MAY_BE_ARRAY_PACKED; } - tmp |= assign_long_dim_array_result_type(arr_type); + tmp |= MAY_BE_HASH_ONLY(arr_type) ? MAY_BE_ARRAY_NUMERIC_HASH : MAY_BE_ARRAY_KEY_LONG; } else { if (dim_type & (MAY_BE_LONG|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_RESOURCE|MAY_BE_DOUBLE)) { if (arr_type & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE)) { tmp |= MAY_BE_ARRAY_PACKED; } - tmp |= assign_long_dim_array_result_type(arr_type); + tmp |= MAY_BE_HASH_ONLY(arr_type) ? MAY_BE_ARRAY_NUMERIC_HASH : MAY_BE_ARRAY_KEY_LONG; } if (dim_type & MAY_BE_STRING) { tmp |= MAY_BE_ARRAY_KEY_STRING; @@ -1985,7 +1970,7 @@ static uint32_t assign_dim_array_result_type( if (arr_type & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE)) { tmp |= MAY_BE_ARRAY_PACKED; } - tmp |= assign_long_dim_array_result_type(arr_type); + tmp |= MAY_BE_HASH_ONLY(arr_type) ? MAY_BE_ARRAY_NUMERIC_HASH : MAY_BE_ARRAY_KEY_LONG; } } if (dim_type & (MAY_BE_UNDEF|MAY_BE_NULL)) { @@ -3305,7 +3290,8 @@ static zend_always_inline zend_result _zend_update_type_info( key_type |= MAY_BE_ARRAY_PACKED; } if (t1 & MAY_BE_ARRAY) { - key_type |= assign_long_dim_array_result_type(t1); + key_type |= MAY_BE_HASH_ONLY(t1) ? + MAY_BE_ARRAY_NUMERIC_HASH : MAY_BE_ARRAY_KEY_LONG; } } else { if (t2 & (MAY_BE_LONG|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_RESOURCE|MAY_BE_DOUBLE)) { @@ -3313,7 +3299,8 @@ static zend_always_inline zend_result _zend_update_type_info( key_type |= MAY_BE_ARRAY_PACKED; } if (t1 & MAY_BE_ARRAY) { - key_type |= assign_long_dim_array_result_type(t1); + key_type |= MAY_BE_HASH_ONLY(t1) ? + MAY_BE_ARRAY_NUMERIC_HASH : MAY_BE_ARRAY_KEY_LONG; } } if (t2 & MAY_BE_STRING) { @@ -3324,7 +3311,8 @@ static zend_always_inline zend_result _zend_update_type_info( key_type |= MAY_BE_ARRAY_PACKED; } if (t1 & MAY_BE_ARRAY) { - key_type |= assign_long_dim_array_result_type(t1); + key_type |= MAY_BE_HASH_ONLY(t1) ? + MAY_BE_ARRAY_NUMERIC_HASH : MAY_BE_ARRAY_KEY_LONG; } } } diff --git a/ext/opcache/tests/opt/gh10008.phpt b/ext/opcache/tests/opt/gh10008.phpt deleted file mode 100644 index e92b7137bdb..00000000000 --- a/ext/opcache/tests/opt/gh10008.phpt +++ /dev/null @@ -1,30 +0,0 @@ ---TEST-- -GH-10008 (Narrowing occurred during type inference of ZEND_ADD_ARRAY_ELEMENT) ---INI-- -opcache.enable=1 -opcache.enable_cli=1 -opcache.optimization_level=0x20 ---EXTENSIONS-- -opcache ---FILE-- - $bool, $string_key => 123]; - } - - $bool = false; - } -} - -echo "Done\n"; - -?> ---EXPECT-- -Done