@@ -2124,7 +2124,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_merge(HashTable *target, HashTable *source
21242124{
21252125 uint32_t idx ;
21262126 Bucket * p ;
2127- zval * t ;
2127+ zval * t , * s ;
21282128
21292129 IS_CONSISTENT (source );
21302130 IS_CONSISTENT (target );
@@ -2133,18 +2133,20 @@ ZEND_API void ZEND_FASTCALL zend_hash_merge(HashTable *target, HashTable *source
21332133 if (overwrite ) {
21342134 for (idx = 0 ; idx < source -> nNumUsed ; idx ++ ) {
21352135 p = source -> arData + idx ;
2136- if (UNEXPECTED (Z_TYPE (p -> val ) == IS_UNDEF )) continue ;
2137- if (UNEXPECTED (Z_TYPE (p -> val ) == IS_INDIRECT ) &&
2138- UNEXPECTED (Z_TYPE_P (Z_INDIRECT (p -> val )) == IS_UNDEF )) {
2139- continue ;
2136+ s = & p -> val ;
2137+ if (UNEXPECTED (Z_TYPE_P (s ) == IS_INDIRECT )) {
2138+ s = Z_INDIRECT_P (s );
2139+ }
2140+ if (UNEXPECTED (Z_TYPE_P (s ) == IS_UNDEF )) {
2141+ continue ;
21402142 }
21412143 if (p -> key ) {
2142- t = _zend_hash_add_or_update_i (target , p -> key , & p -> val , HASH_UPDATE | HASH_UPDATE_INDIRECT );
2144+ t = _zend_hash_add_or_update_i (target , p -> key , s , HASH_UPDATE | HASH_UPDATE_INDIRECT );
21432145 if (pCopyConstructor ) {
21442146 pCopyConstructor (t );
21452147 }
21462148 } else {
2147- t = zend_hash_index_update (target , p -> h , & p -> val );
2149+ t = zend_hash_index_update (target , p -> h , s );
21482150 if (pCopyConstructor ) {
21492151 pCopyConstructor (t );
21502152 }
@@ -2153,18 +2155,20 @@ ZEND_API void ZEND_FASTCALL zend_hash_merge(HashTable *target, HashTable *source
21532155 } else {
21542156 for (idx = 0 ; idx < source -> nNumUsed ; idx ++ ) {
21552157 p = source -> arData + idx ;
2156- if (UNEXPECTED (Z_TYPE (p -> val ) == IS_UNDEF )) continue ;
2157- if (UNEXPECTED (Z_TYPE (p -> val ) == IS_INDIRECT ) &&
2158- UNEXPECTED (Z_TYPE_P (Z_INDIRECT (p -> val )) == IS_UNDEF )) {
2159- continue ;
2158+ s = & p -> val ;
2159+ if (UNEXPECTED (Z_TYPE_P (s ) == IS_INDIRECT )) {
2160+ s = Z_INDIRECT_P (s );
2161+ }
2162+ if (UNEXPECTED (Z_TYPE_P (s ) == IS_UNDEF )) {
2163+ continue ;
21602164 }
21612165 if (p -> key ) {
2162- t = _zend_hash_add_or_update_i (target , p -> key , & p -> val , HASH_ADD | HASH_UPDATE_INDIRECT );
2166+ t = _zend_hash_add_or_update_i (target , p -> key , s , HASH_ADD | HASH_UPDATE_INDIRECT );
21632167 if (t && pCopyConstructor ) {
21642168 pCopyConstructor (t );
21652169 }
21662170 } else {
2167- t = zend_hash_index_add (target , p -> h , & p -> val );
2171+ t = zend_hash_index_add (target , p -> h , s );
21682172 if (t && pCopyConstructor ) {
21692173 pCopyConstructor (t );
21702174 }
0 commit comments