JSBool js_InitAtomState(JSRuntime *rt) { JSAtomState *state = &rt->atomState; /* * The caller must zero the state before calling this function. */ JS_ASSERT(!state->stringAtoms.ops); JS_ASSERT(!state->doubleAtoms.ops); if (!JS_DHashTableInit(&state->stringAtoms, &StringHashOps, NULL, sizeof(JSAtomHashEntry), JS_DHASH_DEFAULT_CAPACITY(JS_STRING_HASH_COUNT))) { state->stringAtoms.ops = NULL; return JS_FALSE; } JS_ASSERT(IS_STRING_TABLE(&state->stringAtoms)); if (!JS_DHashTableInit(&state->doubleAtoms, &DoubleHashOps, NULL, sizeof(JSAtomHashEntry), JS_DHASH_DEFAULT_CAPACITY(JS_DOUBLE_HASH_COUNT))) { state->doubleAtoms.ops = NULL; JS_DHashTableFinish(&state->stringAtoms); state->stringAtoms.ops = NULL; return JS_FALSE; } JS_ASSERT(IS_DOUBLE_TABLE(&state->doubleAtoms)); #ifdef JS_THREADSAFE js_InitLock(&state->lock); #endif JS_ASSERT(IS_INITIALIZED_STATE(state)); return JS_TRUE; }
JS_XDRFindClassIdByName(JSXDRState *xdr, const char *name) { uintN i, numclasses; numclasses = xdr->numclasses; if (numclasses >= 10) { JSRegHashEntry *entry; /* Bootstrap reghash from registry on first overpopulated Find. */ if (!xdr->reghash) { xdr->reghash = JS_NewDHashTable(JS_DHashGetStubOps(), NULL, sizeof(JSRegHashEntry), JS_DHASH_DEFAULT_CAPACITY(numclasses)); if (xdr->reghash) { for (i = 0; i < numclasses; i++) { JSClass *clasp = xdr->registry[i]; entry = (JSRegHashEntry *) JS_DHashTableOperate((JSDHashTable *) xdr->reghash, clasp->name, JS_DHASH_ADD); entry->name = clasp->name; entry->index = i; } } } /* If we managed to create reghash, use it for O(1) Find. */ if (xdr->reghash) { entry = (JSRegHashEntry *) JS_DHashTableOperate((JSDHashTable *) xdr->reghash, name, JS_DHASH_LOOKUP); if (JS_DHASH_ENTRY_IS_BUSY(&entry->hdr)) return CLASS_INDEX_TO_ID(entry->index); } } /* Only a few classes, or we couldn't malloc reghash: use linear search. */ for (i = 0; i < numclasses; i++) { if (!strcmp(name, xdr->registry[i]->name)) return CLASS_INDEX_TO_ID(i); } return 0; }