Index: Zend/zend_hash.c =================================================================== RCS file: /repository/ZendEngine2/zend_hash.c,v retrieving revision 1.121.2.4.2.8.2.8 diff -u -r1.121.2.4.2.8.2.8 zend_hash.c --- Zend/zend_hash.c 31 Dec 2008 11:15:32 -0000 1.121.2.4.2.8.2.8 +++ Zend/zend_hash.c 15 Mar 2009 15:30:00 -0000 @@ -88,7 +88,7 @@ #define ZEND_HASH_IF_FULL_DO_RESIZE(ht) \ - if ((ht)->nNumOfElements > (ht)->nTableSize) { \ + if ((ht)->nNumOfElements > (ht)->nTableMask) { \ zend_hash_do_resize(ht); \ } @@ -143,15 +143,14 @@ if (nSize >= 0x80000000) { /* prevent overflow */ - ht->nTableSize = 0x80000000; + ht->nTableMask = 0x80000000 - 1; } else { while ((1U << i) < nSize) { i++; } - ht->nTableSize = 1 << i; + ht->nTableMask = (1 << i) - 1; } - ht->nTableMask = ht->nTableSize - 1; ht->pDestructor = pDestructor; ht->arBuckets = NULL; ht->pListHead = NULL; @@ -165,13 +164,13 @@ /* Uses ecalloc() so that Bucket* == NULL */ if (persistent) { - tmp = (Bucket **) calloc(ht->nTableSize, sizeof(Bucket *)); + tmp = (Bucket **) calloc(ht->nTableMask + 1, sizeof(Bucket *)); if (!tmp) { return FAILURE; } ht->arBuckets = tmp; } else { - tmp = (Bucket **) ecalloc_rel(ht->nTableSize, sizeof(Bucket *)); + tmp = (Bucket **) ecalloc_rel(ht->nTableMask + 1, sizeof(Bucket *)); if (tmp) { ht->arBuckets = tmp; } @@ -262,8 +261,8 @@ ht->arBuckets[nIndex] = p; HANDLE_UNBLOCK_INTERRUPTIONS(); - ht->nNumOfElements++; ZEND_HASH_IF_FULL_DO_RESIZE(ht); /* If the Hash table is full, resize it */ + ht->nNumOfElements++; return SUCCESS; } @@ -330,8 +329,8 @@ CONNECT_TO_GLOBAL_DLLIST(p, ht); HANDLE_UNBLOCK_INTERRUPTIONS(); - ht->nNumOfElements++; ZEND_HASH_IF_FULL_DO_RESIZE(ht); /* If the Hash table is full, resize it */ + ht->nNumOfElements++; return SUCCESS; } @@ -406,8 +405,8 @@ if ((long)h >= (long)ht->nNextFreeElement) { ht->nNextFreeElement = h + 1; } - ht->nNumOfElements++; ZEND_HASH_IF_FULL_DO_RESIZE(ht); + ht->nNumOfElements++; return SUCCESS; } @@ -418,13 +417,12 @@ IS_CONSISTENT(ht); - if ((ht->nTableSize << 1) > 0) { /* Let's double the table size */ - t = (Bucket **) perealloc_recoverable(ht->arBuckets, (ht->nTableSize << 1) * sizeof(Bucket *), ht->persistent); + if (((ht->nTableMask + 1) << 1) > 0) { /* Let's double the table size */ + t = (Bucket **) perealloc_recoverable(ht->arBuckets, ((ht->nTableMask + 1) << 1) * sizeof(Bucket *), ht->persistent); if (t) { HANDLE_BLOCK_INTERRUPTIONS(); ht->arBuckets = t; - ht->nTableSize = (ht->nTableSize << 1); - ht->nTableMask = ht->nTableSize - 1; + ht->nTableMask = ((ht->nTableMask + 1) << 1) - 1; zend_hash_rehash(ht); HANDLE_UNBLOCK_INTERRUPTIONS(); return SUCCESS; @@ -441,7 +439,7 @@ IS_CONSISTENT(ht); - memset(ht->arBuckets, 0, ht->nTableSize * sizeof(Bucket *)); + memset(ht->arBuckets, 0, (ht->nTableMask + 1) * sizeof(Bucket *)); p = ht->pListHead; while (p != NULL) { nIndex = p->h & ht->nTableMask; @@ -556,7 +554,7 @@ } pefree(q, ht->persistent); } - memset(ht->arBuckets, 0, ht->nTableSize*sizeof(Bucket *)); + memset(ht->arBuckets, 0, (ht->nTableMask + 1) * sizeof(Bucket *)); ht->pListHead = NULL; ht->pListTail = NULL; ht->nNumOfElements = 0; @@ -1533,7 +1531,7 @@ Bucket *p; uint i; - for (i = 0; i < ht->nTableSize; i++) { + for (i = 0; i <= ht->nTableMask; i++) { p = ht->arBuckets[i]; while (p != NULL) { zend_output_debug_string(0, "%s <==> 0x%lX\n", p->arKey, p->h); Index: Zend/zend_hash.h =================================================================== RCS file: /repository/ZendEngine2/zend_hash.h,v retrieving revision 1.78.2.2.2.2.2.8 diff -u -r1.78.2.2.2.2.2.8 zend_hash.h --- Zend/zend_hash.h 31 Dec 2008 11:15:32 -0000 1.78.2.2.2.2.2.8 +++ Zend/zend_hash.h 15 Mar 2009 15:14:00 -0000 @@ -64,7 +64,6 @@ } Bucket; typedef struct _hashtable { - uint nTableSize; uint nTableMask; uint nNumOfElements; ulong nNextFreeElement;