#define HT_POISONED_PTR ((HashTable *) (intptr_t) -1)
#if ZEND_DEBUG
-/*
-#define HASH_MASK_CONSISTENCY 0xc0
-*/
+
#define HT_OK 0x00
#define HT_IS_DESTROYING 0x40
#define HT_DESTROYED 0x80
static void _zend_is_inconsistent(const HashTable *ht, const char *file, int line)
{
- if ((ht->u.flags & HASH_MASK_CONSISTENCY) == HT_OK) {
+ if (ht->u.v.consistency == HT_OK) {
return;
}
- switch ((ht->u.flags & HASH_MASK_CONSISTENCY)) {
+ switch (ht->u.v.consistency) {
case HT_IS_DESTROYING:
zend_output_debug_string(1, "%s(%d) : ht=%p is being destroyed", file, line, ht);
break;
}
#define IS_CONSISTENT(a) _zend_is_inconsistent(a, __FILE__, __LINE__);
#define SET_INCONSISTENT(n) do { \
- (ht)->u.flags |= n; \
+ (ht)->u.v.consistency = n; \
} while (0)
#else
#define IS_CONSISTENT(a)
HT_HASH_RESET(ht);
i = 0;
p = ht->arData;
- if (ht->nNumUsed == ht->nNumOfElements) {
+ if (HT_IS_WITHOUT_HOLES(ht)) {
do {
nIndex = p->h | ht->nTableMask;
Z_NEXT(p->val) = HT_HASH(ht, nIndex);
if (ht->pDestructor) {
SET_INCONSISTENT(HT_IS_DESTROYING);
- if (ht->u.flags & (HASH_FLAG_PACKED|HASH_FLAG_STATIC_KEYS)) {
- if (ht->nNumUsed == ht->nNumOfElements) {
+ if (HT_HAS_STATIC_KEYS_ONLY(ht)) {
+ if (HT_IS_WITHOUT_HOLES(ht)) {
do {
ht->pDestructor(&p->val);
} while (++p != end);
}
} while (++p != end);
}
- } else if (ht->nNumUsed == ht->nNumOfElements) {
+ } else if (HT_IS_WITHOUT_HOLES(ht)) {
do {
ht->pDestructor(&p->val);
if (EXPECTED(p->key)) {
SET_INCONSISTENT(HT_DESTROYED);
} else {
- if (!(ht->u.flags & (HASH_FLAG_PACKED|HASH_FLAG_STATIC_KEYS))) {
+ if (!HT_HAS_STATIC_KEYS_ONLY(ht)) {
do {
if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) {
if (EXPECTED(p->key)) {
end = p + ht->nNumUsed;
SET_INCONSISTENT(HT_IS_DESTROYING);
- if (ht->u.flags & (HASH_FLAG_PACKED|HASH_FLAG_STATIC_KEYS)) {
+ if (HT_HAS_STATIC_KEYS_ONLY(ht)) {
do {
i_zval_ptr_dtor(&p->val ZEND_FILE_LINE_CC);
} while (++p != end);
- } else if (ht->nNumUsed == ht->nNumOfElements) {
+ } else if (HT_IS_WITHOUT_HOLES(ht)) {
do {
i_zval_ptr_dtor(&p->val ZEND_FILE_LINE_CC);
if (EXPECTED(p->key)) {
p = ht->arData;
end = p + ht->nNumUsed;
if (ht->pDestructor) {
- if (ht->u.flags & (HASH_FLAG_PACKED|HASH_FLAG_STATIC_KEYS)) {
- if (ht->nNumUsed == ht->nNumOfElements) {
+ if (HT_HAS_STATIC_KEYS_ONLY(ht)) {
+ if (HT_IS_WITHOUT_HOLES(ht)) {
do {
ht->pDestructor(&p->val);
} while (++p != end);
}
} while (++p != end);
}
- } else if (ht->nNumUsed == ht->nNumOfElements) {
+ } else if (HT_IS_WITHOUT_HOLES(ht)) {
do {
ht->pDestructor(&p->val);
if (EXPECTED(p->key)) {
} while (++p != end);
}
} else {
- if (!(ht->u.flags & (HASH_FLAG_PACKED|HASH_FLAG_STATIC_KEYS))) {
- if (ht->nNumUsed == ht->nNumOfElements) {
+ if (!HT_HAS_STATIC_KEYS_ONLY(ht)) {
+ if (HT_IS_WITHOUT_HOLES(ht)) {
do {
if (EXPECTED(p->key)) {
zend_string_release(p->key);
if (ht->nNumUsed) {
p = ht->arData;
end = p + ht->nNumUsed;
- if (ht->u.flags & HASH_FLAG_STATIC_KEYS) {
+ if (HT_HAS_STATIC_KEYS_ONLY(ht)) {
do {
i_zval_ptr_dtor(&p->val ZEND_FILE_LINE_CC);
} while (++p != end);
- } else if (ht->nNumUsed == ht->nNumOfElements) {
+ } else if (HT_IS_WITHOUT_HOLES(ht)) {
do {
i_zval_ptr_dtor(&p->val ZEND_FILE_LINE_CC);
if (EXPECTED(p->key)) {
target->nInternalPointer = source->nInternalPointer;
HT_HASH_RESET_PACKED(target);
- if (target->nNumUsed == target->nNumOfElements) {
+ if (HT_IS_WITHOUT_HOLES(target)) {
zend_array_dup_packed_elements(source, target, 0);
} else {
zend_array_dup_packed_elements(source, target, 1);
HT_SET_DATA_ADDR(target, emalloc(HT_SIZE(target)));
HT_HASH_RESET(target);
- if (target->u.flags & HASH_FLAG_STATIC_KEYS) {
- if (source->nNumUsed == source->nNumOfElements) {
+ if (HT_HAS_STATIC_KEYS_ONLY(target)) {
+ if (HT_IS_WITHOUT_HOLES(source)) {
idx = zend_array_dup_elements(source, target, 1, 0);
} else {
idx = zend_array_dup_elements(source, target, 1, 1);
}
} else {
- if (source->nNumUsed == source->nNumOfElements) {
+ if (HT_IS_WITHOUT_HOLES(source)) {
idx = zend_array_dup_elements(source, target, 0, 0);
} else {
idx = zend_array_dup_elements(source, target, 0, 1);
return SUCCESS;
}
- if (ht->nNumUsed == ht->nNumOfElements) {
+ if (HT_IS_WITHOUT_HOLES(ht)) {
i = ht->nNumUsed;
} else {
for (j = 0, i = 0; j < ht->nNumUsed; j++) {