static void zend_hash_do_resize(HashTable *ht);
-#define CHECK_INIT(ht, packed) do { \
- if (UNEXPECTED((ht)->nTableMask == 0)) { \
+#define CHECK_INIT(ht, packed) do { \
+ if (UNEXPECTED(!((ht)->u.flags & HASH_FLAG_INITIALIZED))) { \
if (packed) { \
- (ht)->arData = (Bucket *) safe_pemalloc((ht)->nTableSize, sizeof(Bucket), 0, (ht)->u.flags & HASH_FLAG_PERSISTENT); \
- (ht)->u.flags |= HASH_FLAG_PACKED; \
+ (ht)->u.flags |= HASH_FLAG_INITIALIZED | HASH_FLAG_PACKED; \
+ (ht)->arData = (Bucket *) safe_pemalloc((ht)->nTableSize, sizeof(Bucket), 0, (ht)->u.flags & HASH_FLAG_PERSISTENT); \
} else { \
- (ht)->arData = (Bucket *) safe_pemalloc((ht)->nTableSize, sizeof(Bucket) + sizeof(uint32_t), 0, (ht)->u.flags & HASH_FLAG_PERSISTENT); \
- (ht)->arHash = (uint32_t*)((ht)->arData + (ht)->nTableSize); \
- memset((ht)->arHash, INVALID_IDX, (ht)->nTableSize * sizeof(uint32_t)); \
+ (ht)->u.flags |= HASH_FLAG_INITIALIZED; \
+ (ht)->nTableMask = (ht)->nTableSize - 1; \
+ (ht)->arData = (Bucket *) safe_pemalloc((ht)->nTableSize, sizeof(Bucket) + sizeof(uint32_t), 0, (ht)->u.flags & HASH_FLAG_PERSISTENT); \
+ (ht)->arHash = (uint32_t*)((ht)->arData + (ht)->nTableSize); \
+ memset((ht)->arHash, INVALID_IDX, (ht)->nTableSize * sizeof(uint32_t)); \
} \
- (ht)->nTableMask = (ht)->nTableSize - 1; \
- } \
+ } \
} while (0)
static const uint32_t uninitialized_bucket = {INVALID_IDX};
# endif
#endif
- ht->nTableMask = 0; /* 0 means that ht->arBuckets is uninitialized */
+ ht->nTableMask = 0;
ht->nNumUsed = 0;
ht->nNumOfElements = 0;
ht->nNextFreeElement = 0;
HANDLE_BLOCK_INTERRUPTIONS();
ht->arData = (Bucket *) safe_perealloc(ht->arData, (ht->nTableSize << 1), sizeof(Bucket), 0, ht->u.flags & HASH_FLAG_PERSISTENT);
ht->nTableSize = (ht->nTableSize << 1);
- ht->nTableMask = ht->nTableSize - 1;
HANDLE_UNBLOCK_INTERRUPTIONS();
}
{
HANDLE_BLOCK_INTERRUPTIONS();
ht->u.flags |= HASH_FLAG_PACKED;
+ ht->nTableMask = 0;
ht->arData = erealloc(ht->arData, ht->nTableSize * sizeof(Bucket));
ht->arHash = (uint32_t*)&uninitialized_bucket;
HANDLE_UNBLOCK_INTERRUPTIONS();
IS_CONSISTENT(ht);
- if (UNEXPECTED(ht->nTableMask == 0)) {
+ if (UNEXPECTED(!(ht->u.flags & HASH_FLAG_INITIALIZED))) {
CHECK_INIT(ht, 0);
goto add_to_hash;
} else if (ht->u.flags & HASH_FLAG_PACKED) {
IS_CONSISTENT(ht);
- if (UNEXPECTED(ht->nTableMask == 0)) {
+ if (UNEXPECTED(!(ht->u.flags & HASH_FLAG_INITIALIZED))) {
CHECK_INIT(ht, h < ht->nTableSize);
if (h < ht->nTableSize) {
p = ht->arData + h;
IS_CONSISTENT(ht);
if (UNEXPECTED(ht->nNumOfElements == 0)) {
- if (ht->nTableMask) {
+ if (ht->u.flags & HASH_FLAG_INITIALIZED) {
memset(ht->arHash, INVALID_IDX, ht->nTableSize * sizeof(uint32_t));
}
return SUCCESS;
IS_CONSISTENT(ht);
- if (ht->u.flags & HASH_FLAG_PACKED) {
- return FAILURE;
- }
-
h = zend_string_hash_val(key);
nIndex = h & ht->nTableMask;
IS_CONSISTENT(ht);
- if (ht->u.flags & HASH_FLAG_PACKED) {
- return FAILURE;
- }
-
h = zend_string_hash_val(key);
nIndex = h & ht->nTableMask;
IS_CONSISTENT(ht);
- if (ht->u.flags & HASH_FLAG_PACKED) {
- return FAILURE;
- }
-
h = zend_inline_hash_func(str, len);
nIndex = h & ht->nTableMask;
} while (++p != end);
}
}
- } else if (EXPECTED(!ht->nTableMask)) {
+ } else if (EXPECTED(!(ht->u.flags & HASH_FLAG_INITIALIZED))) {
return;
}
pefree(ht->arData, ht->u.flags & HASH_FLAG_PERSISTENT);
}
SET_INCONSISTENT(HT_DESTROYED);
- } else if (EXPECTED(!ht->nTableMask)) {
+ } else if (EXPECTED(!(ht->u.flags & HASH_FLAG_INITIALIZED))) {
return;
}
pefree(ht->arData, ht->u.flags & HASH_FLAG_PERSISTENT);
} while (++p != end);
}
}
+ if (!(ht->u.flags & HASH_FLAG_PACKED)) {
+ memset(ht->arHash, INVALID_IDX, ht->nTableSize * sizeof(uint32_t));
+ }
}
ht->nNumUsed = 0;
ht->nNumOfElements = 0;
ht->nNextFreeElement = 0;
ht->nInternalPointer = INVALID_IDX;
- if (ht->nTableMask) {
- if (!(ht->u.flags & HASH_FLAG_PACKED)) {
- memset(ht->arHash, INVALID_IDX, ht->nTableSize * sizeof(uint32_t));
- }
- }
}
ZEND_API void zend_symtable_clean(HashTable *ht)
}
}
} while (++p != end);
+ if (!(ht->u.flags & HASH_FLAG_PACKED)) {
+ memset(ht->arHash, INVALID_IDX, ht->nTableSize * sizeof(uint32_t));
+ }
}
ht->nNumUsed = 0;
ht->nNumOfElements = 0;
ht->nNextFreeElement = 0;
ht->nInternalPointer = INVALID_IDX;
- if (ht->nTableMask) {
- if (!(ht->u.flags & HASH_FLAG_PACKED)) {
- memset(ht->arHash, INVALID_IDX, ht->nTableSize * sizeof(uint32_t));
- }
- }
}
ZEND_API void zend_hash_graceful_destroy(HashTable *ht)
if (Z_TYPE(p->val) == IS_UNDEF) continue;
_zend_hash_del_el(ht, idx, p);
}
- if (ht->nTableMask) {
+ if (ht->u.flags & HASH_FLAG_INITIALIZED) {
pefree(ht->arData, ht->u.flags & HASH_FLAG_PERSISTENT);
}
_zend_hash_del_el(ht, idx, p);
}
- if (ht->nTableMask) {
+ if (ht->u.flags & HASH_FLAG_INITIALIZED) {
pefree(ht->arData, ht->u.flags & HASH_FLAG_PERSISTENT);
}
target->u.flags = (source->u.flags & ~HASH_FLAG_PERSISTENT) | HASH_FLAG_APPLY_PROTECTION;
target_idx = 0;
- if (target->nTableMask) {
+ if (target->u.flags & HASH_FLAG_INITIALIZED) {
if (target->u.flags & HASH_FLAG_PACKED) {
target->nNumUsed = source->nNumUsed;
target->nNumOfElements = source->nNumOfElements;
IS_CONSISTENT(ht);
- if (ht->u.flags & HASH_FLAG_PACKED) {
- return NULL;
- }
-
p = zend_hash_find_bucket(ht, key);
return p ? &p->val : NULL;
}
IS_CONSISTENT(ht);
- if (ht->u.flags & HASH_FLAG_PACKED) {
- return NULL;
- }
-
h = zend_inline_hash_func(str, len);
p = zend_hash_str_find_bucket(ht, str, len, h);
return p ? &p->val : NULL;
IS_CONSISTENT(ht);
- if (ht->u.flags & HASH_FLAG_PACKED) {
- return 0;
- }
-
p = zend_hash_find_bucket(ht, key);
return p ? 1 : 0;
}
IS_CONSISTENT(ht);
- if (ht->u.flags & HASH_FLAG_PACKED) {
- return 0;
- }
-
h = zend_inline_hash_func(str, len);
p = zend_hash_str_find_bucket(ht, str, len, h);
return p ? 1 : 0;
} else {
if (renumber) {
ht->u.flags |= HASH_FLAG_PACKED;
+ ht->nTableMask = 0;
ht->arData = erealloc(ht->arData, ht->nTableSize * sizeof(Bucket));
ht->arHash = (uint32_t*)&uninitialized_bucket;
} else {