} while(0); \
}
+#if ZEND_DEBUG
+static void _zend_is_inconsistent(HashTable *ht,char *file, int line)
+{
+ switch (ht->inconsistent) {
+ case 1:
+ zend_error(E_CORE_ERROR, "ht=%08x is destroying in %s:%d",ht,file,line);
+ break;
+ case 2:
+ zend_error(E_CORE_ERROR, "ht=%08x is already destroyed in %s:%d",ht,file,line);
+ break;
+ case 3:
+ zend_error(E_CORE_ERROR, "ht=%08x is cleaning %s:%d",ht,file,line);
+ break;
+ }
+}
+#define IS_CONSISTENT(a) _zend_is_inconsistent(a,__FILE__,__LINE__);
+#else
+#define IS_CONSISTENT(a)
+#endif
+
/* Generated on an Octa-ALPHA 300MHz CPU & 2.5GB RAM monster */
static uint PrimeNumbers[] =
{5, 11, 19, 53, 107, 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987, 262237, 524521, 1048793, 2097397, 4194103, 8388857, 16777447, 33554201, 67108961, 134217487, 268435697, 536870683, 1073741621, 2147483399};
{
uint i;
+#if ZEND_DEBUG
+ ht->inconsistent = 0;
+#endif
+
for (i = 0; i < nNumPrimeNumbers; i++) {
if (nSize <= PrimeNumbers[i]) {
nSize = PrimeNumbers[i];
uint nIndex;
Bucket *p;
+ IS_CONSISTENT(ht);
+
if (nKeyLength <= 0) {
#if ZEND_DEBUG
ZEND_PUTS("zend_hash_update: Can't put in empty key\n");
uint nIndex;
Bucket *p;
+ IS_CONSISTENT(ht);
+
if (nKeyLength <= 0) {
#if ZEND_DEBUG
ZEND_PUTS("zend_hash_update: Can't put in empty key\n");
uint nIndex;
Bucket *p;
+ IS_CONSISTENT(ht);
+
if (flag & HASH_NEXT_INSERT) {
h = ht->nNextFreeElement;
}
uint nIndex;
Bucket *p;
+ IS_CONSISTENT(ht);
if (nKeyLength <= 0) {
#if ZEND_DEBUG
uint nIndex;
Bucket *p;
+ IS_CONSISTENT(ht);
+
if (flag & HASH_NEXT_INSERT) {
h = ht->nNextFreeElement;
}
uint nIndex;
Bucket *p;
+ IS_CONSISTENT(ht);
+
if (nKeyLength <= 0) {
#if ZEND_DEBUG
ZEND_PUTS("zend_hash_update: Can't check for empty key\n");
uint nIndex;
Bucket *p;
+ IS_CONSISTENT(ht);
+
nIndex = h % ht->nTableSize;
p = ht->arBuckets[nIndex];
{
Bucket **t;
+ IS_CONSISTENT(ht);
+
if ((ht->nNumOfElements > ht->nTableSize) && (ht->nHashSizeIndex < nNumPrimeNumbers - 1)) { /* Let's double the table
size */
t = (Bucket **) perealloc_recoverable(ht->arBuckets, PrimeNumbers[ht->nHashSizeIndex + 1] * sizeof(Bucket *),ht->persistent);
Bucket *p;
uint nIndex;
+ IS_CONSISTENT(ht);
+
memset(ht->arBuckets, 0, PrimeNumbers[ht->nHashSizeIndex] * sizeof(Bucket *));
p = ht->pListHead;
while (p != NULL) {
uint nIndex;
Bucket *p, *t = NULL; /* initialize just to shut gcc up with -Wall */
+ IS_CONSISTENT(ht);
+
if (flag == HASH_DEL_KEY) {
HANDLE_NUMERIC(arKey,nKeyLength,zend_hash_del_key_or_index(ht,arKey,nKeyLength,idx,HASH_DEL_INDEX));
h = ht->pHashFunction(arKey, nKeyLength);
Bucket *p, *q;
int delete_bucket;
+ IS_CONSISTENT(ht);
+
+#if ZEND_DEBUG
+ ht->inconsistent=1;
+#endif
+
p = ht->pListHead;
while (p != NULL) {
q = p;
}
}
pefree(ht->arBuckets,ht->persistent);
+
+#if ZEND_DEBUG
+ ht->inconsistent=2;
+#endif
}
{
Bucket *p, *q;
+ IS_CONSISTENT(ht);
+
+#if ZEND_DEBUG
+ ht->inconsistent=3;
+#endif
+
p = ht->pListHead;
while (p != NULL) {
q = p;
ht->nNumOfElements = 0;
ht->nNextFreeElement = 0;
ht->pInternalPointer = NULL;
+
+#if ZEND_DEBUG
+ ht->inconsistent=0; /* OK - consistent again! */
+#endif
}
{
Bucket *p, *q;
+ IS_CONSISTENT(ht);
+
p = ht->pListHead;
while (p != NULL) {
q = p;
{
Bucket *p, *q;
+ IS_CONSISTENT(ht);
+
p = ht->pListHead;
while (p != NULL) {
q = p;
va_list args;
zend_hash_key hash_key;
+ IS_CONSISTENT(ht);
+
va_start(args, num_args);
p = ht->pListHead;
{
Bucket *p;
+ IS_CONSISTENT(source);
+ IS_CONSISTENT(target);
+
p = source->pListHead;
while (p) {
memcpy(tmp, p->pData, size);
void *t;
int mode = (overwrite?HASH_UPDATE:HASH_ADD);
+ IS_CONSISTENT(source);
+ IS_CONSISTENT(target);
+
p = source->pListHead;
while (p) {
memcpy(tmp, p->pData, size);
ZEND_API ulong zend_get_hash_value(HashTable *ht, char *arKey, uint nKeyLength)
{
+ IS_CONSISTENT(ht);
+
return ht->pHashFunction(arKey, nKeyLength);
}
uint nIndex;
Bucket *p;
+ IS_CONSISTENT(ht);
+
HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_find(ht,idx,pData));
h = ht->pHashFunction(arKey, nKeyLength);
uint nIndex;
Bucket *p;
+ IS_CONSISTENT(ht);
+
nIndex = h % ht->nTableSize;
p = ht->arBuckets[nIndex];
uint nIndex;
Bucket *p;
+ IS_CONSISTENT(ht);
+
HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_index_exists(ht,idx));
h = ht->pHashFunction(arKey, nKeyLength);
uint nIndex;
Bucket *p;
+ IS_CONSISTENT(ht);
+
nIndex = h % ht->nTableSize;
p = ht->arBuckets[nIndex];
uint nIndex;
Bucket *p;
+ IS_CONSISTENT(ht);
+
nIndex = h % ht->nTableSize;
p = ht->arBuckets[nIndex];
ZEND_API int zend_hash_num_elements(HashTable *ht)
{
+ IS_CONSISTENT(ht);
+
return ht->nNumOfElements;
}
ZEND_API void zend_hash_internal_pointer_reset(HashTable *ht)
{
+ IS_CONSISTENT(ht);
+
ht->pInternalPointer = ht->pListHead;
}
*/
ZEND_API void zend_hash_internal_pointer_end(HashTable *ht)
{
+ IS_CONSISTENT(ht);
+
ht->pInternalPointer = ht->pListTail;
}
ZEND_API void zend_hash_move_forward(HashTable *ht)
{
+ IS_CONSISTENT(ht);
+
if (ht->pInternalPointer) {
ht->pInternalPointer = ht->pInternalPointer->pListNext;
}
ZEND_API void zend_hash_move_backwards(HashTable *ht)
{
+ IS_CONSISTENT(ht);
+
if (ht->pInternalPointer) {
ht->pInternalPointer = ht->pInternalPointer->pListLast;
}
{
Bucket *p = ht->pInternalPointer;
+ IS_CONSISTENT(ht);
+
if (p) {
if (p->nKeyLength) {
*str_index = (char *) pemalloc(p->nKeyLength,ht->persistent);
{
Bucket *p = ht->pInternalPointer;
+ IS_CONSISTENT(ht);
+
if (p) {
if (p->nKeyLength) {
return HASH_KEY_IS_STRING;
{
Bucket *p = ht->pInternalPointer;
+ IS_CONSISTENT(ht);
+
if (p) {
*pData = p->pData;
return SUCCESS;
Bucket *p;
int i, j;
+ IS_CONSISTENT(ht);
+
if (ht->nNumOfElements <= 1) { /* Doesn't require sorting */
return SUCCESS;
}
{
Bucket *p,*res;
+ IS_CONSISTENT(ht);
+
if (ht->nNumOfElements == 0 ) {
*pData=NULL;
return FAILURE;
ZEND_API ulong zend_hash_next_free_element(HashTable *ht)
{
+ IS_CONSISTENT(ht);
+
return ht->nNextFreeElement;
}