Index: Zend/zend_hash.c =================================================================== RCS file: /repository/ZendEngine2/zend_hash.c,v retrieving revision 1.161 diff -u -r1.161 zend_hash.c --- Zend/zend_hash.c 31 Dec 2008 11:12:29 -0000 1.161 +++ Zend/zend_hash.c 15 Mar 2009 15:30:00 -0000 @@ -114,7 +114,7 @@ #define ZEND_HASH_IF_FULL_DO_RESIZE(ht) \ - if ((ht)->nNumOfElements > (ht)->nTableSize) { \ + if ((ht)->nNumOfElements > (ht)->nTableMask) { \ zend_hash_do_resize(ht); \ } @@ -171,15 +171,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; @@ -194,13 +193,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; } @@ -316,8 +315,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++; if (tmp) efree(tmp); return SUCCESS; } @@ -476,8 +475,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++; if (tmp) efree(tmp); return SUCCESS; } @@ -569,8 +568,8 @@ if ((long)h >= (long)ht->nNextFreeElement) { ht->nNextFreeElement = h + 1; } - ht->nNumOfElements++; ZEND_HASH_IF_FULL_DO_RESIZE(ht); + ht->nNumOfElements++; return SUCCESS; } /* }}} */ @@ -581,13 +580,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; @@ -605,7 +603,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; @@ -800,7 +798,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; @@ -2192,7 +2190,7 @@ } ht->unicode = 1; - memset(ht->arBuckets, 0, ht->nTableSize * sizeof(Bucket *)); + memset(ht->arBuckets, 0, (ht->nTableMask + 1) * sizeof(Bucket *)); p = &ht->pListHead; while ((*p) != NULL) { if ((*p)->key.type == IS_STRING) { @@ -2257,7 +2255,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) { if (p->key.type == IS_UNICODE) { Index: Zend/zend_hash.h =================================================================== RCS file: /repository/ZendEngine2/zend_hash.h,v retrieving revision 1.98 diff -u -r1.98 zend_hash.h --- Zend/zend_hash.h 31 Dec 2008 11:12:29 -0000 1.98 +++ Zend/zend_hash.h 15 Mar 2009 15:14:00 -0000 @@ -73,7 +73,6 @@ } Bucket; typedef struct _hashtable { - uint nTableSize; uint nTableMask; uint nNumOfElements; ulong nNextFreeElement;