IS_CONSISTENT(ht);
- CHECK_INIT(ht, 0);
- if (ht->u.flags & HASH_FLAG_PACKED) {
+ if (UNEXPECTED(ht->nTableMask == 0)) {
+ CHECK_INIT(ht, 0);
+ goto add_to_hash;
+ } else if (ht->u.flags & HASH_FLAG_PACKED) {
zend_hash_packed_to_hash(ht);
- }
-
- h = zend_string_hash_val(key);
-
- if ((flag & HASH_ADD_NEW) == 0) {
+ } else if ((flag & HASH_ADD_NEW) == 0) {
p = zend_hash_find_bucket(ht, key);
if (p) {
ZEND_HASH_IF_FULL_DO_RESIZE(ht); /* If the Hash table is full, resize it */
+add_to_hash:
HANDLE_BLOCK_INTERRUPTIONS();
idx = ht->nNumUsed++;
ht->nNumOfElements++;
ht->nInternalPointer = idx;
}
p = ht->arData + idx;
- p->h = h;
+ p->h = h = zend_string_hash_val(key);
p->key = key;
zend_string_addref(key);
ZVAL_COPY_VALUE(&p->val, pData);
#endif
IS_CONSISTENT(ht);
- CHECK_INIT(ht, h < ht->nTableSize);
- if (ht->u.flags & HASH_FLAG_PACKED) {
+ if (UNEXPECTED(ht->nTableMask == 0)) {
+ CHECK_INIT(ht, h < ht->nTableSize);
+ if (h < ht->nTableSize) {
+ p = ht->arData + h;
+ goto add_to_packed;
+ }
+ goto add_to_hash;
+ } else if (ht->u.flags & HASH_FLAG_PACKED) {
if (h < ht->nNumUsed) {
p = ht->arData + h;
if (Z_TYPE(p->val) != IS_UNDEF) {
goto convert_to_hash;
}
+add_to_packed:
HANDLE_BLOCK_INTERRUPTIONS();
/* incremental initialization of empty Buckets */
if ((flag & (HASH_ADD_NEW|HASH_ADD_NEXT)) == (HASH_ADD_NEW|HASH_ADD_NEXT)) {
p->h = h;
p->key = NULL;
ZVAL_COPY_VALUE(&p->val, pData);
- Z_NEXT(p->val) = INVALID_IDX;
HANDLE_UNBLOCK_INTERRUPTIONS();
convert_to_hash:
zend_hash_packed_to_hash(ht);
- }
-
- if ((flag & HASH_ADD_NEW) == 0) {
+ } else if ((flag & HASH_ADD_NEW) == 0) {
p = zend_hash_index_find_bucket(ht, h);
if (p) {
if (flag & HASH_ADD) {
ZEND_HASH_IF_FULL_DO_RESIZE(ht); /* If the Hash table is full, resize it */
+add_to_hash:
HANDLE_BLOCK_INTERRUPTIONS();
idx = ht->nNumUsed++;
ht->nNumOfElements++;