/* * This function is used by the cycle collector to trace through the * children of a BaseShape (and its baseUnowned(), if any). The cycle * collector does not directly care about BaseShapes, so only the * getter, setter, and parent are marked. Furthermore, the parent is * marked only if it isn't the same as prevParent, which will be * updated to the current shape's parent. */ inline void MarkCycleCollectorChildren(JSTracer *trc, BaseShape *base, JSObject **prevParent) { JS_ASSERT(base); /* * The cycle collector does not need to trace unowned base shapes, * as they have the same getter, setter and parent as the original * base shape. */ base->assertConsistency(); if (base->hasGetterObject()) { JSObject *tmp = base->getterObject(); MarkObjectUnbarriered(trc, &tmp, "getter"); JS_ASSERT(tmp == base->getterObject()); } if (base->hasSetterObject()) { JSObject *tmp = base->setterObject(); MarkObjectUnbarriered(trc, &tmp, "setter"); JS_ASSERT(tmp == base->setterObject()); } JSObject *parent = base->getObjectParent(); if (parent && parent != *prevParent) { MarkObjectUnbarriered(trc, &parent, "parent"); JS_ASSERT(parent == base->getObjectParent()); *prevParent = parent; } }
void MarkCrossCompartmentObjectUnbarriered(JSTracer *trc, JSObject **obj, const char *name) { if (IS_GC_MARKING_TRACER(trc) && !(*obj)->compartment()->isCollecting()) return; MarkObjectUnbarriered(trc, obj, name); }