(void) ChangeTable(table, JS_CeilingLog2(capacity) - (JS_DHASH_BITS - table->hashShift));
JS_CEILING_LOG2(ceiling, capacity); ceiling -= JS_DHASH_BITS - table->hashShift;  (void) ChangeTable(table, ceiling);
JS_DHashTableEnumerate(JSDHashTable *table, JSDHashEnumerator etor, void *arg){    char *entryAddr, *entryLimit;    uint32 i, capacity, entrySize;    JSBool didRemove;    JSDHashEntryHdr *entry;    JSDHashOperator op;    entryAddr = table->entryStore;    entrySize = table->entrySize;    capacity = JS_DHASH_TABLE_SIZE(table);    entryLimit = entryAddr + capacity * entrySize;    i = 0;    didRemove = JS_FALSE;    while (entryAddr < entryLimit) {        entry = (JSDHashEntryHdr *)entryAddr;        if (ENTRY_IS_LIVE(entry)) {            op = etor(table, entry, i++, arg);            if (op & JS_DHASH_REMOVE) {                METER(table->stats.removeEnums++);                JS_DHashTableRawRemove(table, entry);                didRemove = JS_TRUE;            }            if (op & JS_DHASH_STOP)                break;        }        entryAddr += entrySize;    }    /*     * Shrink or compress if a quarter or more of all entries are removed, or     * if the table is underloaded according to the configured minimum alpha,     * and is not minimal-size already.  Do this only if we removed above, so     * non-removing enumerations can count on stable table->entryStore until     * the next non-lookup-Operate or removing-Enumerate.     */    if (didRemove &&        (table->removedCount >= capacity >> 2 ||         (capacity > JS_DHASH_MIN_SIZE &&          table->entryCount <= MIN_LOAD(table, capacity)))) {        METER(table->stats.enumShrinks++);        capacity = table->entryCount;        capacity += capacity >> 1;        if (capacity < JS_DHASH_MIN_SIZE)            capacity = JS_DHASH_MIN_SIZE;        (void) ChangeTable(table,                           JS_CeilingLog2(capacity)                           - (JS_DHASH_BITS - table->hashShift));    }    return i;}