@@ -82,18 +82,19 @@ static void _zend_is_inconsistent(const HashTable *ht, const char *file, int lin
82
82
83
83
static void zend_hash_do_resize (HashTable * ht );
84
84
85
- #define CHECK_INIT (ht , packed ) do { \
86
- if (UNEXPECTED(( ht)->nTableMask == 0)) { \
85
+ #define CHECK_INIT (ht , packed ) do { \
86
+ if (UNEXPECTED(!(( ht)->u.flags & HASH_FLAG_INITIALIZED))) { \
87
87
if (packed) { \
88
- (ht)->arData = (Bucket *) safe_pemalloc((ht)->nTableSize, sizeof(Bucket), 0, (ht)-> u.flags & HASH_FLAG_PERSISTENT); \
89
- (ht)->u.flags |= HASH_FLAG_PACKED ; \
88
+ (ht)->u.flags |= HASH_FLAG_INITIALIZED | HASH_FLAG_PACKED; \
89
+ (ht)->arData = (Bucket *) safe_pemalloc((ht)->nTableSize, sizeof(Bucket), 0, (ht)-> u.flags & HASH_FLAG_PERSISTENT) ; \
90
90
} else { \
91
- (ht)->arData = (Bucket *) safe_pemalloc((ht)->nTableSize, sizeof(Bucket) + sizeof(uint32_t), 0, (ht)->u.flags & HASH_FLAG_PERSISTENT); \
92
- (ht)->arHash = (uint32_t*)((ht)->arData + (ht)->nTableSize); \
93
- memset((ht)->arHash, INVALID_IDX, (ht)->nTableSize * sizeof(uint32_t)); \
91
+ (ht)->u.flags |= HASH_FLAG_INITIALIZED; \
92
+ (ht)->nTableMask = (ht)->nTableSize - 1; \
93
+ (ht)->arData = (Bucket *) safe_pemalloc((ht)->nTableSize, sizeof(Bucket) + sizeof(uint32_t), 0, (ht)->u.flags & HASH_FLAG_PERSISTENT); \
94
+ (ht)->arHash = (uint32_t*)((ht)->arData + (ht)->nTableSize); \
95
+ memset((ht)->arHash, INVALID_IDX, (ht)->nTableSize * sizeof(uint32_t)); \
94
96
} \
95
- (ht)->nTableMask = (ht)->nTableSize - 1; \
96
- } \
97
+ } \
97
98
} while (0)
98
99
99
100
static const uint32_t uninitialized_bucket = {INVALID_IDX };
@@ -129,7 +130,7 @@ ZEND_API void _zend_hash_init(HashTable *ht, uint32_t nSize, dtor_func_t pDestru
129
130
# endif
130
131
#endif
131
132
132
- ht -> nTableMask = 0 ; /* 0 means that ht->arBuckets is uninitialized */
133
+ ht -> nTableMask = 0 ;
133
134
ht -> nNumUsed = 0 ;
134
135
ht -> nNumOfElements = 0 ;
135
136
ht -> nNextFreeElement = 0 ;
@@ -145,7 +146,6 @@ static void zend_hash_packed_grow(HashTable *ht)
145
146
HANDLE_BLOCK_INTERRUPTIONS ();
146
147
ht -> arData = (Bucket * ) safe_perealloc (ht -> arData , (ht -> nTableSize << 1 ), sizeof (Bucket ), 0 , ht -> u .flags & HASH_FLAG_PERSISTENT );
147
148
ht -> nTableSize = (ht -> nTableSize << 1 );
148
- ht -> nTableMask = ht -> nTableSize - 1 ;
149
149
HANDLE_UNBLOCK_INTERRUPTIONS ();
150
150
}
151
151
@@ -170,6 +170,7 @@ ZEND_API void zend_hash_to_packed(HashTable *ht)
170
170
{
171
171
HANDLE_BLOCK_INTERRUPTIONS ();
172
172
ht -> u .flags |= HASH_FLAG_PACKED ;
173
+ ht -> nTableMask = 0 ;
173
174
ht -> arData = erealloc (ht -> arData , ht -> nTableSize * sizeof (Bucket ));
174
175
ht -> arHash = (uint32_t * )& uninitialized_bucket ;
175
176
HANDLE_UNBLOCK_INTERRUPTIONS ();
@@ -267,7 +268,7 @@ static zend_always_inline zval *_zend_hash_add_or_update_i(HashTable *ht, zend_s
267
268
268
269
IS_CONSISTENT (ht );
269
270
270
- if (UNEXPECTED (ht -> nTableMask == 0 )) {
271
+ if (UNEXPECTED (!( ht -> u . flags & HASH_FLAG_INITIALIZED ) )) {
271
272
CHECK_INIT (ht , 0 );
272
273
goto add_to_hash ;
273
274
} else if (ht -> u .flags & HASH_FLAG_PACKED ) {
@@ -418,7 +419,7 @@ static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht,
418
419
419
420
IS_CONSISTENT (ht );
420
421
421
- if (UNEXPECTED (ht -> nTableMask == 0 )) {
422
+ if (UNEXPECTED (!( ht -> u . flags & HASH_FLAG_INITIALIZED ) )) {
422
423
CHECK_INIT (ht , h < ht -> nTableSize );
423
424
if (h < ht -> nTableSize ) {
424
425
p = ht -> arData + h ;
@@ -587,7 +588,7 @@ ZEND_API int zend_hash_rehash(HashTable *ht)
587
588
IS_CONSISTENT (ht );
588
589
589
590
if (UNEXPECTED (ht -> nNumOfElements == 0 )) {
590
- if (ht -> nTableMask ) {
591
+ if (ht -> u . flags & HASH_FLAG_INITIALIZED ) {
591
592
memset (ht -> arHash , INVALID_IDX , ht -> nTableSize * sizeof (uint32_t ));
592
593
}
593
594
return SUCCESS ;
@@ -684,10 +685,6 @@ ZEND_API int zend_hash_del(HashTable *ht, zend_string *key)
684
685
685
686
IS_CONSISTENT (ht );
686
687
687
- if (ht -> u .flags & HASH_FLAG_PACKED ) {
688
- return FAILURE ;
689
- }
690
-
691
688
h = zend_string_hash_val (key );
692
689
nIndex = h & ht -> nTableMask ;
693
690
@@ -718,10 +715,6 @@ ZEND_API int zend_hash_del_ind(HashTable *ht, zend_string *key)
718
715
719
716
IS_CONSISTENT (ht );
720
717
721
- if (ht -> u .flags & HASH_FLAG_PACKED ) {
722
- return FAILURE ;
723
- }
724
-
725
718
h = zend_string_hash_val (key );
726
719
nIndex = h & ht -> nTableMask ;
727
720
@@ -765,10 +758,6 @@ ZEND_API int zend_hash_str_del(HashTable *ht, const char *str, size_t len)
765
758
766
759
IS_CONSISTENT (ht );
767
760
768
- if (ht -> u .flags & HASH_FLAG_PACKED ) {
769
- return FAILURE ;
770
- }
771
-
772
761
h = zend_inline_hash_func (str , len );
773
762
nIndex = h & ht -> nTableMask ;
774
763
@@ -905,7 +894,7 @@ ZEND_API void zend_hash_destroy(HashTable *ht)
905
894
} while (++ p != end );
906
895
}
907
896
}
908
- } else if (EXPECTED (!ht -> nTableMask )) {
897
+ } else if (EXPECTED (!( ht -> u . flags & HASH_FLAG_INITIALIZED ) )) {
909
898
return ;
910
899
}
911
900
pefree (ht -> arData , ht -> u .flags & HASH_FLAG_PERSISTENT );
@@ -947,7 +936,7 @@ ZEND_API void zend_array_destroy(HashTable *ht)
947
936
}
948
937
949
938
SET_INCONSISTENT (HT_DESTROYED );
950
- } else if (EXPECTED (!ht -> nTableMask )) {
939
+ } else if (EXPECTED (!( ht -> u . flags & HASH_FLAG_INITIALIZED ) )) {
951
940
return ;
952
941
}
953
942
pefree (ht -> arData , ht -> u .flags & HASH_FLAG_PERSISTENT );
@@ -990,16 +979,14 @@ ZEND_API void zend_hash_clean(HashTable *ht)
990
979
} while (++ p != end );
991
980
}
992
981
}
982
+ if (!(ht -> u .flags & HASH_FLAG_PACKED )) {
983
+ memset (ht -> arHash , INVALID_IDX , ht -> nTableSize * sizeof (uint32_t ));
984
+ }
993
985
}
994
986
ht -> nNumUsed = 0 ;
995
987
ht -> nNumOfElements = 0 ;
996
988
ht -> nNextFreeElement = 0 ;
997
989
ht -> nInternalPointer = INVALID_IDX ;
998
- if (ht -> nTableMask ) {
999
- if (!(ht -> u .flags & HASH_FLAG_PACKED )) {
1000
- memset (ht -> arHash , INVALID_IDX , ht -> nTableSize * sizeof (uint32_t ));
1001
- }
1002
- }
1003
990
}
1004
991
1005
992
ZEND_API void zend_symtable_clean (HashTable * ht )
@@ -1019,16 +1006,14 @@ ZEND_API void zend_symtable_clean(HashTable *ht)
1019
1006
}
1020
1007
}
1021
1008
} while (++ p != end );
1009
+ if (!(ht -> u .flags & HASH_FLAG_PACKED )) {
1010
+ memset (ht -> arHash , INVALID_IDX , ht -> nTableSize * sizeof (uint32_t ));
1011
+ }
1022
1012
}
1023
1013
ht -> nNumUsed = 0 ;
1024
1014
ht -> nNumOfElements = 0 ;
1025
1015
ht -> nNextFreeElement = 0 ;
1026
1016
ht -> nInternalPointer = INVALID_IDX ;
1027
- if (ht -> nTableMask ) {
1028
- if (!(ht -> u .flags & HASH_FLAG_PACKED )) {
1029
- memset (ht -> arHash , INVALID_IDX , ht -> nTableSize * sizeof (uint32_t ));
1030
- }
1031
- }
1032
1017
}
1033
1018
1034
1019
ZEND_API void zend_hash_graceful_destroy (HashTable * ht )
@@ -1043,7 +1028,7 @@ ZEND_API void zend_hash_graceful_destroy(HashTable *ht)
1043
1028
if (Z_TYPE (p -> val ) == IS_UNDEF ) continue ;
1044
1029
_zend_hash_del_el (ht , idx , p );
1045
1030
}
1046
- if (ht -> nTableMask ) {
1031
+ if (ht -> u . flags & HASH_FLAG_INITIALIZED ) {
1047
1032
pefree (ht -> arData , ht -> u .flags & HASH_FLAG_PERSISTENT );
1048
1033
}
1049
1034
@@ -1065,7 +1050,7 @@ ZEND_API void zend_hash_graceful_reverse_destroy(HashTable *ht)
1065
1050
_zend_hash_del_el (ht , idx , p );
1066
1051
}
1067
1052
1068
- if (ht -> nTableMask ) {
1053
+ if (ht -> u . flags & HASH_FLAG_INITIALIZED ) {
1069
1054
pefree (ht -> arData , ht -> u .flags & HASH_FLAG_PERSISTENT );
1070
1055
}
1071
1056
@@ -1257,7 +1242,7 @@ ZEND_API void zend_array_dup(HashTable *target, HashTable *source)
1257
1242
target -> u .flags = (source -> u .flags & ~HASH_FLAG_PERSISTENT ) | HASH_FLAG_APPLY_PROTECTION ;
1258
1243
1259
1244
target_idx = 0 ;
1260
- if (target -> nTableMask ) {
1245
+ if (target -> u . flags & HASH_FLAG_INITIALIZED ) {
1261
1246
if (target -> u .flags & HASH_FLAG_PACKED ) {
1262
1247
target -> nNumUsed = source -> nNumUsed ;
1263
1248
target -> nNumOfElements = source -> nNumOfElements ;
@@ -1448,10 +1433,6 @@ ZEND_API zval *zend_hash_find(const HashTable *ht, zend_string *key)
1448
1433
1449
1434
IS_CONSISTENT (ht );
1450
1435
1451
- if (ht -> u .flags & HASH_FLAG_PACKED ) {
1452
- return NULL ;
1453
- }
1454
-
1455
1436
p = zend_hash_find_bucket (ht , key );
1456
1437
return p ? & p -> val : NULL ;
1457
1438
}
@@ -1463,10 +1444,6 @@ ZEND_API zval *zend_hash_str_find(const HashTable *ht, const char *str, size_t l
1463
1444
1464
1445
IS_CONSISTENT (ht );
1465
1446
1466
- if (ht -> u .flags & HASH_FLAG_PACKED ) {
1467
- return NULL ;
1468
- }
1469
-
1470
1447
h = zend_inline_hash_func (str , len );
1471
1448
p = zend_hash_str_find_bucket (ht , str , len , h );
1472
1449
return p ? & p -> val : NULL ;
@@ -1478,10 +1455,6 @@ ZEND_API zend_bool zend_hash_exists(const HashTable *ht, zend_string *key)
1478
1455
1479
1456
IS_CONSISTENT (ht );
1480
1457
1481
- if (ht -> u .flags & HASH_FLAG_PACKED ) {
1482
- return 0 ;
1483
- }
1484
-
1485
1458
p = zend_hash_find_bucket (ht , key );
1486
1459
return p ? 1 : 0 ;
1487
1460
}
@@ -1493,10 +1466,6 @@ ZEND_API zend_bool zend_hash_str_exists(const HashTable *ht, const char *str, si
1493
1466
1494
1467
IS_CONSISTENT (ht );
1495
1468
1496
- if (ht -> u .flags & HASH_FLAG_PACKED ) {
1497
- return 0 ;
1498
- }
1499
-
1500
1469
h = zend_inline_hash_func (str , len );
1501
1470
p = zend_hash_str_find_bucket (ht , str , len , h );
1502
1471
return p ? 1 : 0 ;
@@ -1744,6 +1713,7 @@ ZEND_API int zend_hash_sort(HashTable *ht, sort_func_t sort_func,
1744
1713
} else {
1745
1714
if (renumber ) {
1746
1715
ht -> u .flags |= HASH_FLAG_PACKED ;
1716
+ ht -> nTableMask = 0 ;
1747
1717
ht -> arData = erealloc (ht -> arData , ht -> nTableSize * sizeof (Bucket ));
1748
1718
ht -> arHash = (uint32_t * )& uninitialized_bucket ;
1749
1719
} else {
0 commit comments