Revision: 2761 Author: eliot Date: 2013-08-01 14:59:19 -0700 (Thu, 01 Aug 2013) Log Message: ----------- CogVM source as per VMMaker.oscog-eem.317
Correct several uses of literalCountOf:, using LiteralStart instead of 1, and BytesPerOop instead of BytesPerWord.
Copy 314 transferTo:from: fix to CoInterpreterMT.
Fix become for cog methods that are not paired with their bytecoded methods (e.g. Newspeak accessors).
Eliminate dead code around contextInstructionPointer:context:.
Eliminate duplicate methodClass asserts in ce*(Send: and simplify some in code compaction & code freeing.
Don't inline freeStackPage:
Revise the inlining change. Global vars passed as parameters must not be read after any non-trivial call.
Use CCodeGenerator>>isAssertSelector: to check for all assert: calls (these are not inlined). hence fix assert:l: uses.
Modified Paths: -------------- branches/Cog/nscogsrc/vm/cogit.c branches/Cog/nscogsrc/vm/cogit.h branches/Cog/nscogsrc/vm/cogmethod.h branches/Cog/nscogsrc/vm/cointerp.c branches/Cog/nscogsrc/vm/cointerp.h branches/Cog/nscogsrc/vm/gcc3x-cointerp.c branches/Cog/nscogsrc/vm/interp.h branches/Cog/nscogsrc/vm/vmCallback.h branches/Cog/src/vm/cogit.c branches/Cog/src/vm/cogit.h branches/Cog/src/vm/cogmethod.h branches/Cog/src/vm/cointerp.c branches/Cog/src/vm/cointerp.h branches/Cog/src/vm/cointerpmt.c branches/Cog/src/vm/cointerpmt.h branches/Cog/src/vm/gcc3x-cointerp.c branches/Cog/src/vm/gcc3x-cointerpmt.c branches/Cog/src/vm/interp.h branches/Cog/src/vm/vmCallback.h
Property Changed: ---------------- branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
Modified: branches/Cog/nscogsrc/vm/cogit.c =================================================================== --- branches/Cog/nscogsrc/vm/cogit.c 2013-07-29 22:32:45 UTC (rev 2760) +++ branches/Cog/nscogsrc/vm/cogit.c 2013-08-01 21:59:19 UTC (rev 2761) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.309 uuid: 2ee24067-8c61-4855-b4b3-4bb419b4fe7f + CCodeGenerator VMMaker.oscog-eem.315 uuid: edf4f6ec-fb34-404f-a50a-f3690c4f6dbb from - StackToRegisterMappingCogit VMMaker.oscog-eem.309 uuid: 2ee24067-8c61-4855-b4b3-4bb419b4fe7f + StackToRegisterMappingCogit VMMaker.oscog-eem.315 uuid: edf4f6ec-fb34-404f-a50a-f3690c4f6dbb */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.309 uuid: 2ee24067-8c61-4855-b4b3-4bb419b4fe7f " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.315 uuid: edf4f6ec-fb34-404f-a50a-f3690c4f6dbb " __DATE__ ; char *__cogitBuildInfo = __buildInfo;
@@ -557,12 +557,10 @@ static CogMethod * fillInMethodHeadersizeselector(CogMethod *method, sqInt size, sqInt selector); static CogMethod * fillInOPICHeadersizenumArgsselector(CogMethod *pic, sqInt size, sqInt numArgs, sqInt selector); static usqInt findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc); -CogBlockMethod * findEnclosingMethodForinHomeMethod(sqInt mcpc, CogMethod *cogMethod); static sqInt findMapLocationForMcpcinMethod(sqInt targetMcpc, CogMethod *cogMethod); static sqInt findMcpcBcpcMatchingBcpc(char *mcpc, sqInt bcpc, void *targetBcpc); static sqInt findMcpcBcpcMatchingMcpc(char *mcpc, sqInt bcpc, void *targetMcpc); CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); -static usqInt findMinAndMaxMethodsPCaround(sqInt blockEntryPC, sqInt mcpc); static CogMethod * findPreviouslyCompiledVersionOfwith(sqInt aMethodObj, sqInt aSelectorOop); static sqInt frameOffsetOfTemporary(sqInt index); static void freeMethod(CogMethod *cogMethod); @@ -3693,14 +3691,16 @@ (dest->objectHeader = objectHeaderValue); if (((dest->cmType)) == CMMethod) {
- /* For non-Newspeak there should ne a one-to-one mapping metween bytecoded and - cog methods. For Newspeak not necessarily, but only for anonymous accessors. */ + /* For non-Newspeak there should be a one-to-one mapping metween bytecoded and + cog methods. For Newspeak not necessarily, but only for anonymous accessors. */ + /* Only update the original method's header if it is referring to this CogMethod. */
- assert(((((sqInt)(rawHeaderOf((dest->methodObject))))) == (((sqInt)source))) - || ((noAssertMethodClassAssociationOf((dest->methodObject))) == (nilObject()))); if ((((sqInt)(rawHeaderOf((dest->methodObject))))) == (((sqInt)source))) { rawHeaderOfput((dest->methodObject), ((sqInt)dest)); } + else { + assert((noAssertMethodClassAssociationOf((dest->methodObject))) == (nilObject())); + } } else { if (((dest->cmType)) == CMOpenPIC) { @@ -3711,11 +3711,11 @@ if (((dest->cmUsageCount)) > 0) { (dest->cmUsageCount = ((sqInt) ((dest->cmUsageCount)) >> 1)); } - dest = ((CogMethod *) ((((sqInt)dest)) + bytes)); + dest = ((CogMethod *) ((((usqInt)dest)) + bytes)); } - source = ((CogMethod *) ((((sqInt)source)) + bytes)); + source = ((CogMethod *) ((((usqInt)source)) + bytes)); } - mzFreeStart = ((sqInt)dest); + mzFreeStart = ((usqInt)dest); methodBytesFreedSinceLastCompaction = 0; }
@@ -8081,23 +8081,6 @@ return 0; }
- -/* Find the CMMethod or CMBlock that encloses mcpc. - If the method contains blocks then, because block dispatch is not in - order, enumerate the block dispatch and find the nearest preceeding entry. */ - -CogBlockMethod * -findEnclosingMethodForinHomeMethod(sqInt mcpc, CogMethod *cogMethod) -{ - assert(((cogMethod->cmType)) == CMMethod); - if (((cogMethod->blockEntryOffset)) == 0) { - return ((CogBlockMethod *) cogMethod); - } - maxMethodBefore = ((CogBlockMethod *) cogMethod); - blockDispatchTargetsForperformarg(cogMethod, findMinAndMaxMethodsPCaround, mcpc); - return maxMethodBefore; -} - static sqInt findMapLocationForMcpcinMethod(sqInt targetMcpc, CogMethod *cogMethod) { @@ -8160,16 +8143,32 @@ return ((CogBlockMethod *) (blockDispatchTargetsForperformarg(cogMethod, findBlockMethodWithEntrystartBcpc, startbcpc))); }
-static usqInt -findMinAndMaxMethodsPCaround(sqInt blockEntryPC, sqInt mcpc) -{ - if (((((usqInt)blockEntryPC)) <= (((usqInt)mcpc))) - && ((((usqInt)blockEntryPC)) > (((usqInt)maxMethodBefore)))) { - maxMethodBefore = ((CogBlockMethod *) (blockEntryPC - (sizeof(CogBlockMethod)))); - } - return 0; -}
+/* Newspeak uses a set of methods to implement accessors, a setter and a + getter for + each inst var offset (e.g. 0 to 255). These accessors are installed under + the relevant + selectors in different method dictionaries as required. These methods + effectively have multiple selectors. The current inline cache design + stores the selector of a + linked send in the header of the target method. So this requires a + one-to-many mapping of bytecoded method to cog method, with the bytecoded + method referring + directly to only one cog method, which will have a specific selector, not + necessarily the right one. It is therefore worth-while searching for a cog + method on this method + that has the right selector. + We could revisit this: + - a send site could have two loads, one for the selector and one for the + class, eliminating the need to store the selector in the header of a cog + method (although it would still be needed in a PIC, because open PICs are + shared) - a set of unpaired cog methods could be maintained to speed up + the search. since + the methodHeader field is effectively unused in an unpaired method the + list could + link through this field (c.f. the openPICList linked through the + methodObject field). */ + static CogMethod * findPreviouslyCompiledVersionOfwith(sqInt aMethodObj, sqInt aSelectorOop) { @@ -8206,13 +8205,15 @@ if (((cogMethod->cmType)) == CMMethod) {
/* For non-Newspeak there should ne a one-to-one mapping between bytecoded and - cog methods. For Newspeak not necessarily, but only for anonymous accessors. */ + cog methods. For Newspeak not necessarily, but only for anonymous accessors. */ + /* Only reset the original method's header if it is referring to this CogMethod. */
- assert(((((sqInt)(rawHeaderOf((cogMethod->methodObject))))) == (((sqInt)cogMethod))) - || ((noAssertMethodClassAssociationOf((cogMethod->methodObject))) == (nilObject()))); if ((((sqInt)(rawHeaderOf((cogMethod->methodObject))))) == (((sqInt)cogMethod))) { rawHeaderOfput((cogMethod->methodObject), (cogMethod->methodHeader)); } + else { + assert((noAssertMethodClassAssociationOf((cogMethod->methodObject))) == (nilObject())); + } (cogMethod->cmRefersToYoung = 0); } if (((cogMethod->cmType)) == CMOpenPIC) { @@ -15017,8 +15018,6 @@ } if (((cogMethod->cmType)) == CMMethod) { assert(((cogMethod->objectHeader)) == (nullHeaderForMachineCodeMethod())); - assert(((rawHeaderOf((cogMethod->methodObject))) == (((sqInt)cogMethod))) - || ((noAssertMethodClassAssociationOf((cogMethod->methodObject))) == (nilObject()))); remappedMethod = remapOop((cogMethod->methodObject)); if (remappedMethod != ((cogMethod->methodObject))) { if (methodHasCogMethod(remappedMethod)) { @@ -15027,10 +15026,17 @@ if (!(withoutForwardingOnandwithsendToCogit((cogMethod->methodObject), remappedMethod, (cogMethod->cmUsesPenultimateLit), methodhasSameCodeAscheckPenultimate))) { error("attempt to become cogged method into different method"); } - rawHeaderOfput((cogMethod->methodObject), (cogMethod->methodHeader)); - (cogMethod->methodHeader = rawHeaderOf(remappedMethod)); - (cogMethod->methodObject = remappedMethod); - rawHeaderOfput(remappedMethod, ((sqInt)cogMethod)); + if ((rawHeaderOf((cogMethod->methodObject))) == (((sqInt)cogMethod))) { + rawHeaderOfput((cogMethod->methodObject), (cogMethod->methodHeader)); + (cogMethod->methodHeader = rawHeaderOf(remappedMethod)); + (cogMethod->methodObject = remappedMethod); + rawHeaderOfput(remappedMethod, ((sqInt)cogMethod)); + } + else { + assert((noAssertMethodClassAssociationOf((cogMethod->methodObject))) == (nilObject())); + (cogMethod->methodHeader = rawHeaderOf(remappedMethod)); + (cogMethod->methodObject = remappedMethod); + } } if (isYoung((cogMethod->methodObject))) { hasYoungObj = 1;
Modified: branches/Cog/nscogsrc/vm/cogit.h =================================================================== --- branches/Cog/nscogsrc/vm/cogit.h 2013-07-29 22:32:45 UTC (rev 2760) +++ branches/Cog/nscogsrc/vm/cogit.h 2013-08-01 21:59:19 UTC (rev 2761) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.309 uuid: 2ee24067-8c61-4855-b4b3-4bb419b4fe7f + CCodeGenerator VMMaker.oscog-eem.315 uuid: edf4f6ec-fb34-404f-a50a-f3690c4f6dbb */
@@ -33,7 +33,6 @@ void enterCogCodePopReceiverAndClassRegs(void); void enterCogCodePopReceiverArg0Regs(void); void enterCogCodePopReceiverArg1Arg0Regs(void); -CogBlockMethod * findEnclosingMethodForinHomeMethod(sqInt mcpc, CogMethod *cogMethod); CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); sqInt genQuickReturnConst(void); sqInt genQuickReturnInstVar(void);
Modified: branches/Cog/nscogsrc/vm/cogmethod.h =================================================================== --- branches/Cog/nscogsrc/vm/cogmethod.h 2013-07-29 22:32:45 UTC (rev 2760) +++ branches/Cog/nscogsrc/vm/cogmethod.h 2013-08-01 21:59:19 UTC (rev 2761) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.309 uuid: 2ee24067-8c61-4855-b4b3-4bb419b4fe7f + CCodeGenerator VMMaker.oscog-eem.315 uuid: edf4f6ec-fb34-404f-a50a-f3690c4f6dbb */
typedef struct {
Modified: branches/Cog/nscogsrc/vm/cointerp.c =================================================================== --- branches/Cog/nscogsrc/vm/cointerp.c 2013-07-29 22:32:45 UTC (rev 2760) +++ branches/Cog/nscogsrc/vm/cointerp.c 2013-08-01 21:59:19 UTC (rev 2761) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.314 uuid: e8cba0d1-78b9-4058-820f-62d6e02e180b + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.317 uuid: 18267235-d270-4acf-8626-28095c535f32 from - CoInterpreter VMMaker.oscog-eem.314 uuid: e8cba0d1-78b9-4058-820f-62d6e02e180b + CoInterpreter VMMaker.oscog-eem.317 uuid: 18267235-d270-4acf-8626-28095c535f32 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.314 uuid: e8cba0d1-78b9-4058-820f-62d6e02e180b " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.317 uuid: 18267235-d270-4acf-8626-28095c535f32 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -505,7 +505,6 @@ sqInt eeInstantiateClassindexableSize(sqInt classPointer, sqInt size); static sqInt eeInstantiateMethodContextByteSize(sqInt sizeInBytes); static sqInt eeInstantiateSmallClasssizeInBytes(sqInt classPointer, sqInt sizeInBytes); -static sqInt encodedNativePCOfcogMethod(sqInt mcpc, CogBlockMethod *cogMethod); static sqInt ensureCallerContext(char *theFP); static void ensureContextIsExecutionSafeAfterAssignToStackPointer(sqInt aContext); static void ensureImageFormatIsUpToDate(sqInt swapBytes); @@ -576,6 +575,7 @@ static sqInt frameStackedReceiverOffsetNumArgs(sqInt numArgs); static sqInt frameStackedReceiverOffset(char *theFP); static void freeStackPageNoAssert(StackPage *aPage); +static sqInt freeStackPage(StackPage *aPage); usqInt freeStartAddress(void); sqInt fullDisplayUpdate(void); void fullGC(void); @@ -604,7 +604,9 @@ sqInt headerOf(sqInt methodPointer); static sqInt headerWhileForwardingOf(sqInt oop); sqInt highBit(usqInt anUnsignedValue); +static sqInt iframeIsBlockActivation(char *theFP); static usqInt iframeMethod(char *theFP); +static sqInt iframeReceiver(char *theFP); static sqInt iframeSavedIP(char *theFP); void ifValidWriteBackStackPointersSaveTo(void *theCFP, void *theCSP, char **savedFPP, char **savedSPP); static sqInt imageSegmentVersion(void); @@ -740,6 +742,8 @@ static CogBlockMethod * mframeCogMethod(char *theFP); CogMethod * mframeHomeMethodExport(void); CogMethod * mframeHomeMethod(char *theFP); +static sqInt mframeIsBlockActivation(char *theFP); +static sqInt mframeReceiver(char *theFP); static sqInt minimumUnusedHeadroom(void); sqInt mMethodClass(void); static sqInt mnuMethodOrNilFor(sqInt rcvr); @@ -757,7 +761,6 @@ static sqInt noInlineTemporaryin(sqInt offset, char *theFP); static sqInt noInlineTemporaryinput(sqInt offset, char *theFP, sqInt valueOop); static sqInt noMarkedContextsOnPage(StackPage *thePage); -static sqInt nonWeakFieldsOf(sqInt oop); sqInt nullHeaderForMachineCodeMethod(void); static sqInt numStkPages(void); sqInt objectAfter(sqInt oop); @@ -1076,6 +1079,7 @@ void print(char *s); static void pruneStackstackp(sqInt stack, sqInt stackp); void pushBool(sqInt trueOrFalse); +static sqInt pushedReceiverOrClosureOfFrame(char *theFP); void pushFloat(double f); sqInt pushInteger(sqInt integerValue); void pushRemappableOop(sqInt oop); @@ -1985,7 +1989,7 @@ /* 575 */ (void (*)(void))0, 0 }; static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void); -const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.314"; +const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.317"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */; volatile int sendTrace;
@@ -4370,9 +4374,7 @@ || (isContext(callerContextOrNil2))); currentCtx = callerContextOrNil2; assert(isContext(currentCtx)); - /* begin freeStackPage: */ - freeStackPageNoAssert(GIV(stackPage)); - assert(pageListIsWellFormed()); + freeStackPage(GIV(stackPage)); while (!((((longAt((currentCtx + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1)) && ((stackPageFor((theFP = frameOfMarriedContext(currentCtx)))) == newPage))) { if (((longAt((currentCtx + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1)) { @@ -4402,9 +4404,7 @@ assert((callerContextOrNil1 == (nilObject())) || (isContext(callerContextOrNil1))); currentCtx = callerContextOrNil1; - /* begin freeStackPage: */ - freeStackPageNoAssert(thePage); - assert(pageListIsWellFormed()); + freeStackPage(thePage); } else { nextCntx = longAt((currentCtx + BaseHeaderSize) + (SenderIndex << ShiftForWord)); @@ -8202,7 +8202,7 @@ } else { if ((fmt < 12) - || (((index >> 1)) >= ((((literalCountOfHeader(headerOf(rcvr))) + LiteralStart) * BytesPerWord) + 1))) { + || (((index >> 1)) >= ((((literalCountOfHeader(headerOf(rcvr))) + LiteralStart) * BytesPerOop) + 1))) { result = (((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << 1) | 1); goto l112; } @@ -8342,7 +8342,7 @@ } else { if ((fmt >= 12) - && (((index >> 1)) < ((((literalCountOfHeader(headerOf(rcvr))) + LiteralStart) * BytesPerWord) + 1))) { + && (((index >> 1)) < ((((literalCountOfHeader(headerOf(rcvr))) + LiteralStart) * BytesPerOop) + 1))) {
/* CompiledMethod */
@@ -10970,7 +10970,7 @@ } else { if ((fmt < 12) - || (((index >> 1)) >= ((((literalCountOfHeader(headerOf(rcvr))) + LiteralStart) * BytesPerWord) + 1))) { + || (((index >> 1)) >= ((((literalCountOfHeader(headerOf(rcvr))) + LiteralStart) * BytesPerOop) + 1))) { result = (((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << 1) | 1); goto l235; } @@ -11110,7 +11110,7 @@ } else { if ((fmt >= 12) - && (((index >> 1)) < ((((literalCountOfHeader(headerOf(rcvr))) + LiteralStart) * BytesPerWord) + 1))) { + && (((index >> 1)) < ((((literalCountOfHeader(headerOf(rcvr))) + LiteralStart) * BytesPerOop) + 1))) {
/* CompiledMethod */
@@ -13265,7 +13265,7 @@ assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(array1))); contextSize = (sp >> 1); l1: /* end fetchStackPointerOf: */; - fieldOffset = (CtxtTempFrameStart + contextSize) * BytesPerWord; + fieldOffset = (CtxtTempFrameStart + contextSize) * BytesPerOop; goto l2; } fieldOffset = (sizeBitsOfSafe(array1)) - BaseHeaderSize; @@ -13285,7 +13285,7 @@ numLiterals = ((((sqInt) headerPointer)) < 0 ? (((usqInt) headerPointer) >> 1) & 65535 : (((usqInt) headerPointer) >> 10) & 255); - fieldOffset = (numLiterals * BytesPerWord) + BaseHeaderSize; + fieldOffset = (numLiterals + LiteralStart) * BytesPerOop; l2: /* end lastPointerOf: */; while (fieldOffset >= BaseHeaderSize) { if ((((usqInt) (longAt(array1 + fieldOffset)))) < (((usqInt) GIV(youngStart)))) { @@ -13417,13 +13417,13 @@ assertl(lifp < ((GIV(stackPage)->baseAddress)), ln); assertl(lisp < lifp, ln); assertl(lifp > lisp, ln); - assertl(lisp >= (((GIV(stackPage)->realStackLimit)) - ((IFrameSlots + 64) * BytesPerWord)), ln); + assertl(lisp >= (((GIV(stackPage)->realStackLimit)) - (stackLimitOffset())), ln); assertl((lifp - lisp) < LargeContextSize, ln); methodField = longAt(lifp + FoxMethod); if (inInterpreter) { - assertl(!((((usqInt)(longAt(lifp + FoxMethod)))) < (startOfMemory())), ln); + assertl(!(isMachineCodeFrame(lifp)), ln); assertl(GIV(method) == methodField, ln); - assertl((headerIndicatesAlternateBytecodeSet(headerOf(GIV(method)))) == (GIV(bytecodeSetSelector) == 256), ln); + assertl((methodUsesAlternateBytecodeSet(GIV(method))) == (GIV(bytecodeSetSelector) == 256), ln);
if ((assertal((((usqInt)methodField)) > (startOfMemory()), ln)) && (assertal((((usqInt)methodField)) < (freeStart()), ln))) { @@ -13437,13 +13437,11 @@ && (lip < ((methodField + (byteLengthOf(methodField))) + BaseHeaderSize)), ln); } } - assertl(((byteAt((lifp + FoxIFrameFlags) + 3)) != 0) - || ((longAt(lifp + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(lifp + FoxMethod)))) < (startOfMemory()) - ? (mframeCogMethod(lifp)->cmNumArgs) - : byteAt((lifp + FoxIFrameFlags) + 1)))))) == (longAt(lifp + FoxIFReceiver))), ln); + assertl((iframeIsBlockActivation(lifp)) + || ((pushedReceiverOrClosureOfFrame(lifp)) == (iframeReceiver(lifp))), ln); } else { - assertl((((usqInt)(longAt(lifp + FoxMethod)))) < (startOfMemory()), ln); + assertl(isMachineCodeFrame(lifp), ln); if ((assertal((((usqInt)methodField)) >= (minCogMethodAddress()), ln)) && (assertal((((usqInt)methodField)) < (maxCogMethodAddress()), ln))) { /* begin mframeHomeMethod: */ @@ -13454,21 +13452,17 @@ } cogMethod = ((CogMethod *) (methodField1 & MFMethodMask)); l1: /* end mframeHomeMethod: */; - assertl((lip > (methodField + ((((longAt(lifp + FoxMethod)) & MFMethodFlagIsBlockFlag) != 0 + assertl((lip > (methodField + ((mframeIsBlockActivation(lifp) ? sizeof(CogBlockMethod) : sizeof(CogMethod))))) && (lip < (methodField + ((cogMethod->blockSize)))), ln); } - assertl((((longAt(lifp + FoxMethod)) & MFMethodFlagIsBlockFlag) != 0) - || ((longAt(lifp + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(lifp + FoxMethod)))) < (startOfMemory()) - ? (mframeCogMethod(lifp)->cmNumArgs) - : byteAt((lifp + FoxIFrameFlags) + 1)))))) == (longAt(lifp + FoxMFReceiver))), ln); + assertl((mframeIsBlockActivation(lifp)) + || ((pushedReceiverOrClosureOfFrame(lifp)) == (mframeReceiver(lifp))), ln); } if ((longAt(lifp + FoxSavedFP)) == 0) { - assertl(((((usqInt)(longAt(lifp + FoxMethod)))) < (startOfMemory()) - ? ((longAt(lifp + FoxMethod)) & MFMethodFlagHasContextFlag) != 0 - : (byteAt((lifp + FoxIFrameFlags) + 2)) != 0), ln); - assertl((longAt(lifp + FoxThisContext)) == (longAt(((GIV(stackPage)->baseAddress)) - BytesPerWord)), ln); + assertl(frameHasContext(lifp), ln); + assertl((frameContext(lifp)) == (longAt(((GIV(stackPage)->baseAddress)) - BytesPerWord)), ln); } }
@@ -13823,7 +13817,7 @@ assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(array1))); contextSize = (sp >> 1); l2: /* end fetchStackPointerOf: */; - fieldOffset = (CtxtTempFrameStart + contextSize) * BytesPerWord; + fieldOffset = (CtxtTempFrameStart + contextSize) * BytesPerOop; goto l3; } fieldOffset = (sizeBitsOfSafe(array1)) - BaseHeaderSize; @@ -13843,7 +13837,7 @@ numLiterals = ((((sqInt) headerPointer)) < 0 ? (((usqInt) headerPointer) >> 1) & 65535 : (((usqInt) headerPointer) >> 10) & 255); - fieldOffset = (numLiterals * BytesPerWord) + BaseHeaderSize; + fieldOffset = (numLiterals + LiteralStart) * BytesPerOop; l3: /* end lastPointerOf: */; while (fieldOffset >= BaseHeaderSize) { oop1 = longAt(array1 + fieldOffset); @@ -14440,6 +14434,7 @@ char *sp1; char *sp2; char *sp3; + char *theFP; StackPage *thePage; sqInt value;
@@ -14489,13 +14484,14 @@ Make the interior frame the top frame. */
/* begin findFrameAbove:inPage: */ + theFP = GIV(framePointer); fp = (thePage->headFP); - if (fp == GIV(framePointer)) { + if (fp == theFP) { frameAbove = 0; goto l1; } while (((callerFP = frameCallerFP(fp))) != 0) { - if (callerFP == GIV(framePointer)) { + if (callerFP == theFP) { frameAbove = fp; goto l1; } @@ -14796,15 +14792,19 @@ if (((cogMethod->selector)) == GIV(nilObj)) { setSelectorOfto(cogMethod, selector); } - if (((cogMethod->selector)) != selector) { - assert((methodClassAssociationOf(GIV(newMethod))) == (nilObject())); - newCogMethod = cogselector(GIV(newMethod), selector); - if (newCogMethod == null) { - null; + else { + + /* Deal with anonymous accessors, e.g. in Newspeak. The cogMethod may not have the correct + selector. If not, try and compile a new method with the correct selector. */ + + if (((cogMethod->selector)) != selector) { + if (((newCogMethod = cogselector(GIV(newMethod), selector))) == null) { + null; + } + else { + cogMethod = newCogMethod; + } } - else { - cogMethod = newCogMethod; - } } if ((((cogMethod->selector)) == selector) && (canLinkCacheTag)) { @@ -15201,9 +15201,7 @@ || (isContext(callerContextOrNil2))); currentCtx = callerContextOrNil2; assert(isContext(currentCtx)); - /* begin freeStackPage: */ - freeStackPageNoAssert(GIV(stackPage)); - assert(pageListIsWellFormed()); + freeStackPage(GIV(stackPage)); while (1) { assert(isContext(currentCtx)); if ((((longAt((currentCtx + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1)) @@ -15229,9 +15227,7 @@ assert((callerContextOrNil1 == (nilObject())) || (isContext(callerContextOrNil1))); currentCtx = callerContextOrNil1; - /* begin freeStackPage: */ - freeStackPageNoAssert(thePage); - assert(pageListIsWellFormed()); + freeStackPage(thePage); } else { nextCntx = longAt((currentCtx + BaseHeaderSize) + (SenderIndex << ShiftForWord)); @@ -15291,16 +15287,18 @@ { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt aMethodObj; char *sp; + StackPage *thePage;
assert(((anOop & 1)) || (addressCouldBeObj(anOop))); flag("are you really sure setStackPageAndLimit: is needed?"); /* begin setStackPageAndLimit: */ - GIV(stackPage) = GIV(stackPage); + thePage = GIV(stackPage); + GIV(stackPage) = thePage; if (GIV(stackLimit) != (((char *) (((usqInt) -1))))) { GIV(stackLimit) = (GIV(stackPage)->stackLimit); } - markStackPageMostRecentlyUsed(GIV(stackPage)); + markStackPageMostRecentlyUsed(thePage); assert(!(isMachineCodeFrame(GIV(framePointer)))); /* begin setMethod: */ /* begin iframeMethod: */ @@ -15630,15 +15628,19 @@ if (((cogMethod->selector)) == GIV(nilObj)) { setSelectorOfto(cogMethod, selector); } - if (((cogMethod->selector)) != selector) { - assert((methodClassAssociationOf(GIV(newMethod))) == (nilObject())); - newCogMethod = cogselector(GIV(newMethod), selector); - if (newCogMethod == null) { - null; + else { + + /* Deal with anonymous accessors, e.g. in Newspeak. The cogMethod may not have the + correct selector. If not, try and compile a new method with the correct selector. */ + + if (((cogMethod->selector)) != selector) { + if (((newCogMethod = cogselector(GIV(newMethod), selector))) == null) { + null; + } + else { + cogMethod = newCogMethod; + } } - else { - cogMethod = newCogMethod; - } } if ((((cogMethod->selector)) == selector) && (canLinkCacheTag)) { @@ -16318,10 +16320,7 @@ if ((fmt <= 4) || (fmt >= 12)) { if (fmt >= 12) { - - /* + 1 = methodHeader slot */ - - fi = (literalCountOfHeader(headerOf(obj))) + 1; + fi = (literalCountOfHeader(headerOf(obj))) + LiteralStart; } else { if ((fmt == 3) @@ -16665,18 +16664,18 @@ if (!(checkOopHasOkayClass(oop))) { return 0; } + if (!((((((usqInt) (longAt(oop))) >> 8) & 15) <= 4) + || (((((usqInt) (longAt(oop))) >> 8) & 15) >= 12))) { + return 1; + } /* begin isYoung: */ oop1 = (((ccIndex = (((usqInt) (longAt(oop))) >> 12) & 31)) == 0 ? (longAt(oop - BaseHeaderSize)) & AllButTypeMask : longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord))); hasYoung = ((oop1 & 1) == 0) && ((((usqInt) oop1)) >= (((usqInt) GIV(youngStart)))); - if (!((((((usqInt) (longAt(oop))) >> 8) & 15) <= 4) - || (((((usqInt) (longAt(oop))) >> 8) & 15) >= 12))) { - return 1; - } if (((((usqInt) (longAt(oop))) >> 8) & 15) >= 12) { - i = (literalCountOfHeader(headerOf(oop))) - 1; + i = ((literalCountOfHeader(headerOf(oop))) + LiteralStart) - 1; } else { if (((oop & 1) == 0) @@ -17728,7 +17727,7 @@ } else { if ((fmt >= 12) - && (index < ((((literalCountOfHeader(headerOf(rcvr))) + LiteralStart) * BytesPerWord) + 1))) { + && (index < ((((literalCountOfHeader(headerOf(rcvr))) + LiteralStart) * BytesPerOop) + 1))) {
/* CompiledMethod */
@@ -17872,7 +17871,7 @@ } else { if ((fmt < 12) - || (index >= ((((literalCountOfHeader(headerOf(rcvr))) + LiteralStart) * BytesPerWord) + 1))) { + || (index >= ((((literalCountOfHeader(headerOf(rcvr))) + LiteralStart) * BytesPerOop) + 1))) { result = (((byteAt((rcvr + BaseHeaderSize) + (index - 1))) << 1) | 1); goto l1; } @@ -17984,7 +17983,7 @@ assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(array))); contextSize = (sp >> 1); l1: /* end fetchStackPointerOf: */; - fieldOffset = (CtxtTempFrameStart + contextSize) * BytesPerWord; + fieldOffset = (CtxtTempFrameStart + contextSize) * BytesPerOop; goto l2; } fieldOffset = (sizeBitsOfSafe(array)) - BaseHeaderSize; @@ -18004,7 +18003,7 @@ numLiterals = ((((sqInt) headerPointer)) < 0 ? (((usqInt) headerPointer) >> 1) & 65535 : (((usqInt) headerPointer) >> 10) & 255); - fieldOffset = (numLiterals * BytesPerWord) + BaseHeaderSize; + fieldOffset = (numLiterals + LiteralStart) * BytesPerOop; l2: /* end lastPointerOf: */; while (fieldOffset >= BaseHeaderSize) { if (((longAt(array + fieldOffset)) & 1)) { @@ -18049,7 +18048,7 @@ assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(array1))); contextSize = (sp >> 1); l1: /* end fetchStackPointerOf: */; - fieldOffset = (CtxtTempFrameStart + contextSize) * BytesPerWord; + fieldOffset = (CtxtTempFrameStart + contextSize) * BytesPerOop; goto l2; } fieldOffset = (sizeBitsOfSafe(array1)) - BaseHeaderSize; @@ -18069,7 +18068,7 @@ numLiterals = ((((sqInt) headerPointer)) < 0 ? (((usqInt) headerPointer) >> 1) & 65535 : (((usqInt) headerPointer) >> 10) & 255); - fieldOffset = (numLiterals * BytesPerWord) + BaseHeaderSize; + fieldOffset = (numLiterals + LiteralStart) * BytesPerOop; l2: /* end lastPointerOf: */; while (fieldOffset >= BaseHeaderSize) { if (((longAt(array1 + fieldOffset)) & 1)) { @@ -18111,9 +18110,25 @@ static sqInt contextInstructionPointerframe(sqInt theIP, char *theFP) { + sqInt blockOffset; + CogBlockMethod *cogMethod; + CogMethod *homeMethod; + assert(validInstructionPointerinFrame(theIP, theFP)); if ((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory())) { - return encodedNativePCOfcogMethod(theIP, mframeCogMethod(theFP)); + /* begin encodedNativePCOf:cogMethod: */ + VM_LABEL(0encodedNativePCOfcogMethod); + /* begin mframeCogMethod: */ + cogMethod = ((CogBlockMethod *) ((longAt(theFP + FoxMethod)) & MFMethodMask)); + if (theIP == (ceCannotResumePC())) { + return HasBeenReturnedFromMCPC; + } + if (((cogMethod->cmType)) == CMMethod) { + return ((((((sqInt)cogMethod)) - theIP) << 1) | 1); + } + homeMethod = cmHomeMethod(cogMethod); + blockOffset = ((((sqInt)homeMethod)) - (((sqInt)cogMethod))) / (sizeof(CogBlockMethod)); + return ((((((usqInt) blockOffset << 16)) | (((((sqInt)cogMethod)) - theIP) & 65535)) << 1) | 1); } return (((((((theIP == (ceReturnToInterpreterPC()) ? longAt(theFP + FoxIFSavedIP) @@ -18304,12 +18319,10 @@ sqInt i; sqInt newClosure; sqInt newClosure1; - char *theSP;
assert(isMachineCodeFrame(GIV(framePointer))); /* begin ensureFrameIsMarried:SP: */ VM_LABEL(13ensureFrameIsMarriedSP); - theSP = GIV(stackPointer) + ((1 + numCopied) * BytesPerWord); if (((((usqInt)(longAt(GIV(framePointer) + FoxMethod)))) < (startOfMemory()) ? ((longAt(GIV(framePointer) + FoxMethod)) & MFMethodFlagHasContextFlag) != 0 : (byteAt((GIV(framePointer) + FoxIFrameFlags) + 2)) != 0)) { @@ -18317,7 +18330,7 @@ context = longAt(GIV(framePointer) + FoxThisContext); goto l1; } - context = marryFrameSP(GIV(framePointer), theSP); + context = marryFrameSP(GIV(framePointer), GIV(stackPointer) + ((1 + numCopied) * BytesPerWord)); l1: /* end ensureFrameIsMarried:SP: */; /* begin closureIn:numArgs:instructionPointer:numCopiedValues: */ VM_LABEL(2closureInnumArgsinstructionPointernumCopiedValues); @@ -19599,41 +19612,6 @@ }
-/* Encode the mcpc in cogMethod as a value that can be stashed in a context. - Mapping native pcs to bytecode pcs is quite expensive, requiring a search - through the method map. We mitigate this cost by deferring mapping until - we really have to, which is when a context's instruction pointer is - accessed by Smalltalk code. But to defer mapping we have to be able to - distinguish machine code from bytecode pcs, which we do by using negative - values for - machine code pcs. - - As a whorish performance hack we also include the block method offset in - the pc of a block. The least significant 16 bits are the native pc and the - most significant 15 bits are the block start, in block alignment units. So - when mapping back we can find the start of the block. - - See mustMapMachineCodePC:context: for the code that does the actual - mapping. */ - -static sqInt -encodedNativePCOfcogMethod(sqInt mcpc, CogBlockMethod *cogMethod) -{ - sqInt blockOffset; - CogMethod *homeMethod; - - if (mcpc == (ceCannotResumePC())) { - return HasBeenReturnedFromMCPC; - } - if (((cogMethod->cmType)) == CMMethod) { - return ((((((sqInt)cogMethod)) - mcpc) << 1) | 1); - } - homeMethod = cmHomeMethod(cogMethod); - blockOffset = ((((sqInt)homeMethod)) - (((sqInt)cogMethod))) / (sizeof(CogBlockMethod)); - return ((((((usqInt) blockOffset << 16)) | (((((sqInt)cogMethod)) - mcpc) & 65535)) << 1) | 1); -} - - /* Answerr the caller context for a frame. If the frame has a caller frame that doesn't have a context, then marry the caller frame. */
@@ -20377,9 +20355,7 @@
/* theFP is a base frame; it is now alone; free the entire page */
- /* begin freeStackPage: */ - freeStackPageNoAssert(thePage); - assert(pageListIsWellFormed()); + freeStackPage(thePage); } else { callerIP = oopForPointer(frameCallerSavedIP(theFP)); @@ -21019,16 +20995,19 @@ }
-/* During sweep phase we have encountered a weak reference. - Check if its object has gone away (or is about to) and if so, signal a - semaphore. */ -/* Do *not* inline this in sweepPhase - it is quite an unlikely - case to run into a weak reference */ +/* During sweep phase we have encountered a weak reference. Check if its + object has gone away (or is about to) and if so, signal a semaphore. Do + *not* inline + this in sweepPhase - it is quite an unlikely case to run into a weak + reference */
static void finalizeReference(usqInt oop) { DECL_MAYBE_SQ_GLOBAL_STRUCT + sqInt ccIndex; sqInt chunk; + sqInt class; + sqInt classFormat; sqInt contextSize; sqInt firstField; sqInt fmt; @@ -21037,12 +21016,21 @@ sqInt i; sqInt lastField; sqInt methodHeader; + sqInt numFields; sqInt numLiterals; sqInt oopGone; sqInt sp; usqInt weakOop;
- firstField = BaseHeaderSize + ((nonWeakFieldsOf(oop)) << ShiftForWord); + /* begin nonWeakFieldsOf: */ + VM_LABEL(0nonWeakFieldsOf); + assert(isWeakNonInt(oop)); + class = (((ccIndex = (((usqInt) (longAt(oop))) >> 12) & 31)) == 0 + ? (longAt(oop - BaseHeaderSize)) & AllButTypeMask + : longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord))); + classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1; + numFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1; + firstField = BaseHeaderSize + (numFields << ShiftForWord); /* begin lastPointerOf: */ header = longAt(oop); fmt = (((usqInt) header) >> 8) & 15; @@ -21061,7 +21049,7 @@ assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(oop))); contextSize = (sp >> 1); l1: /* end fetchStackPointerOf: */; - lastField = (CtxtTempFrameStart + contextSize) * BytesPerWord; + lastField = (CtxtTempFrameStart + contextSize) * BytesPerOop; goto l2; } lastField = (sizeBitsOfSafe(oop)) - BaseHeaderSize; @@ -21081,7 +21069,7 @@ numLiterals = ((((sqInt) headerPointer)) < 0 ? (((usqInt) headerPointer) >> 1) & 65535 : (((usqInt) headerPointer) >> 10) & 255); - lastField = (numLiterals * BytesPerWord) + BaseHeaderSize; + lastField = (numLiterals + LiteralStart) * BytesPerOop; l2: /* end lastPointerOf: */; for (i = firstField; i <= lastField; i += BytesPerWord) {
@@ -22235,6 +22223,21 @@ (GIV(mostRecentlyUsedPage)->nextPage = aPage); }
+ +/* <InterpreterStackPage> */ +/* MRUP-->used page<->used page<->used page<->used page<--LRUP + ^ <-next-prev-> ^ + | | + v <-prev-next-> v + free page<->free page<->free page<->free page */ + +static sqInt +freeStackPage(StackPage *aPage) +{ + freeStackPageNoAssert(aPage); + assert(pageListIsWellFormed()); +} + usqInt freeStartAddress(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT @@ -23038,6 +23041,15 @@ return bitNo + shifted; }
+ +/* <Integer> */ + +static sqInt +iframeIsBlockActivation(char *theFP) +{ + return (byteAt((theFP + FoxIFrameFlags) + 3)) != 0; +} + static usqInt iframeMethod(char *theFP) { @@ -23045,6 +23057,12 @@ }
static sqInt +iframeReceiver(char *theFP) +{ + return longAt(theFP + FoxIFReceiver); +} + +static sqInt iframeSavedIP(char *theFP) { return longAt(theFP + FoxIFSavedIP); @@ -25404,7 +25422,7 @@ assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(oop))); contextSize = (sp >> 1); l1: /* end fetchStackPointerOf: */; - return (CtxtTempFrameStart + contextSize) * BytesPerWord; + return (CtxtTempFrameStart + contextSize) * BytesPerOop; } return (sizeBitsOfSafe(oop)) - BaseHeaderSize; } @@ -25421,7 +25439,7 @@ numLiterals = ((((sqInt) headerPointer)) < 0 ? (((usqInt) headerPointer) >> 1) & 65535 : (((usqInt) headerPointer) >> 10) & 255); - return (numLiterals * BytesPerWord) + BaseHeaderSize; + return (numLiterals + LiteralStart) * BytesPerOop; }
sqInt @@ -25758,7 +25776,7 @@
/* compiled method; start after methodHeader and literals */
- wordAddr = (wordAddr + BytesPerWord) + ((literalCountOfHeader(headerOf(oop1))) * BytesPerWord); + wordAddr += ((literalCountOfHeader(headerOf(oop1))) + LiteralStart) * BytesPerOop; } /* begin reverseBytesFrom:to: */ stopAddr1 = oop1 + (sizeBitsOf(oop1)); @@ -26146,9 +26164,7 @@ sqInt header1; sqInt header2; sqInt header3; - sqInt headerPointer; sqInt i; - sqInt methodHeader; sqInt obj; sqInt obj1; sqInt oop; @@ -26191,16 +26207,7 @@ if ((((((usqInt) (longAt(oop))) >> 8) & 15) <= 4) || (((((usqInt) (longAt(oop))) >> 8) & 15) >= 12)) { if (((((usqInt) (longAt(oop))) >> 8) & 15) >= 12) { - /* begin literalCountOfHeader: */ - /* begin headerOf: */ - methodHeader = longAt((oop + BaseHeaderSize) + (HeaderIndex << ShiftForWord)); - headerPointer = (isCogMethodReference(methodHeader) - ? (assert(((((CogMethod *) methodHeader)->objectHeader)) == (nullHeaderForMachineCodeMethod())), - (((CogMethod *) methodHeader)->methodHeader)) - : methodHeader); - i = ((((sqInt) headerPointer)) < 0 - ? (((usqInt) headerPointer) >> 1) & 65535 - : (((usqInt) headerPointer) >> 10) & 255); + i = (literalCountOfHeader(headerOf(oop))) + LiteralStart; } else { if (((((usqInt) (longAt(oop))) >> 12) & 31) == ClassMethodContextCompactIndex) { @@ -27296,9 +27303,7 @@ if ((!(isFree(thePage))) && (((thePage->trace)) == 0)) { assert(noMarkedContextsOnPage(thePage)); - /* begin freeStackPage: */ - freeStackPageNoAssert(thePage); - assert(pageListIsWellFormed()); + freeStackPage(thePage); } assert(((thePage->trace = -1)) != 0); } @@ -27612,8 +27617,14 @@ markAndTrace(sqInt oop) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt action; + sqInt ccIndex; + sqInt ccIndex1; sqInt child; sqInt childType; + sqInt class; + sqInt class1; + sqInt classFormat; + sqInt classFormat1; sqInt contextSize; sqInt contextSize1; sqInt field; @@ -27634,8 +27645,9 @@ sqInt lastFieldOffset1; sqInt methodHeader; sqInt methodHeader1; - sqInt numLiterals; - sqInt numLiterals1; + sqInt numFields; + sqInt numFields1; + sqInt oop1; sqInt parentField; void *pointer; void *pointer1; @@ -27682,7 +27694,15 @@ } GIV(weakRoots)[GIV(weakRootCount)] = oop; } - lastFieldOffset = (nonWeakFieldsOf(oop)) << ShiftForWord; + /* begin nonWeakFieldsOf: */ + VM_LABEL(1nonWeakFieldsOf); + assert(isWeakNonInt(oop)); + class1 = (((ccIndex1 = (((usqInt) (longAt(oop))) >> 12) & 31)) == 0 + ? (longAt(oop - BaseHeaderSize)) & AllButTypeMask + : longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex1 - 1) << ShiftForWord))); + classFormat1 = (longAt((class1 + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1; + numFields1 = (((((usqInt) classFormat1) >> 11) & 192) + ((((usqInt) classFormat1) >> 2) & 63)) - 1; + lastFieldOffset = numFields1 * BytesPerWord; goto l7; } if (((((usqInt) header4) >> 12) & 31) == ClassMethodContextCompactIndex) { @@ -27715,7 +27735,7 @@ contextSize1 = (sp1 >> 1); l6: /* end fetchStackPointerOf: */; assert((ReceiverIndex + contextSize1) < (lengthOfbaseHeaderformat(oop, header4, fmt1))); - lastFieldOffset = (CtxtTempFrameStart + contextSize1) * BytesPerWord; + lastFieldOffset = (CtxtTempFrameStart + contextSize1) * BytesPerOop; goto l7; } } @@ -27743,10 +27763,10 @@ ? (assert(((((CogMethod *) methodHeader1)->objectHeader)) == (nullHeaderForMachineCodeMethod())), (((CogMethod *) methodHeader1)->methodHeader)) : methodHeader1); - numLiterals1 = ((((sqInt) headerPointer1)) < 0 + numFields1 = ((((sqInt) headerPointer1)) < 0 ? (((usqInt) headerPointer1) >> 1) & 65535 : (((usqInt) headerPointer1) >> 10) & 255); - lastFieldOffset = (numLiterals1 * BytesPerWord) + BaseHeaderSize; + lastFieldOffset = (numFields1 + LiteralStart) * BytesPerOop; l7: /* end lastPointerOf:recordWeakRoot: */; field = oop + lastFieldOffset; action = StartField; @@ -27822,7 +27842,8 @@ goto l2; } /* begin lastPointerOf:recordWeakRoot: */ - header3 = longAt(child); + oop1 = child; + header3 = longAt(oop1); fmt = (((usqInt) header3) >> 8) & 15; if (fmt <= 4) { if (fmt >= 3) { @@ -27835,18 +27856,26 @@ if (!(((GIV(weakRootCount) += 1)) <= WeakRootTableSize)) { error("weakRoots table overflow"); } - GIV(weakRoots)[GIV(weakRootCount)] = child; + GIV(weakRoots)[GIV(weakRootCount)] = oop1; } - lastFieldOffset1 = (nonWeakFieldsOf(child)) << ShiftForWord; + /* begin nonWeakFieldsOf: */ + VM_LABEL(2nonWeakFieldsOf); + assert(isWeakNonInt(oop1)); + class = (((ccIndex = (((usqInt) (longAt(oop1))) >> 12) & 31)) == 0 + ? (longAt(oop1 - BaseHeaderSize)) & AllButTypeMask + : longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord))); + classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1; + numFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1; + lastFieldOffset1 = numFields * BytesPerWord; goto l5; } if (((((usqInt) header3) >> 12) & 31) == ClassMethodContextCompactIndex) { /* begin setTraceFlagOnContextsFramesPageIfNeeded: */ - if ((((longAt((child + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1)) - && (!(isWidowedContext(child)))) { + if ((((longAt((oop1 + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1)) + && (!(isWidowedContext(oop1)))) { /* begin stackPageFor: */ /* begin frameOfMarriedContext: */ - value = longAt((child + BaseHeaderSize) + (SenderIndex << ShiftForWord)); + value = longAt((oop1 + BaseHeaderSize) + (SenderIndex << ShiftForWord)); /* begin withoutSmallIntegerTags: */ assert((value & 1)); pointer = ((char *) (pointerForOop(value - 1))); @@ -27861,28 +27890,28 @@ } } /* begin fetchStackPointerOf: */ - sp = longAt((child + BaseHeaderSize) + (StackPointerIndex << ShiftForWord)); + sp = longAt((oop1 + BaseHeaderSize) + (StackPointerIndex << ShiftForWord)); if (!((sp & 1))) { contextSize = 0; goto l4; } - assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(child))); + assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(oop1))); contextSize = (sp >> 1); l4: /* end fetchStackPointerOf: */; - assert((ReceiverIndex + contextSize) < (lengthOfbaseHeaderformat(child, header3, fmt))); - lastFieldOffset1 = (CtxtTempFrameStart + contextSize) * BytesPerWord; + assert((ReceiverIndex + contextSize) < (lengthOfbaseHeaderformat(oop1, header3, fmt))); + lastFieldOffset1 = (CtxtTempFrameStart + contextSize) * BytesPerOop; goto l5; } } /* begin sizeBitsOfSafe: */ - header11 = longAt(child); + header11 = longAt(oop1); type1 = ((header11 & SizeMask) == 0 ? HeaderTypeSizeAndClass : ((header11 & CompactClassMask) == 0 ? HeaderTypeClass : HeaderTypeShort)); sz = (type1 == HeaderTypeSizeAndClass - ? (longAt(child - (BytesPerWord * 2))) & AllButTypeMask + ? (longAt(oop1 - (BytesPerWord * 2))) & AllButTypeMask : header11 & SizeMask); lastFieldOffset1 = sz - BaseHeaderSize; goto l5; @@ -27893,15 +27922,15 @@ } /* begin literalCountOfHeader: */ /* begin headerOf: */ - methodHeader = longAt((child + BaseHeaderSize) + (HeaderIndex << ShiftForWord)); + methodHeader = longAt((oop1 + BaseHeaderSize) + (HeaderIndex << ShiftForWord)); headerPointer = (isCogMethodReference(methodHeader) ? (assert(((((CogMethod *) methodHeader)->objectHeader)) == (nullHeaderForMachineCodeMethod())), (((CogMethod *) methodHeader)->methodHeader)) : methodHeader); - numLiterals = ((((sqInt) headerPointer)) < 0 + numFields = ((((sqInt) headerPointer)) < 0 ? (((usqInt) headerPointer) >> 1) & 65535 : (((usqInt) headerPointer) >> 10) & 255); - lastFieldOffset1 = (numLiterals * BytesPerWord) + BaseHeaderSize; + lastFieldOffset1 = (numFields + LiteralStart) * BytesPerOop; l5: /* end lastPointerOf:recordWeakRoot: */; header1 = (header1 & AllButTypeMask) | (MarkBit | HeaderTypeGC); longAtput(child, header1); @@ -28619,6 +28648,21 @@ }
+/* <Integer> */ + +static sqInt +mframeIsBlockActivation(char *theFP) +{ + return ((longAt(theFP + FoxMethod)) & MFMethodFlagIsBlockFlag) != 0; +} + +static sqInt +mframeReceiver(char *theFP) +{ + return longAt(theFP + FoxMFReceiver); +} + + /* Traverse all stack pages looking for non-zero bytes in the headroom part of each page. Answer the minimum size of unused headroom (zero bytes) in the pages. This @@ -28929,7 +28973,7 @@ assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(methodObj))); contextSize = (sp >> 1); l2: /* end fetchStackPointerOf: */; - startBcpc = (CtxtTempFrameStart + contextSize) * BytesPerWord; + startBcpc = (CtxtTempFrameStart + contextSize) * BytesPerOop; goto l3; } startBcpc = (sizeBitsOfSafe(methodObj)) - BaseHeaderSize; @@ -28949,7 +28993,7 @@ numLiterals = ((((sqInt) headerPointer)) < 0 ? (((usqInt) headerPointer) >> 1) & 65535 : (((usqInt) headerPointer) >> 10) & 255); - startBcpc = (numLiterals * BytesPerWord) + BaseHeaderSize; + startBcpc = (numLiterals + LiteralStart) * BytesPerOop; l3: /* end lastPointerOf: */; } /* begin ensureMethodIsCogged: */ @@ -29208,31 +29252,6 @@ return 1; }
- -/* Return the number of non-weak fields in oop (i.e. the number of fixed - fields). Note: The following is copied from fixedFieldsOf:format:length: - since we do know - the format of the oop (e.g. format = 4) and thus don't need the length. - */ - -static sqInt -nonWeakFieldsOf(sqInt oop) -{ DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt ccIndex; - sqInt class; - sqInt classFormat; - - - /* No need to inline - we won't call this often */ - - assert(isWeakNonInt(oop)); - class = (((ccIndex = (((usqInt) (longAt(oop))) >> 12) & 31)) == 0 - ? (longAt(oop - BaseHeaderSize)) & AllButTypeMask - : longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord))); - classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1; - return (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1; -} - sqInt nullHeaderForMachineCodeMethod(void) { @@ -30117,7 +30136,7 @@ assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(array1))); contextSize = (sp >> 1); l3: /* end fetchStackPointerOf: */; - fieldOffset = (CtxtTempFrameStart + contextSize) * BytesPerWord; + fieldOffset = (CtxtTempFrameStart + contextSize) * BytesPerOop; goto l4; } fieldOffset = (sizeBitsOfSafe(array1)) - BaseHeaderSize; @@ -30137,7 +30156,7 @@ numLiterals = ((((sqInt) headerPointer)) < 0 ? (((usqInt) headerPointer) >> 1) & 65535 : (((usqInt) headerPointer) >> 10) & 255); - fieldOffset = (numLiterals * BytesPerWord) + BaseHeaderSize; + fieldOffset = (numLiterals + LiteralStart) * BytesPerOop; l4: /* end lastPointerOf: */; while (fieldOffset >= BaseHeaderSize) { oop1 = longAt(array1 + fieldOffset); @@ -31597,7 +31616,6 @@ sqInt frameNumArgs1; sqInt i; sqInt methodHeader; - sqInt methodPointer; sqInt newCopy; sqInt objHeader; sqInt rcvr; @@ -31670,8 +31688,7 @@
/* begin rawHeaderOf:put: */ /* begin headerOf: */ - methodPointer = longAt(GIV(stackPointer)); - methodHeader = longAt((methodPointer + BaseHeaderSize) + (HeaderIndex << ShiftForWord)); + methodHeader = longAt(((longAt(GIV(stackPointer))) + BaseHeaderSize) + (HeaderIndex << ShiftForWord)); cogMethodOrMethodHeader = (isCogMethodReference(methodHeader) ? (assert(((((CogMethod *) methodHeader)->objectHeader)) == (nullHeaderForMachineCodeMethod())), (((CogMethod *) methodHeader)->methodHeader)) @@ -37815,6 +37832,7 @@ static void primitiveInterruptSemaphore(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT + sqInt anObject; sqInt arg; sqInt ccIndex; sqInt top; @@ -37837,11 +37855,12 @@ } else { /* begin splObj:put: */ + anObject = GIV(nilObj); /* begin storePointer:ofObject:withValue: */ if ((((usqInt) GIV(specialObjectsOop))) < (((usqInt) GIV(youngStart)))) { - possibleRootStoreIntovalue(GIV(specialObjectsOop), GIV(nilObj)); + possibleRootStoreIntovalue(GIV(specialObjectsOop), anObject); } - longAtput((GIV(specialObjectsOop) + BaseHeaderSize) + (TheInterruptSemaphore << ShiftForWord), GIV(nilObj)); + longAtput((GIV(specialObjectsOop) + BaseHeaderSize) + (TheInterruptSemaphore << ShiftForWord), anObject); } }
@@ -38628,6 +38647,7 @@ static void primitiveLowSpaceSemaphore(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT + sqInt anObject; sqInt arg; sqInt ccIndex; sqInt top; @@ -38650,11 +38670,12 @@ } else { /* begin splObj:put: */ + anObject = GIV(nilObj); /* begin storePointer:ofObject:withValue: */ if ((((usqInt) GIV(specialObjectsOop))) < (((usqInt) GIV(youngStart)))) { - possibleRootStoreIntovalue(GIV(specialObjectsOop), GIV(nilObj)); + possibleRootStoreIntovalue(GIV(specialObjectsOop), anObject); } - longAtput((GIV(specialObjectsOop) + BaseHeaderSize) + (TheLowSpaceSemaphore << ShiftForWord), GIV(nilObj)); + longAtput((GIV(specialObjectsOop) + BaseHeaderSize) + (TheLowSpaceSemaphore << ShiftForWord), anObject); } }
@@ -39973,14 +39994,12 @@ sqInt header; sqInt header1; sqInt header2; - sqInt headerPointer; sqInt i; sqInt i1; sqInt iLimiT; sqInt iLimiT1; sqInt index; sqInt methodField; - sqInt methodHeader; sqInt next; sqInt path; char *sp; @@ -40146,16 +40165,7 @@ hdr = longAt(next); longAtput(next, hdr | MarkBit); if (((((usqInt) hdr) >> 8) & 15) >= 12) { - /* begin literalCountOfHeader: */ - /* begin headerOf: */ - methodHeader = longAt((next + BaseHeaderSize) + (HeaderIndex << ShiftForWord)); - headerPointer = (isCogMethodReference(methodHeader) - ? (assert(((((CogMethod *) methodHeader)->objectHeader)) == (nullHeaderForMachineCodeMethod())), - (((CogMethod *) methodHeader)->methodHeader)) - : methodHeader); - index = ((((sqInt) headerPointer)) < 0 - ? (((usqInt) headerPointer) >> 1) & 65535
@@ Diff output truncated at 50000 characters. @@
vm-dev@lists.squeakfoundation.org