@@ -2206,91 +2206,67 @@ ZEND_API int ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, co
2206
2206
return SUCCESS ;
2207
2207
}
2208
2208
2209
-
2210
- ZEND_API int zend_hash_compare (HashTable * ht1 , HashTable * ht2 , compare_func_t compar , zend_bool ordered )
2211
- {
2209
+ static zend_always_inline int zend_hash_compare_impl (HashTable * ht1 , HashTable * ht2 , compare_func_t compar , zend_bool ordered ) {
2212
2210
uint32_t idx1 , idx2 ;
2213
- Bucket * p1 , * p2 = NULL ;
2214
- int result ;
2215
- zval * pData1 , * pData2 ;
2216
-
2217
- IS_CONSISTENT (ht1 );
2218
- IS_CONSISTENT (ht2 );
2219
-
2220
- HASH_PROTECT_RECURSION (ht1 );
2221
- HASH_PROTECT_RECURSION (ht2 );
2222
2211
2223
2212
if (ht1 -> nNumOfElements != ht2 -> nNumOfElements ) {
2224
- HASH_UNPROTECT_RECURSION (ht1 );
2225
- HASH_UNPROTECT_RECURSION (ht2 );
2226
2213
return ht1 -> nNumOfElements > ht2 -> nNumOfElements ? 1 : -1 ;
2227
2214
}
2228
2215
2229
2216
for (idx1 = 0 , idx2 = 0 ; idx1 < ht1 -> nNumUsed ; idx1 ++ ) {
2230
- p1 = ht1 -> arData + idx1 ;
2231
- if (Z_TYPE (p1 -> val ) == IS_UNDEF ) continue ;
2217
+ Bucket * p1 = ht1 -> arData + idx1 , * p2 ;
2218
+ zval * pData1 , * pData2 ;
2219
+ int result ;
2232
2220
2221
+ if (Z_TYPE (p1 -> val ) == IS_UNDEF ) continue ;
2233
2222
if (ordered ) {
2234
2223
while (1 ) {
2224
+ ZEND_ASSERT (idx2 != ht2 -> nNumUsed );
2235
2225
p2 = ht2 -> arData + idx2 ;
2236
- if (idx2 == ht2 -> nNumUsed ) {
2237
- HASH_UNPROTECT_RECURSION (ht1 );
2238
- HASH_UNPROTECT_RECURSION (ht2 );
2239
- return 1 ; /* That's not supposed to happen */
2240
- }
2241
2226
if (Z_TYPE (p2 -> val ) != IS_UNDEF ) break ;
2242
2227
idx2 ++ ;
2243
2228
}
2244
2229
if (p1 -> key == NULL && p2 -> key == NULL ) { /* numeric indices */
2245
2230
if (p1 -> h != p2 -> h ) {
2246
- HASH_UNPROTECT_RECURSION (ht1 );
2247
- HASH_UNPROTECT_RECURSION (ht2 );
2248
2231
return p1 -> h > p2 -> h ? 1 : -1 ;
2249
2232
}
2250
2233
} else if (p1 -> key != NULL && p2 -> key != NULL ) { /* string indices */
2251
2234
if (p1 -> key -> len != p2 -> key -> len ) {
2252
- HASH_UNPROTECT_RECURSION (ht1 );
2253
- HASH_UNPROTECT_RECURSION (ht2 );
2254
2235
return p1 -> key -> len > p2 -> key -> len ? 1 : -1 ;
2255
2236
}
2256
2237
2257
2238
result = memcmp (p1 -> key -> val , p2 -> key -> val , p1 -> key -> len );
2258
2239
if (result != 0 ) {
2259
- HASH_UNPROTECT_RECURSION (ht1 );
2260
- HASH_UNPROTECT_RECURSION (ht2 );
2261
2240
return result ;
2262
2241
}
2263
2242
} else {
2264
2243
/* Mixed key types: A string key is considered as larger */
2265
- HASH_UNPROTECT_RECURSION (ht1 );
2266
- HASH_UNPROTECT_RECURSION (ht2 );
2267
2244
return p1 -> key != NULL ? 1 : -1 ;
2268
2245
}
2269
2246
pData2 = & p2 -> val ;
2247
+ idx2 ++ ;
2270
2248
} else {
2271
2249
if (p1 -> key == NULL ) { /* numeric index */
2272
2250
pData2 = zend_hash_index_find (ht2 , p1 -> h );
2273
2251
if (pData2 == NULL ) {
2274
- HASH_UNPROTECT_RECURSION (ht1 );
2275
- HASH_UNPROTECT_RECURSION (ht2 );
2276
2252
return 1 ;
2277
2253
}
2278
2254
} else { /* string index */
2279
2255
pData2 = zend_hash_find (ht2 , p1 -> key );
2280
2256
if (pData2 == NULL ) {
2281
- HASH_UNPROTECT_RECURSION (ht1 );
2282
- HASH_UNPROTECT_RECURSION (ht2 );
2283
2257
return 1 ;
2284
2258
}
2285
2259
}
2286
2260
}
2261
+
2287
2262
pData1 = & p1 -> val ;
2288
2263
if (Z_TYPE_P (pData1 ) == IS_INDIRECT ) {
2289
2264
pData1 = Z_INDIRECT_P (pData1 );
2290
2265
}
2291
2266
if (Z_TYPE_P (pData2 ) == IS_INDIRECT ) {
2292
2267
pData2 = Z_INDIRECT_P (pData2 );
2293
2268
}
2269
+
2294
2270
if (Z_TYPE_P (pData1 ) == IS_UNDEF ) {
2295
2271
if (Z_TYPE_P (pData2 ) != IS_UNDEF ) {
2296
2272
return -1 ;
@@ -2299,20 +2275,28 @@ ZEND_API int zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t co
2299
2275
return 1 ;
2300
2276
} else {
2301
2277
result = compar (pData1 , pData2 );
2302
- }
2303
- if (result != 0 ) {
2304
- HASH_UNPROTECT_RECURSION (ht1 );
2305
- HASH_UNPROTECT_RECURSION (ht2 );
2306
- return result ;
2307
- }
2308
- if (ordered ) {
2309
- idx2 ++ ;
2278
+ if (result != 0 ) {
2279
+ return result ;
2280
+ }
2310
2281
}
2311
2282
}
2312
2283
2284
+ return 0 ;
2285
+ }
2286
+
2287
+ ZEND_API int zend_hash_compare (HashTable * ht1 , HashTable * ht2 , compare_func_t compar , zend_bool ordered )
2288
+ {
2289
+ int result ;
2290
+ IS_CONSISTENT (ht1 );
2291
+ IS_CONSISTENT (ht2 );
2292
+
2293
+ HASH_PROTECT_RECURSION (ht1 );
2294
+ HASH_PROTECT_RECURSION (ht2 );
2295
+ result = zend_hash_compare_impl (ht1 , ht2 , compar , ordered );
2313
2296
HASH_UNPROTECT_RECURSION (ht1 );
2314
2297
HASH_UNPROTECT_RECURSION (ht2 );
2315
- return 0 ;
2298
+
2299
+ return result ;
2316
2300
}
2317
2301
2318
2302
0 commit comments