JS_HashTableRawAdd(JSHashTable *ht, JSHashEntry **&hep, JSHashNumber keyHash, const void *key, void *value) { uint32 n; JSHashEntry *he; /* Grow the table if it is overloaded */ n = NBUCKETS(ht); if (ht->nentries >= OVERLOADED(n)) { if (!Resize(ht, ht->shift - 1)) return NULL; #ifdef JS_HASHMETER ht->ngrows++; #endif hep = JS_HashTableRawLookup(ht, keyHash, key); } /* Make a new key value entry */ he = ht->allocOps->allocEntry(ht->allocPriv, key); if (!he) return NULL; he->keyHash = keyHash; he->key = key; he->value = value; he->next = *hep; *hep = he; ht->nentries++; return he; }
PL_HashTableRawAdd(PLHashTable *ht, PLHashEntry **hep, PLHashNumber keyHash, const void *key, void *value) { PRUint32 i, n; PLHashEntry *he, *next, **oldbuckets; PRSize nb; /* Grow the table if it is overloaded */ n = NBUCKETS(ht); if (ht->nentries >= OVERLOADED(n)) { oldbuckets = ht->buckets; #if defined(WIN16) if (2 * n > 16000) return 0; #endif /* WIN16 */ nb = 2 * n * sizeof(PLHashEntry *); ht->buckets = (PLHashEntry**) ((*ht->allocOps->allocTable)(ht->allocPriv, nb)); if (!ht->buckets) { ht->buckets = oldbuckets; return 0; } memset(ht->buckets, 0, nb); #ifdef HASHMETER ht->ngrows++; #endif ht->shift--; for (i = 0; i < n; i++) { for (he = oldbuckets[i]; he; he = next) { next = he->next; hep = PL_HashTableRawLookup(ht, he->keyHash, he->key); PR_ASSERT(*hep == 0); he->next = 0; *hep = he; } } #ifdef DEBUG memset(oldbuckets, 0xDB, n * sizeof oldbuckets[0]); #endif (*ht->allocOps->freeTable)(ht->allocPriv, oldbuckets); hep = PL_HashTableRawLookup(ht, keyHash, key); } /* Make a new key value entry */ he = (*ht->allocOps->allocEntry)(ht->allocPriv, key); if (!he) return 0; he->keyHash = keyHash; he->key = key; he->value = value; he->next = *hep; *hep = he; ht->nentries++; return he; }
HashEntry *HashTableRawAdd(HashTable *ht, HashEntry **hep, HashNumber keyHash, const void *key, void *value) { Uint32 i = 0, n = 0, nbuckets = 0; HashEntry *he = NULL, *next = NULL, **oldbuckets = NULL; Size_t nb = 0; /* Grow the table if it is overloaded */ n = NBUCKETS(ht); if (ht->nentries >= OVERLOADED(n)) { oldbuckets = ht->buckets; nbuckets = hash_next_prime(n + 1); nb = 2 * nbuckets * sizeof(HashEntry *); ht->buckets = (HashEntry **)((*ht->allocOps->allocTable)(ht->allocPriv, nb)); if (!ht->buckets) { ht->buckets = oldbuckets; return 0; } memset(ht->buckets, 0, nb); ht->nbuckets = nbuckets; #ifdef HASHMETER ht->ngrows++; #endif for (i = 0; i < n; i++) { for (he = oldbuckets[i]; he; he = next) { next = he->next; hep = HashTableRawLookup(ht, he->keyHash, he->key); if (*hep != 0) { PR_LOG("##### Oops! %s: Severe problem.\n", __func__); return 0; } he->next = 0; *hep = he; } } #ifdef HASHDEBUG memset(oldbuckets, 0xDB, n * sizeof oldbuckets[0]); #endif (*ht->allocOps->freeTable)(ht->allocPriv, oldbuckets); hep = HashTableRawLookup(ht, keyHash, key); } /* Make a new key value entry */ he = (*ht->allocOps->allocEntry)(ht->allocPriv, key); if (!he) { return 0; } he->keyHash = keyHash; he->key = key; he->value = value; he->next = *hep; *hep = he; ht->nentries++; return he; }