static inline void MarkExactStackRootList(JSTracer* trc, Source* s, const char* name) { Rooted<T>* rooter = s->roots.template gcRooters<T>(); while (rooter) { T* addr = rooter->address(); TraceFn(trc, addr, name); rooter = rooter->previous(); } }
static inline void MarkExactStackRootList(JSTracer *trc, Source *s, const char *name) { Rooted<T> *rooter = s->template gcRooters<T>(); while (rooter) { T *addr = rooter->address(); if (!IgnoreExactRoot(addr)) MarkFunc(trc, addr, name); rooter = rooter->previous(); } }
static inline void MarkExactStackRooter(JSTracer *trc, Rooted<void*> rooter, ThingRootKind kind) { void **addr = (void **)rooter->address(); if (!*addr) return; switch (kind) { case THING_ROOT_OBJECT: MarkObjectRoot(trc, (JSObject **)addr, "exact-object"); break; case THING_ROOT_STRING: MarkStringRoot(trc, (JSSTring **)addr, "exact-string"); break; case THING_ROOT_SCRIPT: MarkScriptRoot(trc, (JSScript **)addr, "exact-script"); break; case THING_ROOT_SHAPE: MarkShapeRoot(trc, (Shape **)addr, "exact-shape"); break; case THING_ROOT_BASE_SHAPE: MarkBaseShapeRoot(trc, (BaseShape **)addr, "exact-baseshape"); break; case THING_ROOT_TYPE: MarkTypeRoot(trc, (types::Type *)addr, "exact-type"); break; case THING_ROOT_TYPE_OBJECT: MarkTypeObjectRoot(trc, (types::TypeObject **)addr, "exact-typeobject"); break; case THING_ROOT_VALUE: MarkValueRoot(trc, (Value *)addr, "exact-value"); break; case THING_ROOT_ID: MarkIdRoot(trc, (jsid *)addr, "exact-id"); break; case THING_ROOT_PROPERTY_ID: MarkIdRoot(trc, &((js::PropertyId *)addr)->asId(), "exact-propertyid"); break; case THING_ROOT_BINDINGS: ((Bindings *)addr)->trace(trc); break; default: JS_NOT_REACHED("Invalid THING_ROOT kind"); break; } }