Commit 7221f07a authored by Till Schneidereit's avatar Till Schneidereit
Browse files

Bug 755604 - Incrementalize JSCompartment::markTypes. r=billm

parent 34d673af
Loading
Loading
Loading
Loading
+32 −2
Original line number Diff line number Diff line
@@ -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));
@@ -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);
@@ -1043,7 +1073,7 @@ GCMarker::processMarkStackTop(SliceBudget &budget)
        goto scan_obj;
    }

    processMarkStackOther(tag, addr);
    processMarkStackOther(budget, tag, addr);
    return;

  scan_value_array:
+2 −11
Original line number Diff line number Diff line
@@ -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>();
+6 −1
Original line number Diff line number Diff line
@@ -891,6 +891,7 @@ struct GCMarker : public JSTracer {
        ObjectTag,
        TypeTag,
        XmlTag,
        ArenaTag,
        SavedValueArrayTag,
        LastTag = SavedValueArrayTag
    };
@@ -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);
    }
@@ -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);