Guest User

Untitled

a guest
Jul 16th, 2016
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.25 KB | None | 0 0
  1. /*  scavengeReferentsOf: referrer inspects all the pointers in referrer. If
  2.     any are new objects, it has them moved to FutureSurvivorSpace, and
  3.     answers truth. If there are no new referents, it answers falsity. To
  4.     handle weak arrays, if the referrer is weak only scavenge strong slots and
  5.     answer true so that it won't be removed from the remembered set until
  6.     later.  */
  7. /*  forwarding objects should be followed by callers,
  8.     unless the forwarder is a root in the remembered table. */
  9.  
  10.     /* SpurGenerationScavenger>>#scavengeReferentsOf: */
  11. static sqInt NoDbgRegParms
  12. scavengeReferentsOf(sqInt referrer)
  13. {   DECL_MAYBE_SQ_GLOBAL_STRUCT
  14.     sqInt contextSize;
  15.     sqInt fmt;
  16.     sqInt foundNewReferentOrIsWeakling;
  17.     sqInt header;
  18.     sqInt header1;
  19.     sqInt i;
  20.     sqInt newLocation;
  21.     sqInt numLiterals;
  22.     sqInt numSlots;
  23.     usqInt numSlots1;
  24.     usqInt numSlots2;
  25.     sqInt objOop1;
  26.     sqInt referent;
  27.     sqInt referent1;
  28.     sqInt sp;
  29.  
  30.     assert((!(isForwarded(referrer)))
  31.      || (isRemembered(referrer)));
  32.     assert((!(isEphemeron(referrer)))
  33.      || ((isScavengeSurvivor(keyOfEphemeron(referrer)))
  34.      || (isonWeaklingList(referrer, GIV(ephemeronList)))));
  35.     fmt = (((usqInt) (longAt(referrer))) >> (formatShift())) & (formatMask());
  36.     foundNewReferentOrIsWeakling = fmt == (weakArrayFormat());
  37.     /* begin numStrongSlotsOf:format:ephemeronInactiveIf: */
  38.     if (fmt <= 5) {
  39. /* begin numSlotsOf: */
  40.         flag("endianness");
  41.         assert((classIndexOf(referrer)) > (isForwardedObjectClassIndexPun()));
  42.         numSlots1 = byteAt(referrer + 7);
  43.         numSlots2 = (numSlots1 == (numSlotsMask())
  44.             ? longAt(referrer - BaseHeaderSize)
  45.             : numSlots1);
  46.         if (fmt <= 2) {
  47. numSlots = numSlots2;
  48.             goto l6;
  49.         }
  50.         if (fmt == (indexablePointersFormat())) {
  51.             if (((longAt(referrer)) & (classIndexMask())) == ClassMethodContextCompactIndex) {
  52.                 setTraceFlagOnContextsFramesPageIfNeeded(referrer);
  53.                 /* begin fetchStackPointerOf: */
  54.                 sp = longAt((referrer + BaseHeaderSize) + (StackPointerIndex << (shiftForWord())));
  55.                 if (!((sp & 1))) {
  56.                     contextSize = 0;
  57.                     goto l4;
  58.                 }
  59.                 assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(referrer)));
  60.                 contextSize = (sp >> 1);
  61.             l4: /* end fetchStackPointerOf: */;
  62.                 numSlots = CtxtTempFrameStart + contextSize;
  63.                 goto l6;
  64.             }
  65.             numSlots = numSlots2;
  66.             goto l6;
  67.         }
  68.         if (fmt == (weakArrayFormat())) {
  69.             /* begin fixedFieldsOfClass: */
  70.             objOop1 = fetchClassOfNonImm(referrer);
  71.             /* begin fixedFieldsOfClassFormat: */
  72.             numSlots = (((longAt((objOop1 + BaseHeaderSize) + (InstanceSpecificationIndex << (shiftForWord())))) >> 1)) & ((1L << (fixedFieldsFieldWidth())) - 1);
  73.             goto l6;
  74.         }
  75.         assert(fmt == (ephemeronFormat()));
  76.         numSlots = (isScavengeSurvivor((keyOfEphemeron(referrer)))
  77.             ? numSlots2
  78.             : 0);
  79.         goto l6;
  80.     }
  81.     if (fmt == 7) {
  82. numSlots = 1;
  83.         goto l6;
  84.     }
  85.     if (fmt < (firstCompiledMethodFormat())) {
  86.         numSlots = 0;
  87.         goto l6;
  88.     }
  89.     /* begin methodHeaderOf: */
  90.     assert(isCompiledMethod(referrer));
  91.     header1 = longAt((referrer + BaseHeaderSize) + (HeaderIndex << (shiftForWord())));
  92.     if ((header1 & 1)) {
  93. header = header1;
  94.     }
  95.     else {
  96. assert((((usqInt)header1)) < GIV(newSpaceStart));
  97.         assert((((((CogMethod *) header1))->objectHeader)) == (nullHeaderForMachineCodeMethod()));
  98.         header = ((((CogMethod *) header1))->methodHeader);
  99.     }
  100.     /* begin literalCountOfMethodHeader: */
  101.     assert((header & 1));
  102.     numLiterals = ((header >> 1)) & AlternateHeaderNumLiteralsMask;
  103.     numSlots = numLiterals + LiteralStart;
  104. l6: /* end numStrongSlotsOf:format:ephemeronInactiveIf: */;
  105.     for (i = 0; i < numSlots; i += 1) {
  106. referent = longAt((referrer + BaseHeaderSize) + (i << (shiftForWord())));
  107.         if ((referent & (tagMask())) == 0) {
  108.  
  109.             /* a forwarding pointer could be because of become: or scavenging. */
  110. if (((longAt(referent)) & ((classIndexMask()) - (isForwardedObjectClassIndexPun()))) == 0) {
  111.  
  112.                 /* a forwarding pointer could be because of become: or scavenging. */
  113. /* begin followForwarded: */
  114.                 assert(isUnambiguouslyForwarder(referent));
  115.                 referent1 = longAt((referent + BaseHeaderSize) + (0L << (shiftForWord())));
  116.                 while (((referent1 & (tagMask())) == 0)
  117.                  && (((longAt(referent1)) & (classIndexMask())) == (isForwardedObjectClassIndexPun()))) {
  118.                     referent1 = longAt((referent1 + BaseHeaderSize) + (0L << (shiftForWord())));
  119.                 }
  120.                 referent = referent1;
  121.             }
  122.             if (isReallyYoungObject(referent)) {
  123.  
  124.                 /* if target is already in future space forwarding pointer was due to a become:. */
  125. if (oopisGreaterThanOrEqualToandLessThan(referent, ((futureSpace()).start), futureSurvivorStart())) {
  126.  
  127.                     /* if target is already in future space forwarding pointer was due to a become:. */
  128.  
  129.                     /* if target is already in future space forwarding pointer was due to a become:. */
  130. newLocation = referent;
  131.                     foundNewReferentOrIsWeakling = 1;
  132.                 }
  133.                 else {
  134. newLocation = copyAndForward(referent);
  135.                     if (((newLocation & (tagMask())) == 0)
  136.                      && (oopisLessThan(newLocation, GIV(newSpaceLimit)))) {
  137.                         foundNewReferentOrIsWeakling = 1;
  138.                     }
  139.                 }
  140.                 longAtput((referrer + BaseHeaderSize) + (i << (shiftForWord())), newLocation);
  141.             }
  142.             else {
  143. longAtput((referrer + BaseHeaderSize) + (i << (shiftForWord())), referent);
  144.             }
  145.         }
  146.     }
  147.     return foundNewReferentOrIsWeakling;
  148. }
Add Comment
Please, Sign In to add comment