JS_ARENA_ALLOCATE(flagp, &rt->gcFlagsPool, sizeof(uint8));
if (thing) JS_ARENA_ALLOCATE(flagp, &rt->gcFlagsPool, sizeof(uint8));
js_AllocGCThing(JSContext *cx, uintN flags){    JSBool tried_gc;    JSRuntime *rt;    JSGCThing *thing;    uint8 *flagp;#ifdef TOO_MUCH_GC    js_GC(cx, GC_KEEP_ATOMS);    tried_gc = JS_TRUE;#else    tried_gc = JS_FALSE;#endif    rt = cx->runtime;    JS_LOCK_GC(rt);    METER(rt->gcStats.alloc++);retry:    thing = rt->gcFreeList;    if (thing) {	rt->gcFreeList = thing->next;	flagp = thing->flagp;	METER(rt->gcStats.freelen--);	METER(rt->gcStats.recycle++);    } else {        flagp = NULL;	if (rt->gcBytes < rt->gcMaxBytes &&            (tried_gc || rt->gcMallocBytes < rt->gcMaxBytes))        {	    JS_ARENA_ALLOCATE(thing, &rt->gcArenaPool, sizeof(JSGCThing));	    JS_ARENA_ALLOCATE(flagp, &rt->gcFlagsPool, sizeof(uint8));	}	if (!thing || !flagp) {	    if (thing)		JS_ARENA_RELEASE(&rt->gcArenaPool, thing);	    if (!tried_gc) {		JS_UNLOCK_GC(rt);		js_GC(cx, GC_KEEP_ATOMS);		tried_gc = JS_TRUE;		JS_LOCK_GC(rt);		METER(rt->gcStats.retry++);		goto retry;	    }	    METER(rt->gcStats.fail++);	    JS_UNLOCK_GC(rt);	    JS_ReportOutOfMemory(cx);	    return NULL;	}    }    *flagp = (uint8)flags;    rt->gcBytes += sizeof(JSGCThing) + sizeof(uint8);    cx->newborn[flags & GCF_TYPEMASK] = thing;    /*     * Clear thing before unlocking in case a GC run is about to scan it,     * finding it via cx->newborn[].     */    thing->next = NULL;    thing->flagp = NULL;    JS_UNLOCK_GC(rt);    return thing;}