log2 = JS_CeilingLog2(capacity);
JS_CEILING_LOG2(log2, capacity);
JS_DHashTableInit(JSDHashTable *table, const JSDHashTableOps *ops, void *data,                  uint32 entrySize, uint32 capacity){    int log2;    uint32 nbytes;#ifdef DEBUG    if (entrySize > 10 * sizeof(void *)) {        fprintf(stderr,                "jsdhash: for the table at address %p, the given entrySize"                " of %lu %s favors chaining over double hashing.\n",                (void *)table,                (unsigned long) entrySize,                (entrySize > 16 * sizeof(void*)) ? "definitely" : "probably");    }#endif    table->ops = ops;    table->data = data;    if (capacity < JS_DHASH_MIN_SIZE)        capacity = JS_DHASH_MIN_SIZE;    log2 = JS_CeilingLog2(capacity);    capacity = JS_BIT(log2);    if (capacity >= JS_DHASH_SIZE_LIMIT)        return JS_FALSE;    table->hashShift = JS_DHASH_BITS - log2;    table->maxAlphaFrac = 0xC0;                 /* .75 */    table->minAlphaFrac = 0x40;                 /* .25 */    table->entrySize = entrySize;    table->entryCount = table->removedCount = 0;    table->generation = 0;    nbytes = capacity * entrySize;    table->entryStore = ops->allocTable(table, nbytes);    if (!table->entryStore)        return JS_FALSE;    memset(table->entryStore, 0, nbytes);    METER(memset(&table->stats, 0, sizeof table->stats));    return JS_TRUE;}