Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* As the final phase of global garbage collect, sweep the heap to follow
- forwarders, then free forwarders, coalescing with free space as we go. */
- /* SpurMemoryManager>>#eliminateAndFreeForwardersForPigCompact */
- static void
- eliminateAndFreeForwardersForPigCompact(void)
- { DECL_MAYBE_SQ_GLOBAL_STRUCT
- sqInt address;
- sqInt address1;
- sqInt bytes;
- sqInt endOfFreeRun;
- sqInt f;
- sqInt firstOfFreeRun;
- sqInt followingWord;
- sqInt followingWord1;
- sqInt followingWord11;
- sqInt followingWord2;
- sqInt followingWordAddress;
- sqInt followingWordAddress1;
- sqInt followingWordAddress11;
- sqInt followingWordAddress2;
- sqInt i;
- sqInt iLimiT;
- sqInt index;
- sqInt lowest;
- usqInt lowestForwarder;
- usqInt lowestForwarder1;
- usqInt numSlots;
- usqInt numSlots1;
- usqInt numSlots11;
- usqInt numSlots111;
- usqInt numSlots12;
- usqInt numSlots2;
- usqInt numSlots21;
- usqInt numSlots3;
- usqInt numSlots31;
- usqInt numSlots4;
- sqInt o;
- sqInt o1;
- sqInt obj;
- sqInt objOop;
- sqInt objOop1;
- sqInt objOop11;
- sqInt objOop12;
- sqInt objOop2;
- sqInt objOop21;
- sqInt objOop3;
- sqInt objOop4;
- sqInt prevFree;
- sqInt prevObj;
- sqInt prevObj1;
- sqInt prevObj11;
- sqInt prevObj2;
- sqInt prevPrevFree;
- sqInt prevPrevObj;
- sqInt prevPrevObj1;
- sqInt prevPrevObj11;
- sqInt prevPrevObj2;
- sqInt referent;
- sqInt referent1;
- sqInt referent11;
- sqInt referent2;
- sqInt slotBytes;
- sqInt slotBytes1;
- sqInt slotBytes11;
- sqInt slotBytes2;
- sqInt startOfFreeRun;
- endOfFreeRun = 0;
- startOfFreeRun = 0;
- assert(!(isForwarded(GIV(nilObj))));
- assert(!(isForwarded(GIV(falseObj))));
- assert(!(isForwarded(GIV(trueObj))));
- assert(!(isForwarded(freeListsObj())));
- assert(!(isForwarded(GIV(hiddenRootsObj))));
- assert(!(isForwarded(GIV(classTableFirstPage))));
- /* begin followSpecialObjectsOop */
- if (((longAt(GIV(specialObjectsOop))) & ((classIndexMask()) - (isForwardedObjectClassIndexPun()))) == 0) {
- /* begin followForwarded: */
- assert(isUnambiguouslyForwarder(GIV(specialObjectsOop)));
- referent = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (0L << (shiftForWord())));
- while (((referent & (tagMask())) == 0)
- && (((longAt(referent)) & (classIndexMask())) == (isForwardedObjectClassIndexPun()))) {
- referent = longAt((referent + BaseHeaderSize) + (0L << (shiftForWord())));
- }
- GIV(specialObjectsOop) = referent;
- }
- followForwardedObjectFieldstoDepth(GIV(specialObjectsOop), 0);
- /* begin followForwardedObjStacks */
- followForwardedInObjStackatIndex(GIV(markStack), MarkStackRootIndex);
- followForwardedInObjStackatIndex(GIV(weaklingStack), WeaklingStackRootIndex);
- followForwardedInObjStackatIndex(GIV(mournQueue), MournQueueRootIndex);
- mapInterpreterOops();
- /* begin followRememberedForwardersAndForgetFreeObjectsForPigCompact */
- index = 0;
- while (index < GIV(rememberedSetSize)) {
- obj = GIV(rememberedSet)[index];
- if (((longAt(obj)) & (classIndexMask())) == (isFreeObjectClassIndexPun())) {
- /* free; remove by overwriting with last element */
- /* free; remove by overwriting with last element */
- GIV(rememberedSetSize) -= 1;
- GIV(rememberedSet)[index] = (GIV(rememberedSet)[GIV(rememberedSetSize)]);
- }
- else {
- if (((longAt(obj)) & ((classIndexMask()) - (isForwardedObjectClassIndexPun()))) == 0) {
- /* begin setIsRememberedOf:to: */
- flag("endianness");
- longAtput(obj, (longAt(obj)) & ((unsigned int)~(1L << (rememberedBitShift()))));
- /* begin followForwarded: */
- assert(isUnambiguouslyForwarder(obj));
- referent1 = longAt((obj + BaseHeaderSize) + (0L << (shiftForWord())));
- while (((referent1 & (tagMask())) == 0)
- && (((longAt(referent1)) & (classIndexMask())) == (isForwardedObjectClassIndexPun()))) {
- referent1 = longAt((referent1 + BaseHeaderSize) + (0L << (shiftForWord())));
- }
- obj = referent1;
- assert(isRemembered(obj));
- GIV(rememberedSet)[index] = obj;
- }
- index += 1;
- }
- }
- /* begin unmarkSurvivingObjectsForPigCompact */
- prevPrevObj = (prevObj = null);
- /* begin objectStartingAt: */
- address = ((pastSpace()).start);
- numSlots = byteAt(address + 7);
- objOop1 = (numSlots == (numSlotsMask())
- ? address + BaseHeaderSize
- : address);
- while (oopisLessThan(objOop1, GIV(pastSpaceStart))) {
- assert(isEnumerableObjectNoAssert(objOop1));
- if (((((usqInt) (longAt(objOop1 + 4))) >> 23) & 1) != 0) {
- setIsMarkedOfto(objOop1, 0);
- }
- prevPrevObj = prevObj;
- prevObj = objOop1;
- /* begin objectAfter:limit: */
- numSlots1 = byteAt(objOop1 + 7);
- numSlots2 = (numSlots1 == (numSlotsMask())
- ? longAt(objOop1 - BaseHeaderSize)
- : numSlots1);
- if (numSlots2 == 0) {
- slotBytes = 8;
- }
- else {
- slotBytes = (numSlots2 + (numSlots2 & 1)) << (shiftForWord());
- }
- followingWordAddress = (objOop1 + BaseHeaderSize) + slotBytes;
- if (oopisGreaterThanOrEqualTo(followingWordAddress, GIV(pastSpaceStart))) {
- objOop1 = GIV(pastSpaceStart);
- goto l6;
- }
- flag("endianness");
- followingWord = longAt(followingWordAddress + 4);
- objOop1 = ((((usqInt) followingWord) >> (numSlotsHalfShift())) == (numSlotsMask())
- ? followingWordAddress + BaseHeaderSize
- : followingWordAddress);
- l6: /* end objectAfter:limit: */;
- }
- /* begin sweepToFollowForwardersForPigCompact */
- assert((GIV(freeStart) == (((eden()).start)))
- && ((futureSurvivorStart()) == (((futureSpace()).start))));
- /* begin allPastSpaceObjectsDo: */
- prevPrevObj2 = (prevObj2 = null);
- /* begin objectStartingAt: */
- address1 = ((pastSpace()).start);
- numSlots4 = byteAt(address1 + 7);
- objOop12 = (numSlots4 == (numSlotsMask())
- ? address1 + BaseHeaderSize
- : address1);
- while (oopisLessThan(objOop12, GIV(pastSpaceStart))) {
- assert(isEnumerableObjectNoAssert(objOop12));
- if (!(((longAt(objOop12)) & ((classIndexMask()) - (isForwardedObjectClassIndexPun()))) == 0)) {
- for (i = 0, iLimiT = ((numPointerSlotsOf(objOop12)) - 1); i <= iLimiT; i += 1) {
- f = longAt((objOop12 + BaseHeaderSize) + (i << (shiftForWord())));
- if (((f & (tagMask())) == 0)
- && (((longAt(f)) & (classIndexMask())) == (isForwardedObjectClassIndexPun()))) {
- /* begin followForwarded: */
- assert(isUnambiguouslyForwarder(f));
- referent2 = longAt((f + BaseHeaderSize) + (0L << (shiftForWord())));
- while (((referent2 & (tagMask())) == 0)
- && (((longAt(referent2)) & (classIndexMask())) == (isForwardedObjectClassIndexPun()))) {
- referent2 = longAt((referent2 + BaseHeaderSize) + (0L << (shiftForWord())));
- }
- f = referent2;
- /* begin storePointerUnchecked:ofObject:withValue: */
- assert(!(isForwarded(objOop12)));
- longAtput((objOop12 + BaseHeaderSize) + (i << (shiftForWord())), f);
- }
- }
- }
- prevPrevObj2 = prevObj2;
- prevObj2 = objOop12;
- /* begin objectAfter:limit: */
- numSlots12 = byteAt(objOop12 + 7);
- numSlots21 = (numSlots12 == (numSlotsMask())
- ? longAt(objOop12 - BaseHeaderSize)
- : numSlots12);
- if (numSlots21 == 0) {
- slotBytes2 = 8;
- }
- else {
- slotBytes2 = (numSlots21 + (numSlots21 & 1)) << (shiftForWord());
- }
- followingWordAddress2 = (objOop12 + BaseHeaderSize) + slotBytes2;
- if (oopisGreaterThanOrEqualTo(followingWordAddress2, GIV(pastSpaceStart))) {
- objOop12 = GIV(pastSpaceStart);
- goto l19;
- }
- flag("endianness");
- followingWord2 = longAt(followingWordAddress2 + 4);
- objOop12 = ((((usqInt) followingWord2) >> (numSlotsHalfShift())) == (numSlotsMask())
- ? followingWordAddress2 + BaseHeaderSize
- : followingWordAddress2);
- l19: /* end objectAfter:limit: */;
- }
- lowestForwarder1 = 0;
- /* begin allOldSpaceObjectsDo: */
- assert(isOldObject(GIV(nilObj)));
- prevPrevObj11 = (prevObj11 = null);
- objOop11 = GIV(nilObj);
- while (1) {
- assert((objOop11 % (allocationUnit())) == 0);
- if (!(oopisLessThan(objOop11, GIV(endOfMemory)))) break;
- assert((long64At(objOop11)) != 0);
- if (isEnumerableObject(objOop11)) {
- if (((longAt(objOop11)) & ((classIndexMask()) - (isForwardedObjectClassIndexPun()))) == 0) {
- if (lowestForwarder1 == 0) {
- lowestForwarder1 = objOop11;
- }
- }
- else {
- for (i = 0, iLimiT = ((numPointerSlotsOf(objOop11)) - 1); i <= iLimiT; i += 1) {
- f = longAt((objOop11 + BaseHeaderSize) + (i << (shiftForWord())));
- if (((f & (tagMask())) == 0)
- && (((longAt(f)) & (classIndexMask())) == (isForwardedObjectClassIndexPun()))) {
- /* begin followForwarded: */
- assert(isUnambiguouslyForwarder(f));
- referent11 = longAt((f + BaseHeaderSize) + (0L << (shiftForWord())));
- while (((referent11 & (tagMask())) == 0)
- && (((longAt(referent11)) & (classIndexMask())) == (isForwardedObjectClassIndexPun()))) {
- referent11 = longAt((referent11 + BaseHeaderSize) + (0L << (shiftForWord())));
- }
- f = referent11;
- /* begin storePointer:ofObject:withValue: */
- assert(!(isForwarded(objOop11)));
- if (isOldObject(objOop11)) {
- /* most stores into young objects */
- if (((f & (tagMask())) == 0)
- && (oopisLessThan(f, GIV(newSpaceLimit)))) {
- /* most stores into young objects */
- /* begin possibleRootStoreInto: */
- if (!(((((usqInt) (longAt(objOop11))) >> (rememberedBitShift())) & 1) != 0)) {
- remember(objOop11);
- }
- }
- }
- longAtput((objOop11 + BaseHeaderSize) + (i << (shiftForWord())), f);
- }
- }
- }
- }
- prevPrevObj11 = prevObj11;
- prevObj11 = objOop11;
- /* begin objectAfter:limit: */
- numSlots111 = byteAt(objOop11 + 7);
- numSlots31 = (numSlots111 == (numSlotsMask())
- ? longAt(objOop11 - BaseHeaderSize)
- : numSlots111);
- if (numSlots31 == 0) {
- slotBytes11 = 8;
- }
- else {
- slotBytes11 = (numSlots31 + (numSlots31 & 1)) << (shiftForWord());
- }
- followingWordAddress11 = (objOop11 + BaseHeaderSize) + slotBytes11;
- if (oopisGreaterThanOrEqualTo(followingWordAddress11, GIV(endOfMemory))) {
- objOop11 = GIV(endOfMemory);
- goto l23;
- }
- flag("endianness");
- followingWord11 = longAt(followingWordAddress11 + 4);
- objOop11 = ((((usqInt) followingWord11) >> (numSlotsHalfShift())) == (numSlotsMask())
- ? followingWordAddress11 + BaseHeaderSize
- : followingWordAddress11);
- l23: /* end objectAfter:limit: */;
- }
- lowestForwarder = lowestForwarder1;
- /* begin sweepToCoallesceFreeSpaceForPigCompactFrom: */
- lowest = ((((lowestForwarder == 0
- ? GIV(endOfMemory)
- : lowestForwarder)) < ((GIV(firstFreeChunk) == 0
- ? GIV(endOfMemory)
- : GIV(firstFreeChunk)))) ? ((lowestForwarder == 0
- ? GIV(endOfMemory)
- : lowestForwarder)) : ((GIV(firstFreeChunk) == 0
- ? GIV(endOfMemory)
- : GIV(firstFreeChunk))));
- firstOfFreeRun = (prevPrevFree = (prevFree = 0));
- /* begin allOldSpaceEntitiesFrom:do: */
- assert(isOldObject(lowest));
- prevPrevObj1 = (prevObj1 = null);
- objOop3 = lowest;
- while (1) {
- assert((objOop3 % (allocationUnit())) == 0);
- if (!(oopisLessThan(objOop3, GIV(endOfMemory)))) break;
- assert((long64At(objOop3)) != 0);
- if ((((longAt(objOop3)) & (classIndexMask())) == (isFreeObjectClassIndexPun()))
- || (((longAt(objOop3)) & ((classIndexMask()) - (isForwardedObjectClassIndexPun()))) == 0)) {
- if (firstOfFreeRun == 0) {
- /* begin setObjectFree: */
- if ((byteAt(objOop3 + 7)) == 0) {
- byteAtput(objOop3 + 7, 1);
- }
- /* begin setFree: */
- long32Atput(objOop3, 0);
- firstOfFreeRun = objOop3;
- startOfFreeRun = ((byteAt(objOop3 + 7)) == (numSlotsMask())
- ? objOop3 - BaseHeaderSize
- : objOop3);
- }
- endOfFreeRun = objOop3;
- }
- else {
- if (firstOfFreeRun != 0) {
- bytes = (addressAfter(endOfFreeRun)) - startOfFreeRun;
- firstOfFreeRun = initFreeChunkWithBytesat(bytes, startOfFreeRun);
- /* begin inSortedFreeListLink:to:given: */
- if (prevFree == 0) {
- GIV(firstFreeChunk) = firstOfFreeRun;
- }
- else {
- /* begin storePointer:ofFreeChunk:withUncheckedValue: */
- assert(isFreeObject(prevFree));
- longAtput((prevFree + BaseHeaderSize) + (0L << (shiftForWord())), prevPrevFree ^ firstOfFreeRun);
- }
- prevPrevFree = prevFree;
- prevFree = firstOfFreeRun;
- firstOfFreeRun = 0;
- }
- }
- prevPrevObj1 = prevObj1;
- prevObj1 = objOop3;
- /* begin objectAfter:limit: */
- numSlots11 = byteAt(objOop3 + 7);
- numSlots3 = (numSlots11 == (numSlotsMask())
- ? longAt(objOop3 - BaseHeaderSize)
- : numSlots11);
- if (numSlots3 == 0) {
- slotBytes1 = 8;
- }
- else {
- slotBytes1 = (numSlots3 + (numSlots3 & 1)) << (shiftForWord());
- }
- followingWordAddress1 = (objOop3 + BaseHeaderSize) + slotBytes1;
- if (oopisGreaterThanOrEqualTo(followingWordAddress1, GIV(endOfMemory))) {
- objOop3 = GIV(endOfMemory);
- goto l9;
- }
- flag("endianness");
- followingWord1 = longAt(followingWordAddress1 + 4);
- objOop3 = ((((usqInt) followingWord1) >> (numSlotsHalfShift())) == (numSlotsMask())
- ? followingWordAddress1 + BaseHeaderSize
- : followingWordAddress1);
- l9: /* end objectAfter:limit: */;
- }
- if (firstOfFreeRun != 0) {
- bytes = (addressAfter(endOfFreeRun)) - startOfFreeRun;
- firstOfFreeRun = initFreeChunkWithBytesat(bytes, startOfFreeRun);
- /* begin inSortedFreeListLink:to:given: */
- if (prevFree == 0) {
- GIV(firstFreeChunk) = firstOfFreeRun;
- }
- else {
- /* begin storePointer:ofFreeChunk:withUncheckedValue: */
- assert(isFreeObject(prevFree));
- longAtput((prevFree + BaseHeaderSize) + (0L << (shiftForWord())), prevPrevFree ^ firstOfFreeRun);
- }
- prevPrevFree = prevFree;
- prevFree = firstOfFreeRun;
- firstOfFreeRun = 0;
- }
- if (prevFree != GIV(firstFreeChunk)) {
- /* begin storePointer:ofFreeChunk:withValue: */
- assert(isFreeObject(prevFree));
- assert((prevPrevFree == 0)
- || (isFreeObject(prevPrevFree)));
- longAtput((prevFree + BaseHeaderSize) + (0L << (shiftForWord())), prevPrevFree);
- }
- GIV(lastFreeChunk) = prevFree;
- /* begin inSortedFreeListLink:to:given: */
- if (GIV(lastFreeChunk) == 0) {
- GIV(firstFreeChunk) = 0;
- }
- else {
- /* begin storePointer:ofFreeChunk:withUncheckedValue: */
- assert(isFreeObject(GIV(lastFreeChunk)));
- longAtput((GIV(lastFreeChunk) + BaseHeaderSize) + (0L << (shiftForWord())), prevPrevFree ^ 0);
- }
- assert(checkTraversableSortedFreeList());
- assert((numberOfForwarders()) == 0);
- }
Advertisement
Add Comment
Please, Sign In to add comment