@@ -2988,7 +2988,7 @@ static void php_strtr_array(zval *return_value, zend_string *input, HashTable *p
2988
2988
size_t minlen = 128 * 1024 ;
2989
2989
size_t maxlen = 0 ;
2990
2990
HashTable str_hash ;
2991
- zval * entry , tmp , dummy ;
2991
+ zval * entry , dummy ;
2992
2992
char * key ;
2993
2993
smart_str result = {0 };
2994
2994
zend_ulong bitset [256 /sizeof (zend_ulong )];
@@ -3024,17 +3024,15 @@ static void php_strtr_array(zval *return_value, zend_string *input, HashTable *p
3024
3024
} ZEND_HASH_FOREACH_END ();
3025
3025
3026
3026
if (UNEXPECTED (num_keys )) {
3027
+ zend_string * key_used ;
3027
3028
/* we have to rebuild HashTable with numeric keys */
3028
3029
zend_hash_init (& str_hash , zend_hash_num_elements (pats ), NULL , NULL , 0 );
3029
3030
ZEND_HASH_FOREACH_KEY_VAL (pats , num_key , str_key , entry ) {
3030
3031
if (UNEXPECTED (!str_key )) {
3031
- ZVAL_LONG (& tmp , num_key );
3032
- convert_to_string (& tmp );
3033
- str_key = Z_STR (tmp );
3034
- len = str_key -> len ;
3032
+ key_used = zend_long_to_str (num_key );
3033
+ len = key_used -> len ;
3035
3034
if (UNEXPECTED (len > slen )) {
3036
3035
/* skip long patterns */
3037
- zval_dtor (& tmp );
3038
3036
continue ;
3039
3037
}
3040
3038
if (len > maxlen ) {
@@ -3045,17 +3043,18 @@ static void php_strtr_array(zval *return_value, zend_string *input, HashTable *p
3045
3043
}
3046
3044
/* remember possible key length */
3047
3045
num_bitset [len / sizeof (zend_ulong )] |= Z_UL (1 ) << (len % sizeof (zend_ulong ));
3048
- bitset [((unsigned char )str_key -> val [0 ]) / sizeof (zend_ulong )] |= Z_UL (1 ) << (((unsigned char )str_key -> val [0 ]) % sizeof (zend_ulong ));
3046
+ bitset [((unsigned char )key_used -> val [0 ]) / sizeof (zend_ulong )] |= Z_UL (1 ) << (((unsigned char )key_used -> val [0 ]) % sizeof (zend_ulong ));
3049
3047
} else {
3050
- len = str_key -> len ;
3048
+ key_used = str_key ;
3049
+ len = key_used -> len ;
3051
3050
if (UNEXPECTED (len > slen )) {
3052
3051
/* skip long patterns */
3053
3052
continue ;
3054
3053
}
3055
3054
}
3056
- zend_hash_add (& str_hash , str_key , entry );
3057
- if (str_key == Z_STR ( tmp )) {
3058
- zval_dtor ( & tmp );
3055
+ zend_hash_add (& str_hash , key_used , entry );
3056
+ if (UNEXPECTED (! str_key )) {
3057
+ zend_string_release ( key_used );
3059
3058
}
3060
3059
} ZEND_HASH_FOREACH_END ();
3061
3060
pats = & str_hash ;
0 commit comments