#define CHECK_INIT(ht, packed) do { \
if (UNEXPECTED((ht)->nTableMask == 0)) { \
- (ht)->arData = (Bucket *) safe_pemalloc((ht)->nTableSize, sizeof(Bucket), 0, (ht)->flags & HASH_FLAG_PERSISTENT); \
if (packed) { \
+ (ht)->arData = (Bucket *) safe_pemalloc((ht)->nTableSize, sizeof(Bucket), 0, (ht)->flags & HASH_FLAG_PERSISTENT); \
(ht)->flags |= HASH_FLAG_PACKED; \
} else { \
- (ht)->arHash = (zend_uint*) safe_pemalloc((ht)->nTableSize, sizeof(zend_uint), 0, (ht)->flags & HASH_FLAG_PERSISTENT); \
+ (ht)->arData = (Bucket *) safe_pemalloc((ht)->nTableSize, sizeof(Bucket) + sizeof(zend_uint), 0, (ht)->flags & HASH_FLAG_PERSISTENT); \
+ (ht)->arHash = (zend_uint*)((ht)->arData + (ht)->nTableSize); \
memset((ht)->arHash, INVALID_IDX, (ht)->nTableSize * sizeof(zend_uint)); \
} \
(ht)->nTableMask = (ht)->nTableSize - 1; \
static void zend_hash_packed_grow(HashTable *ht)
{
HANDLE_BLOCK_INTERRUPTIONS();
- ht->arData = (Bucket *) perealloc(ht->arData, (ht->nTableSize << 1) * sizeof(Bucket), ht->flags & HASH_FLAG_PERSISTENT);
+ ht->arData = (Bucket *) safe_perealloc(ht->arData, (ht->nTableSize << 1), sizeof(Bucket), 0, ht->flags & HASH_FLAG_PERSISTENT);
ht->nTableSize = (ht->nTableSize << 1);
ht->nTableMask = ht->nTableSize - 1;
HANDLE_UNBLOCK_INTERRUPTIONS();
{
HANDLE_BLOCK_INTERRUPTIONS();
ht->flags &= ~HASH_FLAG_PACKED;
- ht->arHash = (zend_uint*) safe_pemalloc(ht->nTableSize, sizeof(zend_uint), 0, ht->flags & HASH_FLAG_PERSISTENT);
+ ht->arData = (Bucket *) safe_perealloc(ht->arData, ht->nTableSize, sizeof(Bucket) + sizeof(zend_uint), 0, ht->flags & HASH_FLAG_PERSISTENT);
+ ht->arHash = (zend_uint*)(ht->arData + ht->nTableSize);
zend_hash_rehash(ht);
HANDLE_UNBLOCK_INTERRUPTIONS();
}
{
HANDLE_BLOCK_INTERRUPTIONS();
ht->flags |= HASH_FLAG_PACKED;
- pefree(ht->arHash, ht->flags & HASH_FLAG_PERSISTENT);
+//??? pefree(ht->arHash, ht->flags & HASH_FLAG_PERSISTENT);
+ ht->arData = erealloc(ht->arData, ht->nTableSize * sizeof(Bucket));
ht->arHash = (zend_uint*)&uninitialized_bucket;
HANDLE_UNBLOCK_INTERRUPTIONS();
}
HANDLE_UNBLOCK_INTERRUPTIONS();
} else if ((ht->nTableSize << 1) > 0) { /* Let's double the table size */
HANDLE_BLOCK_INTERRUPTIONS();
- ht->arData = (Bucket *) perealloc(ht->arData, (ht->nTableSize << 1) * sizeof(Bucket), ht->flags & HASH_FLAG_PERSISTENT);
- ht->arHash = (zend_uint *) perealloc(ht->arHash, (ht->nTableSize << 1) * sizeof(zend_uint), ht->flags & HASH_FLAG_PERSISTENT);
+ ht->arData = (Bucket *) safe_perealloc(ht->arData, (ht->nTableSize << 1), sizeof(Bucket) + sizeof(zend_uint), 0, ht->flags & HASH_FLAG_PERSISTENT);
+ ht->arHash = (zend_uint*)(ht->arData + (ht->nTableSize << 1));
ht->nTableSize = (ht->nTableSize << 1);
ht->nTableMask = ht->nTableSize - 1;
zend_hash_rehash(ht);
}
if (ht->nTableMask) {
pefree(ht->arData, ht->flags & HASH_FLAG_PERSISTENT);
- if (!(ht->flags & HASH_FLAG_PACKED)) {
- pefree(ht->arHash, ht->flags & HASH_FLAG_PERSISTENT);
- }
}
SET_INCONSISTENT(HT_DESTROYED);
}
if (ht->nTableMask) {
pefree(ht->arData, ht->flags & HASH_FLAG_PERSISTENT);
- if (!(ht->flags & HASH_FLAG_PACKED)) {
- pefree(ht->arHash, ht->flags & HASH_FLAG_PERSISTENT);
- }
}
SET_INCONSISTENT(HT_DESTROYED);
if (ht->nTableMask) {
pefree(ht->arData, ht->flags & HASH_FLAG_PERSISTENT);
- if (!(ht->flags & HASH_FLAG_PACKED)) {
- pefree(ht->arHash, ht->flags & HASH_FLAG_PERSISTENT);
- }
}
SET_INCONSISTENT(HT_DESTROYED);
} else {
if (renumber) {
ht->flags |= HASH_FLAG_PACKED;
- pefree(ht->arHash, ht->flags & HASH_FLAG_PERSISTENT);
+//??? pefree(ht->arHash, ht->flags & HASH_FLAG_PERSISTENT);
+ ht->arData = erealloc(ht->arData, ht->nTableSize * sizeof(Bucket));
ht->arHash = (zend_uint*)&uninitialized_bucket;
} else {
zend_hash_rehash(ht);
uint j;
uint nSize;
Bucket *d;
- zend_uint *h;
Bucket *p;
if (!ht->nNumOfElements || (ht->flags & HASH_FLAG_PACKED)) {
return 1;
}
- d = (Bucket *)pemalloc(nSize * sizeof(Bucket), ht->flags & HASH_FLAG_PERSISTENT);
- h = (zend_uint *)pemalloc(nSize * sizeof(zend_uint), ht->flags & HASH_FLAG_PERSISTENT);
- if (!d || !h) {
+ d = (Bucket *)pemalloc(nSize * (sizeof(Bucket) + sizeof(zend_uint)), ht->flags & HASH_FLAG_PERSISTENT);
+ if (!d) {
return 0;
}
ht->nNumUsed = j;
pefree(ht->arData, ht->flags & HASH_FLAG_PERSISTENT);
- pefree(ht->arHash, ht->flags & HASH_FLAG_PERSISTENT);
ht->arData = d;
- ht->arHash = h;
+ ht->arHash = (zend_uint *)(d + nSize);
ht->nTableSize = nSize;
ht->nTableMask = ht->nTableSize - 1;
zend_hash_rehash(ht);
}
#endif
- ht->arData = (Bucket *) ecalloc(ht->nTableSize, sizeof(Bucket));
if (source->flags & HASH_FLAG_PACKED) {
ht->flags |= HASH_FLAG_PACKED;
+ ht->arData = (Bucket *) emalloc(ht->nTableSize * sizeof(Bucket));
ht->arHash = (zend_uint*)&uninitialized_bucket;
} else {
- ht->arHash = (zend_uint *) ecalloc(ht->nTableSize, sizeof(zend_uint));
+ ht->arData = (Bucket *) emalloc(ht->nTableSize * (sizeof(Bucket) + sizeof(zend_uint)));
+ ht->arHash = (zend_uint*)(ht->arData + ht->nTableSize);
memset(ht->arHash, INVALID_IDX, sizeof(zend_uint) * ht->nTableSize);
}
/* Insert into hash collision list */
if (source->flags & HASH_FLAG_PACKED) {
+ Bucket *r = ht->arData + ht->nNumUsed;
q = ht->arData + p->h;
+ while (r != q) {
+ ZVAL_UNDEF(&r->val);
+ r++;
+ }
ht->nNumUsed = p->h + 1;
} else {
q = ht->arData + ht->nNumUsed;
}
#endif
- ht->arData = (Bucket *) ecalloc(ht->nTableSize, sizeof(Bucket));
if (source->flags & HASH_FLAG_PACKED) {
ht->flags |= HASH_FLAG_PACKED;
+ ht->arData = (Bucket *) emalloc(ht->nTableSize * sizeof(Bucket));
ht->arHash = (zend_uint*)&uninitialized_bucket;
} else {
- ht->arHash = (zend_uint *) ecalloc(ht->nTableSize, sizeof(zend_uint));
+ ht->arData = (Bucket *) emalloc(ht->nTableSize * (sizeof(Bucket) + sizeof(zend_uint)));
+ ht->arHash = (zend_uint *)(ht->arData + ht->nTableSize);
memset(ht->arHash, INVALID_IDX, sizeof(zend_uint) * ht->nTableSize);
}
/* Insert into hash collision list */
if (source->flags & HASH_FLAG_PACKED) {
+ Bucket *r = ht->arData + ht->nNumUsed;
q = ht->arData + p->h;
+ while (r != q) {
+ ZVAL_UNDEF(&r->val);
+ r++;
+ }
ht->nNumUsed = p->h + 1;
} else {
q = ht->arData + ht->nNumUsed;
}
#endif
- ht->arData = (Bucket *) ecalloc(ht->nTableSize, sizeof(Bucket));
if (source->flags & HASH_FLAG_PACKED) {
+ ht->arData = (Bucket *) emalloc(ht->nTableSize * sizeof(Bucket));
ht->flags |= HASH_FLAG_PACKED;
ht->arHash = (zend_uint*)&uninitialized_bucket;
} else {
- ht->arHash = (zend_uint *) ecalloc(ht->nTableSize, sizeof(zend_uint));
+ ht->arData = (Bucket *) emalloc(ht->nTableSize * (sizeof(Bucket) + sizeof(zend_uint)));
+ ht->arHash = (zend_uint*)(ht->arData + ht->nTableSize);
memset(ht->arHash, INVALID_IDX, sizeof(zend_uint) * ht->nTableSize);
}
/* Insert into hash collision list */
if (source->flags & HASH_FLAG_PACKED) {
+ Bucket *r = ht->arData + ht->nNumUsed;
q = ht->arData + p->h;
+ while (r != q) {
+ ZVAL_UNDEF(&r->val);
+ r++;
+ }
ht->nNumUsed = p->h + 1;
} else {
q = ht->arData + ht->nNumUsed;
static void zend_accel_class_hash_copy(HashTable *target, HashTable *source, unique_copy_ctor_func_t pCopyConstructor TSRMLS_DC)
{
- zend_class_entry *ce1, *ce2;
+ zend_class_entry *ce1;
uint idx;
Bucket *p;
zval *t;
failure:
ce1 = Z_PTR(p->val);
- ce2 = Z_PTR_P(t);
CG(in_compilation) = 1;
#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
zend_set_compiled_filename(ce1->info.user.filename TSRMLS_CC);
ht->arHash = (zend_uint*)&uninitialized_bucket;
return;
}
- zend_accel_store(ht->arData, sizeof(Bucket) * ht->nTableSize);
- if (!(ht->flags & HASH_FLAG_PACKED)) {
- zend_accel_store(ht->arHash, sizeof(zend_uint) * ht->nTableSize);
- } else {
+ if (ht->flags & HASH_FLAG_PACKED) {
+ zend_accel_store(ht->arData, sizeof(Bucket) * ht->nTableSize);
ht->arHash = (zend_uint*)&uninitialized_bucket;
+ } else {
+ zend_accel_store(ht->arData, (sizeof(Bucket) + sizeof(zend_uint)) * ht->nTableSize);
+ ht->arHash = (zend_uint*)(ht->arData + ht->nTableSize);
}
for (idx = 0; idx < ht->nNumUsed; idx++) {
p = ht->arData + idx;
if (!ht->nTableMask) {
RETURN_SIZE();
}
- ADD_DUP_SIZE(ht->arData, sizeof(Bucket) * ht->nTableSize);
- if (!(ht->flags & HASH_FLAG_PACKED)) {
- ADD_DUP_SIZE(ht->arHash, sizeof(zend_uint) * ht->nTableSize);
+ if (ht->flags & HASH_FLAG_PACKED) {
+ ADD_DUP_SIZE(ht->arData, sizeof(Bucket) * ht->nTableSize);
+ } else {
+ ADD_DUP_SIZE(ht->arData, (sizeof(Bucket) + sizeof(zend_uint)) * ht->nTableSize);
}
for (idx = 0; idx < ht->nNumUsed; idx++) {