Loading js/src/gc/Marking.cpp +32 −2 Original line number Diff line number Diff line Loading @@ -988,7 +988,7 @@ GCMarker::restoreValueArray(JSObject *obj, void **vpp, void **endp) } void GCMarker::processMarkStackOther(uintptr_t tag, uintptr_t addr) GCMarker::processMarkStackOther(SliceBudget &budget, uintptr_t tag, uintptr_t addr) { if (tag == TypeTag) { ScanTypeObject(this, reinterpret_cast<types::TypeObject *>(addr)); Loading @@ -1000,7 +1000,37 @@ GCMarker::processMarkStackOther(uintptr_t tag, uintptr_t addr) pushValueArray(obj, vp, end); else pushObject(obj); } else if (tag == ArenaTag) { ArenaHeader *aheader = reinterpret_cast<ArenaHeader *>(addr); AllocKind thingKind = aheader->getAllocKind(); size_t thingSize = Arena::thingSize(thingKind); for ( ; aheader; aheader = aheader->next) { Arena *arena = aheader->getArena(); FreeSpan firstSpan(aheader->getFirstFreeSpan()); const FreeSpan *span = &firstSpan; for (uintptr_t thing = arena->thingsStart(thingKind); ; thing += thingSize) { JS_ASSERT(thing <= arena->thingsEnd()); if (thing == span->first) { if (!span->hasNext()) break; thing = span->last; span = span->nextSpan(); } else { JSObject *object = reinterpret_cast<JSObject *>(thing); if (object->hasSingletonType()) pushObject(object); budget.step(); } } if (budget.isOverBudget()) { pushArenaList(aheader); return; } } } #if JS_HAS_XML_SUPPORT else { JS_ASSERT(tag == XmlTag); Loading Loading @@ -1043,7 +1073,7 @@ GCMarker::processMarkStackTop(SliceBudget &budget) goto scan_obj; } processMarkStackOther(tag, addr); processMarkStackOther(budget, tag, addr); return; scan_value_array: Loading js/src/jscompartment.cpp +2 −11 Original line number Diff line number Diff line Loading @@ -409,17 +409,8 @@ JSCompartment::markTypes(JSTracer *trc) JS_ASSERT(script == i.get<JSScript>()); } for (size_t thingKind = FINALIZE_OBJECT0; thingKind < FINALIZE_OBJECT_LIMIT; thingKind++) { for (CellIterUnderGC i(this, AllocKind(thingKind)); !i.done(); i.next()) { JSObject *object = i.get<JSObject>(); if (object->hasSingletonType()) { MarkObjectRoot(trc, &object, "mark_types_singleton"); JS_ASSERT(object == i.get<JSObject>()); } } } for (AllocKind thingKind = FINALIZE_OBJECT0; thingKind < FINALIZE_OBJECT_LIMIT; thingKind++) rt->gcMarker.pushArenaList(arenas.getFirstArena(thingKind)); for (CellIterUnderGC i(this, FINALIZE_TYPE_OBJECT); !i.done(); i.next()) { types::TypeObject *type = i.get<types::TypeObject>(); Loading js/src/jsgc.h +6 −1 Original line number Diff line number Diff line Loading @@ -891,6 +891,7 @@ struct GCMarker : public JSTracer { ObjectTag, TypeTag, XmlTag, ArenaTag, SavedValueArrayTag, LastTag = SavedValueArrayTag }; Loading @@ -917,6 +918,10 @@ struct GCMarker : public JSTracer { pushTaggedPtr(ObjectTag, obj); } void pushArenaList(gc::ArenaHeader *firstArena) { pushTaggedPtr(ArenaTag, firstArena); } void pushType(types::TypeObject *type) { pushTaggedPtr(TypeTag, type); } Loading Loading @@ -1016,7 +1021,7 @@ struct GCMarker : public JSTracer { bool restoreValueArray(JSObject *obj, void **vpp, void **endp); void saveValueRanges(); inline void processMarkStackTop(SliceBudget &budget); void processMarkStackOther(uintptr_t tag, uintptr_t addr); void processMarkStackOther(SliceBudget &budget, uintptr_t tag, uintptr_t addr); void appendGrayRoot(void *thing, JSGCTraceKind kind); Loading Loading
js/src/gc/Marking.cpp +32 −2 Original line number Diff line number Diff line Loading @@ -988,7 +988,7 @@ GCMarker::restoreValueArray(JSObject *obj, void **vpp, void **endp) } void GCMarker::processMarkStackOther(uintptr_t tag, uintptr_t addr) GCMarker::processMarkStackOther(SliceBudget &budget, uintptr_t tag, uintptr_t addr) { if (tag == TypeTag) { ScanTypeObject(this, reinterpret_cast<types::TypeObject *>(addr)); Loading @@ -1000,7 +1000,37 @@ GCMarker::processMarkStackOther(uintptr_t tag, uintptr_t addr) pushValueArray(obj, vp, end); else pushObject(obj); } else if (tag == ArenaTag) { ArenaHeader *aheader = reinterpret_cast<ArenaHeader *>(addr); AllocKind thingKind = aheader->getAllocKind(); size_t thingSize = Arena::thingSize(thingKind); for ( ; aheader; aheader = aheader->next) { Arena *arena = aheader->getArena(); FreeSpan firstSpan(aheader->getFirstFreeSpan()); const FreeSpan *span = &firstSpan; for (uintptr_t thing = arena->thingsStart(thingKind); ; thing += thingSize) { JS_ASSERT(thing <= arena->thingsEnd()); if (thing == span->first) { if (!span->hasNext()) break; thing = span->last; span = span->nextSpan(); } else { JSObject *object = reinterpret_cast<JSObject *>(thing); if (object->hasSingletonType()) pushObject(object); budget.step(); } } if (budget.isOverBudget()) { pushArenaList(aheader); return; } } } #if JS_HAS_XML_SUPPORT else { JS_ASSERT(tag == XmlTag); Loading Loading @@ -1043,7 +1073,7 @@ GCMarker::processMarkStackTop(SliceBudget &budget) goto scan_obj; } processMarkStackOther(tag, addr); processMarkStackOther(budget, tag, addr); return; scan_value_array: Loading
js/src/jscompartment.cpp +2 −11 Original line number Diff line number Diff line Loading @@ -409,17 +409,8 @@ JSCompartment::markTypes(JSTracer *trc) JS_ASSERT(script == i.get<JSScript>()); } for (size_t thingKind = FINALIZE_OBJECT0; thingKind < FINALIZE_OBJECT_LIMIT; thingKind++) { for (CellIterUnderGC i(this, AllocKind(thingKind)); !i.done(); i.next()) { JSObject *object = i.get<JSObject>(); if (object->hasSingletonType()) { MarkObjectRoot(trc, &object, "mark_types_singleton"); JS_ASSERT(object == i.get<JSObject>()); } } } for (AllocKind thingKind = FINALIZE_OBJECT0; thingKind < FINALIZE_OBJECT_LIMIT; thingKind++) rt->gcMarker.pushArenaList(arenas.getFirstArena(thingKind)); for (CellIterUnderGC i(this, FINALIZE_TYPE_OBJECT); !i.done(); i.next()) { types::TypeObject *type = i.get<types::TypeObject>(); Loading
js/src/jsgc.h +6 −1 Original line number Diff line number Diff line Loading @@ -891,6 +891,7 @@ struct GCMarker : public JSTracer { ObjectTag, TypeTag, XmlTag, ArenaTag, SavedValueArrayTag, LastTag = SavedValueArrayTag }; Loading @@ -917,6 +918,10 @@ struct GCMarker : public JSTracer { pushTaggedPtr(ObjectTag, obj); } void pushArenaList(gc::ArenaHeader *firstArena) { pushTaggedPtr(ArenaTag, firstArena); } void pushType(types::TypeObject *type) { pushTaggedPtr(TypeTag, type); } Loading Loading @@ -1016,7 +1021,7 @@ struct GCMarker : public JSTracer { bool restoreValueArray(JSObject *obj, void **vpp, void **endp); void saveValueRanges(); inline void processMarkStackTop(SliceBudget &budget); void processMarkStackOther(uintptr_t tag, uintptr_t addr); void processMarkStackOther(SliceBudget &budget, uintptr_t tag, uintptr_t addr); void appendGrayRoot(void *thing, JSGCTraceKind kind); Loading