@@ -2149,7 +2149,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_merge(HashTable *target, HashTable *source
21492149{
21502150 uint32_t idx ;
21512151 Bucket * p ;
2152- zval * t ;
2152+ zval * t , * s ;
21532153
21542154 IS_CONSISTENT (source );
21552155 IS_CONSISTENT (target );
@@ -2158,18 +2158,20 @@ ZEND_API void ZEND_FASTCALL zend_hash_merge(HashTable *target, HashTable *source
21582158 if (overwrite ) {
21592159 for (idx = 0 ; idx < source -> nNumUsed ; idx ++ ) {
21602160 p = source -> arData + idx ;
2161- if (UNEXPECTED (Z_TYPE (p -> val ) == IS_UNDEF )) continue ;
2162- if (UNEXPECTED (Z_TYPE (p -> val ) == IS_INDIRECT ) &&
2163- UNEXPECTED (Z_TYPE_P (Z_INDIRECT (p -> val )) == IS_UNDEF )) {
2164- continue ;
2161+ s = & p -> val ;
2162+ if (UNEXPECTED (Z_TYPE_P (s ) == IS_INDIRECT )) {
2163+ s = Z_INDIRECT_P (s );
2164+ }
2165+ if (UNEXPECTED (Z_TYPE_P (s ) == IS_UNDEF )) {
2166+ continue ;
21652167 }
21662168 if (p -> key ) {
2167- t = _zend_hash_add_or_update_i (target , p -> key , & p -> val , HASH_UPDATE | HASH_UPDATE_INDIRECT );
2169+ t = _zend_hash_add_or_update_i (target , p -> key , s , HASH_UPDATE | HASH_UPDATE_INDIRECT );
21682170 if (pCopyConstructor ) {
21692171 pCopyConstructor (t );
21702172 }
21712173 } else {
2172- t = zend_hash_index_update (target , p -> h , & p -> val );
2174+ t = zend_hash_index_update (target , p -> h , s );
21732175 if (pCopyConstructor ) {
21742176 pCopyConstructor (t );
21752177 }
@@ -2178,18 +2180,20 @@ ZEND_API void ZEND_FASTCALL zend_hash_merge(HashTable *target, HashTable *source
21782180 } else {
21792181 for (idx = 0 ; idx < source -> nNumUsed ; idx ++ ) {
21802182 p = source -> arData + idx ;
2181- if (UNEXPECTED (Z_TYPE (p -> val ) == IS_UNDEF )) continue ;
2182- if (UNEXPECTED (Z_TYPE (p -> val ) == IS_INDIRECT ) &&
2183- UNEXPECTED (Z_TYPE_P (Z_INDIRECT (p -> val )) == IS_UNDEF )) {
2184- continue ;
2183+ s = & p -> val ;
2184+ if (UNEXPECTED (Z_TYPE_P (s ) == IS_INDIRECT )) {
2185+ s = Z_INDIRECT_P (s );
2186+ }
2187+ if (UNEXPECTED (Z_TYPE_P (s ) == IS_UNDEF )) {
2188+ continue ;
21852189 }
21862190 if (p -> key ) {
2187- t = _zend_hash_add_or_update_i (target , p -> key , & p -> val , HASH_ADD | HASH_UPDATE_INDIRECT );
2191+ t = _zend_hash_add_or_update_i (target , p -> key , s , HASH_ADD | HASH_UPDATE_INDIRECT );
21882192 if (t && pCopyConstructor ) {
21892193 pCopyConstructor (t );
21902194 }
21912195 } else {
2192- t = zend_hash_index_add (target , p -> h , & p -> val );
2196+ t = zend_hash_index_add (target , p -> h , s );
21932197 if (t && pCopyConstructor ) {
21942198 pCopyConstructor (t );
21952199 }
0 commit comments