static inline void ScanBaseShape(GCMarker *gcmarker, BaseShape *base) { base->assertConsistency(); if (base->hasGetterObject()) PushMarkStack(gcmarker, base->getterObject()); if (base->hasSetterObject()) PushMarkStack(gcmarker, base->setterObject()); if (JSObject *parent = base->getObjectParent()) PushMarkStack(gcmarker, parent); /* * All children of the owned base shape are consistent with its * unowned one, thus we do not need to trace through children of the * unowned base shape. */ if (base->isOwned()) { UnownedBaseShape *unowned = base->baseUnowned(); JS_ASSERT(base->compartment() == unowned->compartment()); unowned->markIfUnmarked(gcmarker->getMarkColor()); } }
void MarkInternal(JSTracer *trc, T **thingp) { JS_ASSERT(thingp); T *thing = *thingp; CheckMarkedThing(trc, thing); JSRuntime *rt = trc->runtime; JS_ASSERT_IF(rt->gcCheckCompartment, thing->compartment() == rt->gcCheckCompartment || thing->compartment() == rt->atomsCompartment); /* * Don't mark things outside a compartment if we are in a per-compartment * GC. */ if (!rt->gcCurrentCompartment || thing->compartment() == rt->gcCurrentCompartment) { if (!trc->callback) { PushMarkStack(static_cast<GCMarker *>(trc), thing); } else { trc->callback(trc, (void **)thingp, GetGCThingTraceKind(thing)); } } #ifdef DEBUG trc->debugPrinter = NULL; trc->debugPrintArg = NULL; #endif }
static void ScanShape(GCMarker *gcmarker, Shape *shape) { restart: PushMarkStack(gcmarker, shape->base()); const HeapId &id = shape->propidRef(); if (JSID_IS_STRING(id)) PushMarkStack(gcmarker, JSID_TO_STRING(id)); else if (JS_UNLIKELY(JSID_IS_OBJECT(id))) PushMarkStack(gcmarker, JSID_TO_OBJECT(id)); shape = shape->previous(); if (shape && shape->markIfUnmarked(gcmarker->getMarkColor())) goto restart; }
void MarkInternal(JSTracer *trc, T **thingp) { JS_ASSERT(thingp); T *thing = *thingp; CheckMarkedThing(trc, thing); /* * Don't mark things outside a compartment if we are in a per-compartment * GC. */ if (!trc->callback) { if (thing->compartment()->isCollecting()) PushMarkStack(static_cast<GCMarker *>(trc), thing); } else { trc->callback(trc, (void **)thingp, GetGCThingTraceKind(thing)); JS_SET_TRACING_LOCATION(trc, NULL); } #ifdef DEBUG trc->debugPrinter = NULL; trc->debugPrintArg = NULL; #endif }
static void ScanTypeObject(GCMarker *gcmarker, types::TypeObject *type) { if (!type->singleton) { unsigned count = type->getPropertyCount(); for (unsigned i = 0; i < count; i++) { types::Property *prop = type->getProperty(i); if (prop && JSID_IS_STRING(prop->id)) PushMarkStack(gcmarker, JSID_TO_STRING(prop->id)); } } if (type->proto) PushMarkStack(gcmarker, type->proto); if (type->newScript) { PushMarkStack(gcmarker, type->newScript->fun); PushMarkStack(gcmarker, type->newScript->shape); } if (type->interpretedFunction) PushMarkStack(gcmarker, type->interpretedFunction); if (type->singleton && !type->lazy()) PushMarkStack(gcmarker, type->singleton); if (type->interpretedFunction) PushMarkStack(gcmarker, type->interpretedFunction); }
CodeBlock YpRangeFunc(int which, CodeBlock range) { /* which is 0-15: avg cum dif max min mnx mxx pcen psum ptp rms sum uncp zcen + - */ long initialPC; if (CheckCodeSpace(2)) return (range==NONE)? nextPC : range; if (range==NONE) { initialPC= nextPC; if (which<14) { vmCode[nextPC++].Action= previousOp= &FormRangeFunc; vmCode[nextPC++].rf= RFs[which]; } else { int flag; if (which==14) { flag= R_MARKED; PushMarkStack(1); } else { flag= R_PSEUDO; } vmCode[nextPC++].Action= previousOp= &FormRangeFlag; vmCode[nextPC++].count= flag; } WillPushStack(); } else { initialPC= range; if (which<14) { vmCode[nextPC++].Action= previousOp= &AddRangeFunc; vmCode[nextPC++].rf= RFs[which]; } else { int flag; if (which==14) { flag= R_MARKED; PushMarkStack(0); } else { flag= R_PSEUDO; } vmCode[nextPC++].Action= previousOp= &AddRangeFlag; vmCode[nextPC++].count= flag; } } return initialPC; }
static void ScanTypeObject(GCMarker *gcmarker, types::TypeObject *type) { /* Don't mark properties for singletons. They'll be purged by the GC. */ if (!type->singleton) { unsigned count = type->getPropertyCount(); for (unsigned i = 0; i < count; i++) { types::Property *prop = type->getProperty(i); if (prop && JSID_IS_STRING(prop->id)) PushMarkStack(gcmarker, JSID_TO_STRING(prop->id)); } } if (TaggedProto(type->proto).isObject()) PushMarkStack(gcmarker, type->proto); if (type->singleton && !type->lazy()) PushMarkStack(gcmarker, type->singleton); if (type->newScript) { PushMarkStack(gcmarker, type->newScript->fun); PushMarkStack(gcmarker, type->newScript->shape); } if (type->interpretedFunction) PushMarkStack(gcmarker, type->interpretedFunction); }
void PushArenaTyped(GCMarker *gcmarker, ArenaHeader *aheader) { for (CellIterUnderGC i(aheader); !i.done(); i.next()) PushMarkStack(gcmarker, i.get<T>()); }