void js_InitAtomMap(JSContext *cx, JSAtomMap *map, JSAtomList *al) { JSAtom **vector; JSAtomListElement *ale; uint32 count; /* Map length must already be initialized. */ JS_ASSERT(al->count == map->length); #ifdef DEBUG JS_ATOMIC_INCREMENT(&js_atom_map_count); #endif ale = (JSAtomListElement *)al->list; if (!ale && !al->table) { JS_ASSERT(!map->vector); return; } count = al->count; vector = map->vector; if (al->table) { #ifdef DEBUG JS_ATOMIC_INCREMENT(&js_atom_map_hash_table_count); #endif JS_HashTableEnumerateEntries(al->table, js_map_atom, vector); } else { do { vector[ALE_INDEX(ale)] = ALE_ATOM(ale); } while ((ale = ALE_NEXT(ale)) != NULL); } al->clear(); }
void js_SweepAtomState(JSAtomState *state) { state->liveAtoms = 0; if (state->table) JS_HashTableEnumerateEntries(state->table, js_atom_sweeper, state); }
void jsd_DestroyAtomTable(JSDContext* jsdc) { if( jsdc->atoms ) { JS_HashTableEnumerateEntries(jsdc->atoms, _atom_smasher, nullptr); JS_HashTableDestroy(jsdc->atoms); jsdc->atoms = nullptr; } }
JS_HashTableDump(JSHashTable *ht, JSHashEnumerator dump, FILE *fp) { int count; count = JS_HashTableEnumerateEntries(ht, dump, fp); #ifdef JS_HASHMETER JS_HashTableDumpMeter(ht, dump, fp); #endif return count; }
void js_MarkAtomState(JSAtomState *state, uintN gcflags, JSGCThingMarker mark, void *data) { MarkArgs args; args.gcflags = gcflags; args.mark = mark; args.data = data; JS_HashTableEnumerateEntries(state->table, js_atom_marker, &args); }
js_InitAtomMap(JSContext *cx, JSAtomMap *map, JSAtomList *al) { JSAtom **vector; JSAtomListElement *ale; uint32 count; #ifdef DEBUG JS_ATOMIC_INCREMENT(&js_atom_map_count); #endif ale = al->list; if (!ale && !al->table) { map->vector = NULL; map->length = 0; return JS_TRUE; } count = al->count; if (count >= ATOM_INDEX_LIMIT) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_TOO_MANY_LITERALS); return JS_FALSE; } vector = (JSAtom **) JS_malloc(cx, (size_t) count * sizeof *vector); if (!vector) return JS_FALSE; if (al->table) { #ifdef DEBUG JS_ATOMIC_INCREMENT(&js_atom_map_hash_table_count); #endif JS_HashTableEnumerateEntries(al->table, js_map_atom, vector); } else { do { vector[ALE_INDEX(ale)] = ALE_ATOM(ale); } while ((ale = ALE_NEXT(ale)) != NULL); } ATOM_LIST_INIT(al); map->vector = vector; map->length = (jsatomid)count; return JS_TRUE; }
void js_FinishAtomState(JSAtomState *state) { UninternArgs args; if (!state->runtime) return; args.rt = state->runtime; args.leaks = 0; JS_HashTableEnumerateEntries(state->table, js_atom_uninterner, &args); #ifdef DEBUG if (args.leaks != 0) { fprintf(stderr, "JS engine warning: %lu atoms remain after destroying the JSRuntime.\n" " These atoms may point to freed memory. Things reachable\n" " through them have not been finalized.\n", (unsigned long) args.leaks); } #endif js_FreeAtomState(NULL, state); }
void js_UnpinPinnedAtoms(JSAtomState *state) { if (state->table) JS_HashTableEnumerateEntries(state->table, js_atom_unpinner, NULL); }