[Vm-dev] [commit][3249] CogVM source as per VMMaker.oscog-eem.1048

commits at squeakvm.org commits at squeakvm.org
Tue Feb 10 23:19:31 UTC 2015


Revision: 3249
Author:   eliot
Date:     2015-02-10 15:19:26 -0800 (Tue, 10 Feb 2015)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.1048

Refactor leak checking code so that GCModes are flags and coincide with flags
for what GC events to leak check.  Hence ensure leak checking is actually run
when requested.  As part of this move the shrink action from postGCAction:
into the memory managers and hence allow Spur to not shrink on scavenge.

Fix bugs with immediate character printing.
Allow printing the mark state of free chunks.

Spur:
Fix some dumb slips in the image segment code.

Only copy-and-forward in remapObj: in the right cicumstance.
Add an assert to remapObj:.

Have lengthOf: answer 0 for ephemerons and
something sensible for 64-bit indexable on 32-bits.

Scavenging ephemerons should update the ephemeron's key with the scavenged key.

Modified Paths:
--------------
    branches/Cog/nscogsrc/plugins/LargeIntegers/LargeIntegers.c
    branches/Cog/nscogsrc/vm/cogit.c
    branches/Cog/nscogsrc/vm/cogit.h
    branches/Cog/nscogsrc/vm/cointerp.c
    branches/Cog/nscogsrc/vm/cointerp.h
    branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
    branches/Cog/nsspursrc/vm/cogit.c
    branches/Cog/nsspursrc/vm/cogit.h
    branches/Cog/nsspursrc/vm/cointerp.c
    branches/Cog/nsspursrc/vm/cointerp.h
    branches/Cog/nsspursrc/vm/gcc3x-cointerp.c
    branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c
    branches/Cog/nsspurstacksrc/vm/interp.c
    branches/Cog/sistasrc/vm/cogit.c
    branches/Cog/sistasrc/vm/cogit.h
    branches/Cog/sistasrc/vm/cointerp.c
    branches/Cog/sistasrc/vm/cointerp.h
    branches/Cog/sistasrc/vm/gcc3x-cointerp.c
    branches/Cog/spursistasrc/vm/cogit.c
    branches/Cog/spursistasrc/vm/cogit.h
    branches/Cog/spursistasrc/vm/cointerp.c
    branches/Cog/spursistasrc/vm/cointerp.h
    branches/Cog/spursistasrc/vm/gcc3x-cointerp.c
    branches/Cog/spursrc/vm/cogit.c
    branches/Cog/spursrc/vm/cogit.h
    branches/Cog/spursrc/vm/cointerp.c
    branches/Cog/spursrc/vm/cointerp.h
    branches/Cog/spursrc/vm/gcc3x-cointerp.c
    branches/Cog/spurstack64src/vm/gcc3x-interp.c
    branches/Cog/spurstack64src/vm/interp.c
    branches/Cog/spurstacksrc/vm/gcc3x-interp.c
    branches/Cog/spurstacksrc/vm/interp.c
    branches/Cog/src/plugins/LargeIntegers/LargeIntegers.c
    branches/Cog/src/vm/cogit.c
    branches/Cog/src/vm/cogit.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/stacksrc/vm/gcc3x-interp.c
    branches/Cog/stacksrc/vm/interp.c

Property Changed:
----------------
    branches/Cog/platforms/Cross/vm/sqSCCSVersion.h

Modified: branches/Cog/nscogsrc/plugins/LargeIntegers/LargeIntegers.c
===================================================================
--- branches/Cog/nscogsrc/plugins/LargeIntegers/LargeIntegers.c	2015-02-05 00:50:56 UTC (rev 3248)
+++ branches/Cog/nscogsrc/plugins/LargeIntegers/LargeIntegers.c	2015-02-10 23:19:26 UTC (rev 3249)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.1028 uuid: 19752f44-5207-45a2-9930-ae424e662f66
+	SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.1048 uuid: 8c759c0d-f612-4018-8a05-45ec7f6af78f
    from
-	LargeIntegersPlugin VMMaker.oscog-eem.1028 uuid: 19752f44-5207-45a2-9930-ae424e662f66
+	LargeIntegersPlugin VMMaker.oscog-eem.1048 uuid: 8c759c0d-f612-4018-8a05-45ec7f6af78f
  */
-static char __buildInfo[] = "LargeIntegersPlugin VMMaker.oscog-eem.1028 uuid: 19752f44-5207-45a2-9930-ae424e662f66 " __DATE__ ;
+static char __buildInfo[] = "LargeIntegersPlugin VMMaker.oscog-eem.1048 uuid: 8c759c0d-f612-4018-8a05-45ec7f6af78f " __DATE__ ;
 
 
 
@@ -173,9 +173,9 @@
 struct VirtualMachine* interpreterProxy;
 static const char *moduleName =
 #ifdef SQUEAK_BUILTIN_PLUGIN
-	"LargeIntegers v1.5 VMMaker.oscog-eem.1028 (i)"
+	"LargeIntegers v1.5 VMMaker.oscog-eem.1048 (i)"
 #else
-	"LargeIntegers v1.5 VMMaker.oscog-eem.1028 (e)"
+	"LargeIntegers v1.5 VMMaker.oscog-eem.1048 (e)"
 #endif
 ;
 static const int  orOpIndex = 1;
@@ -3310,18 +3310,13 @@
 EXPORT(sqInt)
 primGetModuleName(void)
 {
-	sqInt i;
 	sqInt strLen;
 	sqInt strOop;
-	char *strPtr;
 
 	/* missing DebugCode */;
 	strLen = strlen(getModuleName());
 	strOop = instantiateClassindexableSize(classString(), strLen);
-	strPtr = firstIndexableField(strOop);
-	for (i = 0; i < strLen; i += 1) {
-		strPtr[i] = ((getModuleName())[i]);
-	}
+	strncpy(firstIndexableField(strOop), getModuleName(), strLen);
 	if (failed()) {
 		return null;
 	}

Modified: branches/Cog/nscogsrc/vm/cogit.c
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.c	2015-02-05 00:50:56 UTC (rev 3248)
+++ branches/Cog/nscogsrc/vm/cogit.c	2015-02-10 23:19:26 UTC (rev 3249)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1039 uuid: 931d69b1-7be3-42dd-8833-1ba325d2b5f2
+	CCodeGenerator VMMaker.oscog-eem.1048 uuid: 8c759c0d-f612-4018-8a05-45ec7f6af78f
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.1039 uuid: 931d69b1-7be3-42dd-8833-1ba325d2b5f2
+	StackToRegisterMappingCogit VMMaker.oscog-eem.1048 uuid: 8c759c0d-f612-4018-8a05-45ec7f6af78f
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1039 uuid: 931d69b1-7be3-42dd-8833-1ba325d2b5f2 " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1048 uuid: 8c759c0d-f612-4018-8a05-45ec7f6af78f " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -190,10 +190,9 @@
 #define FoxMFReceiver -12
 #define FoxThisContext -8
 #define FPReg -1
-#define GCModeBecome 4
+#define GCModeBecome 8
 #define GCModeFull 1
-#define GCModeIncr 2
-#define GCModeScavenge 3
+#define GCModeNewSpace 2
 #define GPRegMax -3
 #define GPRegMin -8
 #define HasBytecodePC 5
@@ -598,7 +597,7 @@
 void checkAssertsEnabledInCogit(void);
 static sqInt checkIfValidOopRefAndTargetpccogMethod(sqInt annotation, char *mcpc, sqInt cogMethod) NoDbgRegParms;
 static sqInt checkIfValidOopRefpccogMethod(sqInt annotation, char *mcpc, sqInt cogMethod) NoDbgRegParms;
-sqInt checkIntegrityOfObjectReferencesInCode(sqInt fullGCFlag);
+sqInt checkIntegrityOfObjectReferencesInCode(sqInt gcModes);
 static sqInt checkMaybeObjRefAt(sqInt mcpc) NoDbgRegParms;
 static sqInt checkValidObjectReferencesInClosedPIC(CogMethod *cPIC) NoDbgRegParms;
 static sqInt closedPICRefersToUnmarkedObject(CogMethod *cPIC) NoDbgRegParms;
@@ -9035,7 +9034,7 @@
 /*	Answer if all references to objects in machine-code are valid. */
 
 sqInt
-checkIntegrityOfObjectReferencesInCode(sqInt fullGCFlag)
+checkIntegrityOfObjectReferencesInCode(sqInt gcModes)
 {
     CogMethod *cogMethod;
     sqInt count;
@@ -9088,7 +9087,8 @@
 				if ((mapForperformUntilarg(cogMethod, checkIfValidOopRefpccogMethod, ((sqInt)cogMethod))) != 0) {
 					ok = 0;
 				}
-				if (!fullGCFlag) {
+				if ((hasSpurMemoryManagerAPI())
+				 || (gcModes & GCModeNewSpace)) {
 					if (((isYoungObject((cogMethod->methodObject)))
 					 || (isYoung((cogMethod->selector))))
 					 && (!((cogMethod->cmRefersToYoung)))) {
@@ -9413,7 +9413,7 @@
 		voidYoungReferrersPostTenureAll();
 	}
 	assert(allMethodsHaveCorrectHeader());
-	assert((gcMode == GCModeBecome)
+	assert(((gcMode & (GCModeFull + GCModeNewSpace)) == 0)
 	 || (kosherYoungReferrers()));
 }
 
@@ -12315,8 +12315,7 @@
 {
 	
 	switch (gcMode) {
-	case GCModeScavenge:
-	case GCModeIncr:
+	case GCModeNewSpace:
 		mapObjectReferencesInMachineCodeForYoungGC();
 		break;
 	case GCModeFull:
@@ -12401,7 +12400,7 @@
 		}
 		pointer += BytesPerWord;
 	}
-	if (leakCheckIncrementalGC()) {
+	if (leakCheckNewSpaceGC()) {
 		assert(allMachineCodeObjectReferencesValid());
 	}
 	if (codeModified) {

Modified: branches/Cog/nscogsrc/vm/cogit.h
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.h	2015-02-05 00:50:56 UTC (rev 3248)
+++ branches/Cog/nscogsrc/vm/cogit.h	2015-02-10 23:19:26 UTC (rev 3249)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1039 uuid: 931d69b1-7be3-42dd-8833-1ba325d2b5f2
+	CCodeGenerator VMMaker.oscog-eem.1048 uuid: 8c759c0d-f612-4018-8a05-45ec7f6af78f
  */
 
 
@@ -32,7 +32,7 @@
 sqInt ceCPICMissreceiver(CogMethod *cPIC, sqInt receiver);
 sqInt ceSICMiss(sqInt receiver);
 void checkAssertsEnabledInCogit(void);
-sqInt checkIntegrityOfObjectReferencesInCode(sqInt fullGCFlag);
+sqInt checkIntegrityOfObjectReferencesInCode(sqInt gcModes);
 char * codeEntryFor(char *address);
 char * codeEntryNameFor(char *address);
 sqInt cogCodeBase(void);

Modified: branches/Cog/nscogsrc/vm/cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.c	2015-02-05 00:50:56 UTC (rev 3248)
+++ branches/Cog/nscogsrc/vm/cointerp.c	2015-02-10 23:19:26 UTC (rev 3249)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1044 uuid: e04ad0a1-2b15-4561-a3ed-1a4d4d6d58c8
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1048 uuid: 8c759c0d-f612-4018-8a05-45ec7f6af78f
    from
-	CoInterpreter VMMaker.oscog-eem.1044 uuid: e04ad0a1-2b15-4561-a3ed-1a4d4d6d58c8
+	CoInterpreter VMMaker.oscog-eem.1048 uuid: 8c759c0d-f612-4018-8a05-45ec7f6af78f
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1044 uuid: e04ad0a1-2b15-4561-a3ed-1a4d4d6d58c8 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1048 uuid: 8c759c0d-f612-4018-8a05-45ec7f6af78f " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -212,9 +212,9 @@
 #define FoxMFReceiver -12
 #define FoxSavedFP 0
 #define FoxThisContext -8
-#define GCModeBecome 4
+#define GCModeBecome 8
 #define GCModeFull 1
-#define GCModeIncr 2
+#define GCModeNewSpace 2
 #define GCTopMarker 3
 #define HasBeenReturnedFromMCPC 0xFFFFFFFFUL
 #define HashBits 0x1FFE0000
@@ -421,7 +421,7 @@
 void ceTraceLinkedSend(sqInt theReceiver);
 void ceTraceStoreOfinto(sqInt aValue, sqInt anObject);
 void checkAssertsEnabledInCoInterpreter(void);
-static sqInt checkCodeIntegrity(sqInt fullGCFlag) NoDbgRegParms;
+static sqInt checkCodeIntegrity(sqInt gcModes) NoDbgRegParms;
 static sqInt checkLogIntegrity(void);
 static sqInt checkOkayFields(sqInt oop) NoDbgRegParms;
 static sqInt checkStackIntegrity(void);
@@ -515,7 +515,7 @@
 static void printFrameMethodFor(char *theFP) NoDbgRegParms;
 static void printFrameThingatextraString(char *name, char *address, char *extraStringOrNil) NoDbgRegParms;
 static void printFrameThingatextra(char *name, char *address, sqInt extraValue) NoDbgRegParms;
-void printFrameWithSP(char *theFP, char *theSP);
+sqInt printFrameWithSP(char *theFP, char *theSP);
 static void printLogEntryAt(sqInt i) NoDbgRegParms;
 void printMethodCacheFor(sqInt thing);
 static sqInt printPrimLogEntryAt(sqInt i) NoDbgRegParms;
@@ -836,7 +836,6 @@
 sqInt lastPointerOf(sqInt objOop);
 sqInt leakCheckBecome(void);
 sqInt leakCheckFullGC(void);
-sqInt leakCheckIncrementalGC(void);
 sqInt leakCheckNewSpaceGC(void);
 sqInt literalCountOfMethodHeader(sqInt header);
 static sqInt loadImageSegmentFromoutPointers(sqInt segmentWordArray, sqInt outPointerArray) NoDbgRegParms;
@@ -853,7 +852,7 @@
 void printReferencesTo(sqInt anOop);
 void printWronglySizedContexts(sqInt printContexts);
 static void restoreHeadersFromtofromandtofrom(sqInt firstIn, sqInt lastIn, sqInt hdrBaseIn, sqInt firstOut, sqInt lastOut, sqInt hdrBaseOut) NoDbgRegParms;
-static void runLeakCheckerForFullGC(sqInt fullGCFlag) NoDbgRegParms;
+static void runLeakCheckerFor(sqInt gcModes) NoDbgRegParms;
 static sqInt safeObjectAfter(sqInt oop) NoDbgRegParms;
 static sqInt safePrintStringOf(sqInt oop) NoDbgRegParms;
 static sqInt shortentoIndexableSize(sqInt obj, sqInt nSlots) NoDbgRegParms;
@@ -1351,8 +1350,8 @@
 _iss sqInt remapBufferCount;
 _iss usqInt reserveStart;
 _iss char * stackLimit;
+_iss usqInt memoryLimit;
 _iss sqInt rootTableCount;
-_iss usqInt memoryLimit;
 _iss usqInt scavengeThreshold;
 _iss usqInt endOfMemory;
 _iss unsigned char primTraceLogIndex;
@@ -1370,11 +1369,11 @@
 _iss sqInt profileMethod;
 _iss usqInt compStart;
 _iss sqInt extraRootCount;
+_iss sqInt growHeadroom;
 _iss sqInt statGrowMemory;
 _iss sqInt tempOop2;
 _iss sqInt weakRootCount;
 _iss sqInt classNameIndex;
-_iss sqInt growHeadroom;
 _iss sqInt lastMethodCacheProbeWrite;
 _iss sqInt preemptionYields;
 _iss usqLong nextWakeupUsecs;
@@ -1397,6 +1396,8 @@
 _iss sqInt cogCodeSize;
 _iss usqInt compEnd;
 _iss sqInt externalPrimitiveTableFirstFreeIndex;
+_iss sqInt shrinkThreshold;
+_iss sqInt statShrinkMemory;
 _iss sqInt thisClassIndex;
 _iss sqInt edenBytes;
 _iss usqInt fwdTableLast;
@@ -1404,7 +1405,6 @@
 _iss sqInt noThreadingOfGUIThread;
 _iss sqInt pendingFinalizationSignals;
 _iss sqInt processHasThreadId;
-_iss sqInt shrinkThreshold;
 _iss sqInt statCompMoveCount;
 _iss usqLong statIOProcessEvents;
 _iss sqInt statMkFwdCount;
@@ -1417,7 +1417,6 @@
 _iss usqLong statIncrGCUsecs;
 _iss sqInt statIncrGCs;
 _iss sqInt statRootTableOverflows;
-_iss sqInt statShrinkMemory;
 _iss sqInt statSpecialMarkCount;
 _iss sqInt statTenures;
 _iss sqInt totalObjectCount;
@@ -1502,10 +1501,10 @@
 sqInt checkAllocFiller;
 sqInt breakSelectorLength = MinSmallInteger;
 sqInt inIOProcessEvents;
-sqInt checkForLeaks;
 sqInt desiredEdenBytes;
 sqInt desiredNumStackPages;
 sqInt extraVMMemory;
+sqInt checkForLeaks;
 sqInt desiredCogCodeSize;
 char * breakSelector;
 usqInt heapBase;
@@ -2097,7 +2096,7 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 char expensiveAsserts = 0;
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1044";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1048";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -15316,9 +15315,9 @@
 	code are valid. Answer if all checks pass. */
 
 static sqInt
-checkCodeIntegrity(sqInt fullGCFlag)
+checkCodeIntegrity(sqInt gcModes)
 {
-	return checkIntegrityOfObjectReferencesInCode(fullGCFlag);
+	return checkIntegrityOfObjectReferencesInCode(gcModes);
 }
 
 
@@ -18087,7 +18086,7 @@
 }
 
 
-/*	Shrink free memory and signal the gc semaphore */
+/*	Signal the gc semaphore */
 /*	Attempt to shrink free memory, signal the gc semaphore and let the Cogit
 	do its post GC thang
  */
@@ -18095,34 +18094,7 @@
 static void
 postGCAction(sqInt gcModeArg)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
-    sqInt freeSizeNow;
-    sqInt limit;
-
 	assert(gcModeArg == GIV(gcMode));
-	if ((gcModeArg == GCModeFull)
-	 || (gcModeArg == GCModeIncr)) {
-
-		/* but *not* become and *not* scavenge */
-
-		freeSizeNow = ((((usqInt) GIV(freeStart))) < (((usqInt) GIV(reserveStart)))
-			? (((usqInt) GIV(reserveStart))) - (((usqInt) GIV(freeStart)))
-			: 0);
-		if ((freeSizeNow > GIV(shrinkThreshold))
-		 && (freeSizeNow > GIV(growHeadroom))) {
-
-			/* Attempt to shrink memory after successfully reclaiming lots of memory */
-
-			/* begin shrinkObjectMemory: */
-			GIV(statShrinkMemory) += 1;
-			limit = sqShrinkMemoryBy(GIV(memoryLimit), freeSizeNow - GIV(growHeadroom));
-			if (!(limit == GIV(memoryLimit))) {
-				/* begin setMemoryLimit: */
-				assert(((limit - 24) & (BytesPerWord - 1)) == 0);
-				GIV(memoryLimit) = limit - 24;
-				initializeMemoryFirstFree(GIV(freeStart));
-			}
-		}
-	}
 	signalSemaphoreWithIndex(GIV(gcSemaphoreIndex));
 	cogitPostGCAction(gcModeArg);
 	GIV(lastCoggableInterpretedBlockMethod) = (GIV(lastUncoggableInterpretedBlockMethod) = null);
@@ -18492,7 +18464,7 @@
 	printf("\n");
 }
 
-void
+sqInt
 printFrameWithSP(char *theFP, char *theSP)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     char *addr;
@@ -18514,6 +18486,15 @@
     sqInt topThing;
 
 	
+	if (!((((((usqInt)theFP)) & (BytesPerWord - 1)) == 0)
+		 && ((((((usqInt)theFP)) >= (((usqInt)(GIV(stackBasePlus1) - 1)))) && ((((usqInt)theFP)) <= (((usqInt)GIV(pages)))))))) {
+		/* begin printHexPtr: */
+		printHex(oopForPointer(theFP));
+		print(" is not in the stack zone?!");
+		/* begin cr */
+		printf("\n");
+		return null;
+	}
 	if ((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory())) {
 		/* begin mframeCogMethod: */
 		cogMethod = ((CogBlockMethod *) ((longAt(theFP + FoxMethod)) & MFMethodMask));
@@ -34943,9 +34924,7 @@
     sqInt sp;
     usqInt start;
 
-	if ((checkForLeaks & 4) != 0) {
-		runLeakCheckerForFullGC(1);
-	}
+	runLeakCheckerFor(GCModeBecome);
 	if (!(((array1 & 1) == 0)
 		 && (((((usqInt) (longAt(array1))) >> (instFormatFieldLSB())) & 15) == 2))) {
 		return PrimErrBadReceiver;
@@ -35180,9 +35159,7 @@
 	GIV(lastCoggableInterpretedBlockMethod) = (GIV(lastUncoggableInterpretedBlockMethod) = null);
 	GIV(gcMode) = 0;
 	initializeMemoryFirstFree(GIV(freeStart));
-	if ((checkForLeaks & 4) != 0) {
-		runLeakCheckerForFullGC(1);
-	}
+	runLeakCheckerFor(GCModeBecome);
 	return PrimNoErr;
 }
 
@@ -36567,14 +36544,16 @@
 void
 fullGC(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt freeSizeNow;
     sqInt limit;
+    sqInt limit1;
     sqInt sz;
 
 	if (GIV(fullGCLock) > 0) {
 		warning("aborting fullGC because fullGCLock > 0");
 		return;
 	}
-	runLeakCheckerForFullGC(1);
+	runLeakCheckerFor(GCModeFull);
 	preGCAction(GCModeFull);
 	GIV(needGCFlag) = 0;
 	GIV(gcStartUsecs) = ioUTCMicrosecondsNow();
@@ -36588,7 +36567,7 @@
 	GIV(youngStart) = startOfMemory();
 	markPhase(1);
 	GIV(totalObjectCount) = sweepPhaseForFullGC();
-	runLeakCheckerForFullGC(1);
+	runLeakCheckerFor(GCModeFull);
 	/* begin fullCompaction */
 	assert(GIV(compStart) == (lowestFreeAfter(startOfMemory())));
 	if (GIV(compStart) == GIV(freeStart)) {
@@ -36629,8 +36608,24 @@
 	/* reset the young object boundary */
 
 	GIV(youngStart) = GIV(freeStart);
+	/* begin attemptToShrink */
+	freeSizeNow = ((((usqInt) GIV(freeStart))) < (((usqInt) GIV(reserveStart)))
+		? (((usqInt) GIV(reserveStart))) - (((usqInt) GIV(freeStart)))
+		: 0);
+	if ((freeSizeNow > GIV(shrinkThreshold))
+	 && (freeSizeNow > GIV(growHeadroom))) {
+		/* begin shrinkObjectMemory: */
+		GIV(statShrinkMemory) += 1;
+		limit1 = sqShrinkMemoryBy(GIV(memoryLimit), freeSizeNow - GIV(growHeadroom));
+		if (!(limit1 == GIV(memoryLimit))) {
+			/* begin setMemoryLimit: */
+			assert(((limit1 - 24) & (BytesPerWord - 1)) == 0);
+			GIV(memoryLimit) = limit1 - 24;
+			initializeMemoryFirstFree(GIV(freeStart));
+		}
+	}
 	postGCAction(GCModeFull);
-	runLeakCheckerForFullGC(1);
+	runLeakCheckerFor(GCModeFull);
 }
 
 
@@ -36997,9 +36992,11 @@
 incrementalGC(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt delta;
+    sqInt freeSizeNow;
     sqInt growth;
     sqInt i;
     sqInt limit;
+    sqInt limit1;
     sqInt survivorCount;
     sqInt weDidGrow;
 
@@ -37012,8 +37009,8 @@
 		fullGC();
 		return;
 	}
-	runLeakCheckerForFullGC(0);
-	preGCAction(GCModeIncr);
+	runLeakCheckerFor(GCModeNewSpace);
+	preGCAction(GCModeNewSpace);
 	GIV(needGCFlag) = 0;
 	GIV(gcStartUsecs) = ioUTCMicrosecondsNow();
 	GIV(statSweepCount) = (GIV(statMarkCount) = (GIV(statMkFwdCount) = (GIV(statCompMoveCount) = 0)));
@@ -37025,7 +37022,7 @@
 		finalizeReference(GIV(weakRoots)[i]);
 	}
 	survivorCount = sweepPhase();
-	runLeakCheckerForFullGC(0);
+	runLeakCheckerFor(GCModeNewSpace);
 	/* begin incrementalCompaction */
 	if (GIV(compStart) == GIV(freeStart)) {
 
@@ -37084,8 +37081,24 @@
 		}
 		GIV(youngStart) = GIV(freeStart);
 	}
-	postGCAction(GCModeIncr);
-	runLeakCheckerForFullGC(0);
+	/* begin attemptToShrink */
+	freeSizeNow = ((((usqInt) GIV(freeStart))) < (((usqInt) GIV(reserveStart)))
+		? (((usqInt) GIV(reserveStart))) - (((usqInt) GIV(freeStart)))
+		: 0);
+	if ((freeSizeNow > GIV(shrinkThreshold))
+	 && (freeSizeNow > GIV(growHeadroom))) {
+		/* begin shrinkObjectMemory: */
+		GIV(statShrinkMemory) += 1;
+		limit1 = sqShrinkMemoryBy(GIV(memoryLimit), freeSizeNow - GIV(growHeadroom));
+		if (!(limit1 == GIV(memoryLimit))) {
+			/* begin setMemoryLimit: */
+			assert(((limit1 - 24) & (BytesPerWord - 1)) == 0);
+			GIV(memoryLimit) = limit1 - 24;
+			initializeMemoryFirstFree(GIV(freeStart));
+		}
+	}
+	postGCAction(GCModeNewSpace);
+	runLeakCheckerFor(GCModeNewSpace);
 	if (weDidGrow) {
 		/* begin biasToGrowCheckGCLimit */
 		growth = (GIV(youngStart) - (startOfMemory())) - GIV(gcBiasToGrowThreshold);
@@ -37319,22 +37332,16 @@
 sqInt
 leakCheckBecome(void)
 {
-	return (checkForLeaks & 4) != 0;
+	return (checkForLeaks & GCModeBecome) != 0;
 }
 
 sqInt
 leakCheckFullGC(void)
 {
-	return (checkForLeaks & 1) != 0;
+	return (checkForLeaks & GCModeFull) != 0;
 }
 
 sqInt
-leakCheckIncrementalGC(void)
-{
-	return (checkForLeaks & 2) != 0;
-}
-
-sqInt
 leakCheckNewSpaceGC(void)
 {
 	return (checkForLeaks & 2) != 0;
@@ -38820,12 +38827,10 @@
 }
 
 static void
-runLeakCheckerForFullGC(sqInt fullGCFlag)
+runLeakCheckerFor(sqInt gcModes)
 {
-	if ((fullGCFlag
-		? (checkForLeaks & 1) != 0
-		: (checkForLeaks & 2) != 0)) {
-		if (fullGCFlag) {
+	if (gcModes & checkForLeaks) {
+		if (gcModes & GCModeFull) {
 			reverseDisplayFromto(0, 7);
 		}
 		else {
@@ -38835,7 +38840,7 @@
 		assert(checkHeapIntegrity());
 		assert(checkInterpreterIntegrity());
 		assert(checkStackIntegrity());
-		assert(checkCodeIntegrity(fullGCFlag));
+		assert(checkCodeIntegrity(gcModes));
 		/* begin validate */
 		null;
 	}
@@ -47187,7 +47192,7 @@
     sqInt oop;
 
 	null;
-	runLeakCheckerForFullGC(1);
+	runLeakCheckerFor(GCModeFull);
 	/* begin fetchPointer:ofObject: */
 	/* begin fetchPointer:ofObject: */
 	oop = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SchedulerAssociation << (shiftForWord())))) + BaseHeaderSize) + (ValueIndex << (shiftForWord())));
@@ -49637,12 +49642,23 @@
 printFrame(char *theFP)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     char *aFrame;
+    char *frameAbove;
     sqInt index;
     char *prevFrame;
     char *startFrame;
     StackPage *thePage;
     char *theSP;
 
+	if (!((((((usqInt)theFP)) & (BytesPerWord - 1)) == 0)
+		 && ((((((usqInt)theFP)) >= (((usqInt)(GIV(stackBasePlus1) - 1)))) && ((((usqInt)theFP)) <= (((usqInt)GIV(pages)))))))) {
+		/* begin printHexPtr: */
+		printHex(oopForPointer(theFP));
+		print(" is not in the stack zone?!");
+		/* begin cr */
+		printf("\n");
+		return null;
+	}
+	frameAbove = null;
 	if (theFP == GIV(framePointer)) {
 		theSP = GIV(stackPointer);
 	}
@@ -49666,26 +49682,14 @@
 			theSP = (thePage->headSP);
 		}
 		else {
-			/* begin findSPOrNilOf:on:startingFrom: */
+			/* begin safeFindFrameAbove:on:startingFrom: */
 			startFrame = ((thePage == GIV(stackPage))
 			 && (((GIV(framePointer) >= ((thePage->realStackLimit))) && (GIV(framePointer) <= ((thePage->baseAddress)))))
 				? GIV(framePointer)
 				: (thePage->headFP));
 			assert(!(isFree(thePage)));
 			if (startFrame == theFP) {
-				if (((thePage->headSP)) >= startFrame) {
-
-					/* If the SP is invalid return the pointer to the receiver field. */
-
-					/* begin frameReceiverOffset: */
-					theSP = ((((usqInt)(longAt(aFrame + FoxMethod)))) < (startOfMemory())
-						? aFrame + FoxMFReceiver
-						: aFrame + FoxIFReceiver);
-					goto l1;
-				}
-				theSP = (thePage == GIV(stackPage)
-					? (thePage->headSP)
-					: ((thePage->headSP)) + BytesPerWord);
+				frameAbove = null;
 				goto l1;
 			}
 			aFrame = startFrame;
@@ -49695,16 +49699,19 @@
 				aFrame = pointerForOop(longAt(aFrame + FoxSavedFP));
 				if (!(aFrame != 0)) break;
 				if (theFP == aFrame) {
-					/* begin frameCallerSP: */
-					assert(!(isBaseFrame(prevFrame)));
-					theSP = (prevFrame + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(prevFrame + FoxMethod)))) < (startOfMemory())
-	? ((mframeCogMethod(prevFrame))->cmNumArgs)
-	: byteAt((prevFrame + FoxIFrameFlags) + 1))))) + BytesPerWord;
+					frameAbove = prevFrame;
 					goto l1;
 				}
 			}
-			theSP = null;
-		l1:	/* end findSPOrNilOf:on:startingFrom: */;
+			frameAbove = null;
+		l1:	/* end safeFindFrameAbove:on:startingFrom: */;
+			theSP = (!(frameAbove == null)
+				? (/* begin frameCallerSP: */
+					assert(!(isBaseFrame(frameAbove))),
+					(frameAbove + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(frameAbove + FoxMethod)))) < (startOfMemory())
+	? ((mframeCogMethod(frameAbove))->cmNumArgs)
+	: byteAt((frameAbove + FoxIFrameFlags) + 1))))) + BytesPerWord)
+				: 0);
 		}
 	}
 	if (!(theSP)) {
@@ -49717,6 +49724,9 @@
 			: theFP + FoxIFReceiver);
 	}
 	printFrameWithSP(theFP, theSP);
+	if (!(frameAbove == null)) {
+		printFrameThingat("frame pc", frameAbove + FoxCallerSavedIP);
+	}
 }
 
 
@@ -49757,6 +49767,7 @@
     sqInt i;
     sqInt methodClassAssociation;
     sqInt n;
+    sqInt n1;
     char *name;
     sqInt nameLen;
     sqInt obj;
@@ -49803,14 +49814,14 @@
 						/* begin printChar: */
 						putchar(')');
 
-						goto l8;
+						goto l7;
 					}
 					
 					print("unknown immediate ");
 					/* begin printHexnp: */
 					printf("0x%lx", ((unsigned long) oop2));
 
-					goto l8;
+					goto l7;
 				}
 				if (!(((oop2 & 3) == 0)
 					 && (((((usqInt)oop2)) >= (startOfMemory()))
@@ -49819,16 +49830,16 @@
 					print(((oop2 & (BytesPerWord - 1)) != 0
 						? " is misaligned"
 						: whereIs(oop2)));
-					goto l8;
+					goto l7;
 				}
 				if (((longAt(oop2)) & TypeMask) == HeaderTypeFree) {
 					print(" is a free chunk");
-					goto l8;
+					goto l7;
 				}
 				
 				if (isinstanceOfcompactClassIndex(oop2, longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassFloat << (shiftForWord()))), ClassFloatCompactIndex)) {
 					printFloat(dbgFloatValueOf(oop2));
-					goto l8;
+					goto l7;
 				}
 				classOop = (((ccIndex = (((usqInt) (longAt(oop2))) >> (compactClassFieldLSB())) & 0x1F)) == 0
 					? (longAt(oop2 - BaseHeaderSize)) & AllButTypeMask
@@ -49839,28 +49850,28 @@
 					 && (((((usqInt)classOop)) < GIV(freeStart))
 					 && (((longAt(classOop)) & TypeMask) != HeaderTypeGC))))) {
 					print("a ??");
-					goto l8;
+					goto l7;
 				}
 				if ((numSlotsOf(classOop)) == GIV(metaclassNumSlots)) {
 					printNameOfClasscount(oop2, 5);
-					goto l8;
+					goto l7;
 				}
 				if (oop2 == GIV(nilObj)) {
 					print("nil");
-					goto l8;
+					goto l7;
 				}
 				if (oop2 == GIV(trueObj)) {
 					print("true");
-					goto l8;
+					goto l7;
 				}
 				if (oop2 == GIV(falseObj)) {
 					print("false");
-					goto l8;
+					goto l7;
 				}
 				nameLen = lengthOfNameOfClass(classOop);
 				if (nameLen == 0) {
 					print("a ??");
-					goto l8;
+					goto l7;
 				}
 				name = nameOfClass(classOop);
 				if (nameLen == 10) {
@@ -49874,7 +49885,7 @@
 						/* begin printChar: */
 						putchar('\'');
 
-						goto l8;
+						goto l7;
 					}
 					if ((strncmp(name, "ByteSymbol", 10)) == 0) {
 
@@ -49883,7 +49894,7 @@
 						/* begin printChar: */
 						putchar('#');
 						printStringOf(oop2);
-						goto l8;
+						goto l7;
 					}
 				}
 				if ((nameLen == 9)
@@ -49893,7 +49904,7 @@
 					/* begin printChar: */
 					putchar(((longAt((oop2 + BaseHeaderSize) + (0 << (shiftForWord())))) >> 1));
 
-					goto l8;
+					goto l7;
 				}
 				print("a(n) ");
 				for (i = 0; i < nameLen; i += 1) {
@@ -49911,24 +49922,24 @@
 							longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex1 - 1) << (shiftForWord())))));
 					while (1) {
 						if (classLookupKey == GIV(nilObj)) {
-							goto l8;
+							goto l7;
 						}
 						if ((instanceSizeOf(classLookupKey)) == (KeyIndex + 1)) break;
 						classLookupKey = longAt((classLookupKey + BaseHeaderSize) + (SuperclassIndex << (shiftForWord())));
 					}
 					if (classLookupKey == GIV(nilObj)) {
-						goto l5;
+						goto l6;
 					}
 					theClass1 = classOop;
 					while (1) {
 						if (theClass1 == classLookupKey) {
-							goto l6;
+							goto l8;
 						}
 						if (!(theClass1 != GIV(nilObj))) break;
 						theClass1 = longAt((theClass1 + BaseHeaderSize) + (SuperclassIndex << (shiftForWord())));
 					}
-					goto l5;
-				l6:	;
+					goto l6;
+				l8:	;
 					/* begin space */
 					/* begin printChar: */
 					putchar(' ');
@@ -49936,9 +49947,9 @@
 					print(" -> ");
 					/* begin printHexnp: */
 					printf("0x%lx", ((unsigned long) (longAt((oop2 + BaseHeaderSize) + (ValueIndex << (shiftForWord()))))));
-				l5:	;
+				l6:	;
 				}
-			l8:	/* end printOopShortInner: */;
+			l7:	/* end printOopShortInner: */;
 				/* begin cr */
 				printf("\n");
 			}
@@ -50089,6 +50100,7 @@
     sqInt classOop;
     sqInt i;
     sqInt n;
+    sqInt n1;
     char *name;
     sqInt nameLen;
     sqInt oop1;
@@ -50106,14 +50118,14 @@
 			/* begin printChar: */
 			putchar(')');
 
-			goto l4;
+			goto l5;
 		}
 		
 		print("unknown immediate ");
 		/* begin printHexnp: */
 		printf("0x%lx", ((unsigned long) oop));
 
-		goto l4;
+		goto l5;
 	}
 	if (!(((oop & 3) == 0)
 		 && (((((usqInt)oop)) >= (startOfMemory()))
@@ -50122,16 +50134,16 @@
 		print(((oop & (BytesPerWord - 1)) != 0
 			? " is misaligned"
 			: whereIs(oop)));
-		goto l4;
+		goto l5;
 	}
 	if (((longAt(oop)) & TypeMask) == HeaderTypeFree) {
 		print(" is a free chunk");
-		goto l4;
+		goto l5;
 	}
 	
 	if (isinstanceOfcompactClassIndex(oop, longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassFloat << (shiftForWord()))), ClassFloatCompactIndex)) {
 		printFloat(dbgFloatValueOf(oop));
-		goto l4;
+		goto l5;
 	}
 	classOop = (((ccIndex = (((usqInt) (longAt(oop))) >> (compactClassFieldLSB())) & 0x1F)) == 0
 		? (longAt(oop - BaseHeaderSize)) & AllButTypeMask
@@ -50142,28 +50154,28 @@
 		 && (((((usqInt)classOop)) < GIV(freeStart))
 		 && (((longAt(classOop)) & TypeMask) != HeaderTypeGC))))) {
 		print("a ??");
-		goto l4;
+		goto l5;
 	}
 	if ((numSlotsOf(classOop)) == GIV(metaclassNumSlots)) {
 		printNameOfClasscount(oop, 5);
-		goto l4;
+		goto l5;
 	}
 	if (oop == GIV(nilObj)) {
 		print("nil");
-		goto l4;
+		goto l5;
 	}
 	if (oop == GIV(trueObj)) {
 		print("true");
-		goto l4;
+		goto l5;
 	}
 	if (oop == GIV(falseObj)) {
 		print("false");
-		goto l4;
+		goto l5;
 	}
 	nameLen = lengthOfNameOfClass(classOop);
 	if (nameLen == 0) {
 		print("a ??");
-		goto l4;
+		goto l5;
 	}
 	name = nameOfClass(classOop);
 	if (nameLen == 10) {
@@ -50177,7 +50189,7 @@
 			/* begin printChar: */
 			putchar('\'');
 
-			goto l4;
+			goto l5;
 		}
 		if ((strncmp(name, "ByteSymbol", 10)) == 0) {
 
@@ -50186,7 +50198,7 @@
 			/* begin printChar: */
 			putchar('#');
 			printStringOf(oop);
-			goto l4;
+			goto l5;
 		}
 	}
 	if ((nameLen == 9)
@@ -50196,7 +50208,7 @@
 		/* begin printChar: */
 		putchar(((longAt((oop + BaseHeaderSize) + (0 << (shiftForWord())))) >> 1));
 
-		goto l4;
+		goto l5;
 	}
 	print("a(n) ");
 	for (i = 0; i < nameLen; i += 1) {
@@ -50214,7 +50226,7 @@
 				longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex1 - 1) << (shiftForWord())))));
 		while (1) {
 			if (classLookupKey == GIV(nilObj)) {
-				goto l4;
+				goto l5;
 			}
 			if ((instanceSizeOf(classLookupKey)) == (KeyIndex + 1)) break;
 			classLookupKey = longAt((classLookupKey + BaseHeaderSize) + (SuperclassIndex << (shiftForWord())));
@@ -50241,7 +50253,7 @@
 		printf("0x%lx", ((unsigned long) (longAt((oop + BaseHeaderSize) + (ValueIndex << (shiftForWord()))))));
 	l1:	;
 	}
-l4:	/* end printOopShortInner: */;
+l5:	/* end printOopShortInner: */;
 	flush();
 }
 

Modified: branches/Cog/nscogsrc/vm/cointerp.h
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.h	2015-02-05 00:50:56 UTC (rev 3248)
+++ branches/Cog/nscogsrc/vm/cointerp.h	2015-02-10 23:19:26 UTC (rev 3249)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1044 uuid: e04ad0a1-2b15-4561-a3ed-1a4d4d6d58c8
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1048 uuid: 8c759c0d-f612-4018-8a05-45ec7f6af78f
  */
 
 
@@ -90,7 +90,7 @@
 void * primTraceLogAddress(void);
 usqInt primTraceLogIndexAddress(void);
 void printCogMethod(CogMethod *cogMethod);
-void printFrameWithSP(char *theFP, char *theSP);
+sqInt printFrameWithSP(char *theFP, char *theSP);
 void printMethodCacheFor(sqInt thing);
 sqInt quickPrimitiveConstantFor(sqInt aQuickPrimitiveIndex);
 int (*quickPrimitiveGeneratorFor(sqInt aQuickPrimitiveIndex))(void) ;
@@ -136,7 +136,6 @@
 sqInt lastPointerOf(sqInt objOop);
 sqInt leakCheckBecome(void);
 sqInt leakCheckFullGC(void);
-sqInt leakCheckIncrementalGC(void);
 sqInt leakCheckNewSpaceGC(void);
 sqInt literalCountOfMethodHeader(sqInt header);
 void longPrintReferencesTo(sqInt anOop);

Modified: branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2015-02-05 00:50:56 UTC (rev 3248)
+++ branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2015-02-10 23:19:26 UTC (rev 3249)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1044 uuid: e04ad0a1-2b15-4561-a3ed-1a4d4d6d58c8
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1048 uuid: 8c759c0d-f612-4018-8a05-45ec7f6af78f
    from
-	CoInterpreter VMMaker.oscog-eem.1044 uuid: e04ad0a1-2b15-4561-a3ed-1a4d4d6d58c8
+	CoInterpreter VMMaker.oscog-eem.1048 uuid: 8c759c0d-f612-4018-8a05-45ec7f6af78f
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1044 uuid: e04ad0a1-2b15-4561-a3ed-1a4d4d6d58c8 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1048 uuid: 8c759c0d-f612-4018-8a05-45ec7f6af78f " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -215,9 +215,9 @@
 #define FoxMFReceiver -12
 #define FoxSavedFP 0
 #define FoxThisContext -8
-#define GCModeBecome 4
+#define GCModeBecome 8
 #define GCModeFull 1
-#define GCModeIncr 2
+#define GCModeNewSpace 2
 #define GCTopMarker 3
 #define HasBeenReturnedFromMCPC 0xFFFFFFFFUL
 #define HashBits 0x1FFE0000
@@ -424,7 +424,7 @@
 void ceTraceLinkedSend(sqInt theReceiver);
 void ceTraceStoreOfinto(sqInt aValue, sqInt anObject);
 void checkAssertsEnabledInCoInterpreter(void);
-static sqInt checkCodeIntegrity(sqInt fullGCFlag) NoDbgRegParms;
+static sqInt checkCodeIntegrity(sqInt gcModes) NoDbgRegParms;
 static sqInt checkLogIntegrity(void);
 static sqInt checkOkayFields(sqInt oop) NoDbgRegParms;
 static sqInt checkStackIntegrity(void);
@@ -518,7 +518,7 @@
 static void printFrameMethodFor(char *theFP) NoDbgRegParms;
 static void printFrameThingatextraString(char *name, char *address, char *extraStringOrNil) NoDbgRegParms;
 static void printFrameThingatextra(char *name, char *address, sqInt extraValue) NoDbgRegParms;
-void printFrameWithSP(char *theFP, char *theSP);
+sqInt printFrameWithSP(char *theFP, char *theSP);
 static void printLogEntryAt(sqInt i) NoDbgRegParms;
 void printMethodCacheFor(sqInt thing);
 static sqInt printPrimLogEntryAt(sqInt i) NoDbgRegParms;
@@ -839,7 +839,6 @@
 sqInt lastPointerOf(sqInt objOop);
 sqInt leakCheckBecome(void);
 sqInt leakCheckFullGC(void);
-sqInt leakCheckIncrementalGC(void);
 sqInt leakCheckNewSpaceGC(void);
 sqInt literalCountOfMethodHeader(sqInt header);
 static sqInt loadImageSegmentFromoutPointers(sqInt segmentWordArray, sqInt outPointerArray) NoDbgRegParms;
@@ -856,7 +855,7 @@
 void printReferencesTo(sqInt anOop);
 void printWronglySizedContexts(sqInt printContexts);
 static void restoreHeadersFromtofromandtofrom(sqInt firstIn, sqInt lastIn, sqInt hdrBaseIn, sqInt firstOut, sqInt lastOut, sqInt hdrBaseOut) NoDbgRegParms;
-static void runLeakCheckerForFullGC(sqInt fullGCFlag) NoDbgRegParms;
+static void runLeakCheckerFor(sqInt gcModes) NoDbgRegParms;
 static sqInt safeObjectAfter(sqInt oop) NoDbgRegParms;
 static sqInt safePrintStringOf(sqInt oop) NoDbgRegParms;
 static sqInt shortentoIndexableSize(sqInt obj, sqInt nSlots) NoDbgRegParms;
@@ -1354,8 +1353,8 @@
 _iss sqInt remapBufferCount;
 _iss usqInt reserveStart;
 _iss char * stackLimit;
+_iss usqInt memoryLimit;
 _iss sqInt rootTableCount;
-_iss usqInt memoryLimit;
 _iss usqInt scavengeThreshold;
 _iss usqInt endOfMemory;
 _iss unsigned char primTraceLogIndex;
@@ -1373,11 +1372,11 @@
 _iss sqInt profileMethod;
 _iss usqInt compStart;
 _iss sqInt extraRootCount;
+_iss sqInt growHeadroom;
 _iss sqInt statGrowMemory;
 _iss sqInt tempOop2;
 _iss sqInt weakRootCount;
 _iss sqInt classNameIndex;
-_iss sqInt growHeadroom;
 _iss sqInt lastMethodCacheProbeWrite;
 _iss sqInt preemptionYields;
 _iss usqLong nextWakeupUsecs;
@@ -1400,6 +1399,8 @@
 _iss sqInt cogCodeSize;
 _iss usqInt compEnd;
 _iss sqInt externalPrimitiveTableFirstFreeIndex;
+_iss sqInt shrinkThreshold;
+_iss sqInt statShrinkMemory;
 _iss sqInt thisClassIndex;
 _iss sqInt edenBytes;
 _iss usqInt fwdTableLast;
@@ -1407,7 +1408,6 @@
 _iss sqInt noThreadingOfGUIThread;
 _iss sqInt pendingFinalizationSignals;
 _iss sqInt processHasThreadId;
-_iss sqInt shrinkThreshold;
 _iss sqInt statCompMoveCount;
 _iss usqLong statIOProcessEvents;
 _iss sqInt statMkFwdCount;
@@ -1420,7 +1420,6 @@
 _iss usqLong statIncrGCUsecs;
 _iss sqInt statIncrGCs;
 _iss sqInt statRootTableOverflows;
-_iss sqInt statShrinkMemory;
 _iss sqInt statSpecialMarkCount;
 _iss sqInt statTenures;
 _iss sqInt totalObjectCount;
@@ -1505,10 +1504,10 @@
 sqInt checkAllocFiller;
 sqInt breakSelectorLength = MinSmallInteger;
 sqInt inIOProcessEvents;
-sqInt checkForLeaks;
 sqInt desiredEdenBytes;
 sqInt desiredNumStackPages;
 sqInt extraVMMemory;
+sqInt checkForLeaks;
 sqInt desiredCogCodeSize;
 char * breakSelector;
 usqInt heapBase;
@@ -2100,7 +2099,7 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 char expensiveAsserts = 0;
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1044";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1048";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -15325,9 +15324,9 @@
 	code are valid. Answer if all checks pass. */
 
 static sqInt
-checkCodeIntegrity(sqInt fullGCFlag)
+checkCodeIntegrity(sqInt gcModes)
 {
-	return checkIntegrityOfObjectReferencesInCode(fullGCFlag);
+	return checkIntegrityOfObjectReferencesInCode(gcModes);
 }
 
 
@@ -18096,7 +18095,7 @@
 }
 
 
-/*	Shrink free memory and signal the gc semaphore */
+/*	Signal the gc semaphore */
 /*	Attempt to shrink free memory, signal the gc semaphore and let the Cogit
 	do its post GC thang
  */
@@ -18104,34 +18103,7 @@
 static void
 postGCAction(sqInt gcModeArg)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
-    sqInt freeSizeNow;
-    sqInt limit;
-
 	assert(gcModeArg == GIV(gcMode));
-	if ((gcModeArg == GCModeFull)
-	 || (gcModeArg == GCModeIncr)) {
-
-		/* but *not* become and *not* scavenge */
-
-		freeSizeNow = ((((usqInt) GIV(freeStart))) < (((usqInt) GIV(reserveStart)))
-			? (((usqInt) GIV(reserveStart))) - (((usqInt) GIV(freeStart)))
-			: 0);
-		if ((freeSizeNow > GIV(shrinkThreshold))
-		 && (freeSizeNow > GIV(growHeadroom))) {
-
-			/* Attempt to shrink memory after successfully reclaiming lots of memory */
-
-			/* begin shrinkObjectMemory: */
-			GIV(statShrinkMemory) += 1;
-			limit = sqShrinkMemoryBy(GIV(memoryLimit), freeSizeNow - GIV(growHeadroom));
-			if (!(limit == GIV(memoryLimit))) {
-				/* begin setMemoryLimit: */
-				assert(((limit - 24) & (BytesPerWord - 1)) == 0);
-				GIV(memoryLimit) = limit - 24;
-				initializeMemoryFirstFree(GIV(freeStart));
-			}
-		}
-	}
 	signalSemaphoreWithIndex(GIV(gcSemaphoreIndex));
 	cogitPostGCAction(gcModeArg);
 	GIV(lastCoggableInterpretedBlockMethod) = (GIV(lastUncoggableInterpretedBlockMethod) = null);
@@ -18501,7 +18473,7 @@
 	printf("\n");
 }
 
-void
+sqInt
 printFrameWithSP(char *theFP, char *theSP)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     char *addr;
@@ -18523,6 +18495,15 @@
     sqInt topThing;
 
 	
+	if (!((((((usqInt)theFP)) & (BytesPerWord - 1)) == 0)
+		 && ((((((usqInt)theFP)) >= (((usqInt)(GIV(stackBasePlus1) - 1)))) && ((((usqInt)theFP)) <= (((usqInt)GIV(pages)))))))) {
+		/* begin printHexPtr: */
+		printHex(oopForPointer(theFP));
+		print(" is not in the stack zone?!");
+		/* begin cr */
+		printf("\n");
+		return null;
+	}
 	if ((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory())) {
 		/* begin mframeCogMethod: */
 		cogMethod = ((CogBlockMethod *) ((longAt(theFP + FoxMethod)) & MFMethodMask));
@@ -34952,9 +34933,7 @@
     sqInt sp;
     usqInt start;
 
-	if ((checkForLeaks & 4) != 0) {
-		runLeakCheckerForFullGC(1);
-	}
+	runLeakCheckerFor(GCModeBecome);
 	if (!(((array1 & 1) == 0)
 		 && (((((usqInt) (longAt(array1))) >> (instFormatFieldLSB())) & 15) == 2))) {
 		return PrimErrBadReceiver;
@@ -35189,9 +35168,7 @@
 	GIV(lastCoggableInterpretedBlockMethod) = (GIV(lastUncoggableInterpretedBlockMethod) = null);
 	GIV(gcMode) = 0;
 	initializeMemoryFirstFree(GIV(freeStart));
-	if ((checkForLeaks & 4) != 0) {
-		runLeakCheckerForFullGC(1);
-	}
+	runLeakCheckerFor(GCModeBecome);
 	return PrimNoErr;
 }
 
@@ -36576,14 +36553,16 @@
 void
 fullGC(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt freeSizeNow;
     sqInt limit;
+    sqInt limit1;
     sqInt sz;
 
 	if (GIV(fullGCLock) > 0) {
 		warning("aborting fullGC because fullGCLock > 0");
 		return;
 	}
-	runLeakCheckerForFullGC(1);
+	runLeakCheckerFor(GCModeFull);
 	preGCAction(GCModeFull);
 	GIV(needGCFlag) = 0;
 	GIV(gcStartUsecs) = ioUTCMicrosecondsNow();
@@ -36597,7 +36576,7 @@
 	GIV(youngStart) = startOfMemory();
 	markPhase(1);
 	GIV(totalObjectCount) = sweepPhaseForFullGC();
-	runLeakCheckerForFullGC(1);
+	runLeakCheckerFor(GCModeFull);
 	/* begin fullCompaction */
 	assert(GIV(compStart) == (lowestFreeAfter(startOfMemory())));
 	if (GIV(compStart) == GIV(freeStart)) {
@@ -36638,8 +36617,24 @@
 	/* reset the young object boundary */
 
 	GIV(youngStart) = GIV(freeStart);
+	/* begin attemptToShrink */
+	freeSizeNow = ((((usqInt) GIV(freeStart))) < (((usqInt) GIV(reserveStart)))
+		? (((usqInt) GIV(reserveStart))) - (((usqInt) GIV(freeStart)))
+		: 0);
+	if ((freeSizeNow > GIV(shrinkThreshold))
+	 && (freeSizeNow > GIV(growHeadroom))) {
+		/* begin shrinkObjectMemory: */
+		GIV(statShrinkMemory) += 1;
+		limit1 = sqShrinkMemoryBy(GIV(memoryLimit), freeSizeNow - GIV(growHeadroom));
+		if (!(limit1 == GIV(memoryLimit))) {
+			/* begin setMemoryLimit: */
+			assert(((limit1 - 24) & (BytesPerWord - 1)) == 0);
+			GIV(memoryLimit) = limit1 - 24;
+			initializeMemoryFirstFree(GIV(freeStart));
+		}
+	}
 	postGCAction(GCModeFull);
-	runLeakCheckerForFullGC(1);
+	runLeakCheckerFor(GCModeFull);
 }
 
 
@@ -37006,9 +37001,11 @@
 incrementalGC(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt delta;
+    sqInt freeSizeNow;
     sqInt growth;
     sqInt i;
     sqInt limit;
+    sqInt limit1;
     sqInt survivorCount;
     sqInt weDidGrow;
 
@@ -37021,8 +37018,8 @@
 		fullGC();
 		return;
 	}
-	runLeakCheckerForFullGC(0);
-	preGCAction(GCModeIncr);
+	runLeakCheckerFor(GCModeNewSpace);
+	preGCAction(GCModeNewSpace);
 	GIV(needGCFlag) = 0;
 	GIV(gcStartUsecs) = ioUTCMicrosecondsNow();
 	GIV(statSweepCount) = (GIV(statMarkCount) = (GIV(statMkFwdCount) = (GIV(statCompMoveCount) = 0)));
@@ -37034,7 +37031,7 @@
 		finalizeReference(GIV(weakRoots)[i]);
 	}
 	survivorCount = sweepPhase();
-	runLeakCheckerForFullGC(0);
+	runLeakCheckerFor(GCModeNewSpace);
 	/* begin incrementalCompaction */
 	if (GIV(compStart) == GIV(freeStart)) {
 
@@ -37093,8 +37090,24 @@
 		}
 		GIV(youngStart) = GIV(freeStart);
 	}
-	postGCAction(GCModeIncr);
-	runLeakCheckerForFullGC(0);
+	/* begin attemptToShrink */
+	freeSizeNow = ((((usqInt) GIV(freeStart))) < (((usqInt) GIV(reserveStart)))
+		? (((usqInt) GIV(reserveStart))) - (((usqInt) GIV(freeStart)))
+		: 0);
+	if ((freeSizeNow > GIV(shrinkThreshold))
+	 && (freeSizeNow > GIV(growHeadroom))) {
+		/* begin shrinkObjectMemory: */
+		GIV(statShrinkMemory) += 1;
+		limit1 = sqShrinkMemoryBy(GIV(memoryLimit), freeSizeNow - GIV(growHeadroom));
+		if (!(limit1 == GIV(memoryLimit))) {
+			/* begin setMemoryLimit: */
+			assert(((limit1 - 24) & (BytesPerWord - 1)) == 0);
+			GIV(memoryLimit) = limit1 - 24;
+			initializeMemoryFirstFree(GIV(freeStart));
+		}
+	}
+	postGCAction(GCModeNewSpace);
+	runLeakCheckerFor(GCModeNewSpace);
 	if (weDidGrow) {
 		/* begin biasToGrowCheckGCLimit */
 		growth = (GIV(youngStart) - (startOfMemory())) - GIV(gcBiasToGrowThreshold);
@@ -37328,22 +37341,16 @@
 sqInt
 leakCheckBecome(void)
 {
-	return (checkForLeaks & 4) != 0;
+	return (checkForLeaks & GCModeBecome) != 0;
 }
 
 sqInt
 leakCheckFullGC(void)
 {
-	return (checkForLeaks & 1) != 0;
+	return (checkForLeaks & GCModeFull) != 0;
 }
 
 sqInt
-leakCheckIncrementalGC(void)
-{
-	return (checkForLeaks & 2) != 0;
-}
-
-sqInt
 leakCheckNewSpaceGC(void)
 {
 	return (checkForLeaks & 2) != 0;
@@ -38829,12 +38836,10 @@
 }
 
 static void
-runLeakCheckerForFullGC(sqInt fullGCFlag)
+runLeakCheckerFor(sqInt gcModes)
 {
-	if ((fullGCFlag
-		? (checkForLeaks & 1) != 0
-		: (checkForLeaks & 2) != 0)) {
-		if (fullGCFlag) {
+	if (gcModes & checkForLeaks) {
+		if (gcModes & GCModeFull) {
 			reverseDisplayFromto(0, 7);
 		}
 		else {
@@ -38844,7 +38849,7 @@
 		assert(checkHeapIntegrity());
 		assert(checkInterpreterIntegrity());
 		assert(checkStackIntegrity());
-		assert(checkCodeIntegrity(fullGCFlag));
+		assert(checkCodeIntegrity(gcModes));
 		/* begin validate */
 		null;
 	}
@@ -47196,7 +47201,7 @@
     sqInt oop;
 
 	null;
-	runLeakCheckerForFullGC(1);
+	runLeakCheckerFor(GCModeFull);
 	/* begin fetchPointer:ofObject: */
 	/* begin fetchPointer:ofObject: */
 	oop = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SchedulerAssociation << (shiftForWord())))) + BaseHeaderSize) + (ValueIndex << (shiftForWord())));
@@ -49646,12 +49651,23 @@
 printFrame(char *theFP)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     char *aFrame;
+    char *frameAbove;
     sqInt index;
     char *prevFrame;
     char *startFrame;
     StackPage *thePage;
     char *theSP;
 
+	if (!((((((usqInt)theFP)) & (BytesPerWord - 1)) == 0)
+		 && ((((((usqInt)theFP)) >= (((usqInt)(GIV(stackBasePlus1) - 1)))) && ((((usqInt)theFP)) <= (((usqInt)GIV(pages)))))))) {
+		/* begin printHexPtr: */
+		printHex(oopForPointer(theFP));
+		print(" is not in the stack zone?!");
+		/* begin cr */
+		printf("\n");
+		return null;
+	}
+	frameAbove = null;
 	if (theFP == GIV(framePointer)) {
 		theSP = GIV(stackPointer);
 	}
@@ -49675,26 +49691,14 @@
 			theSP = (thePage->headSP);
 		}
 		else {
-			/* begin findSPOrNilOf:on:startingFrom: */
+			/* begin safeFindFrameAbove:on:startingFrom: */
 			startFrame = ((thePage == GIV(stackPage))
 			 && (((GIV(framePointer) >= ((thePage->realStackLimit))) && (GIV(framePointer) <= ((thePage->baseAddress)))))
 				? GIV(framePointer)
 				: (thePage->headFP));
 			assert(!(isFree(thePage)));
 			if (startFrame == theFP) {
-				if (((thePage->headSP)) >= startFrame) {
-
-					/* If the SP is invalid return the pointer to the receiver field. */
-
-					/* begin frameReceiverOffset: */
-					theSP = ((((usqInt)(longAt(aFrame + FoxMethod)))) < (startOfMemory())
-						? aFrame + FoxMFReceiver
-						: aFrame + FoxIFReceiver);
-					goto l1;
-				}
-				theSP = (thePage == GIV(stackPage)
-					? (thePage->headSP)
-					: ((thePage->headSP)) + BytesPerWord);
+				frameAbove = null;
 				goto l1;
 			}
 			aFrame = startFrame;
@@ -49704,16 +49708,19 @@
 				aFrame = pointerForOop(longAt(aFrame + FoxSavedFP));
 				if (!(aFrame != 0)) break;
 				if (theFP == aFrame) {
-					/* begin frameCallerSP: */
-					assert(!(isBaseFrame(prevFrame)));
-					theSP = (prevFrame + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(prevFrame + FoxMethod)))) < (startOfMemory())
-	? ((mframeCogMethod(prevFrame))->cmNumArgs)
-	: byteAt((prevFrame + FoxIFrameFlags) + 1))))) + BytesPerWord;
+					frameAbove = prevFrame;
 					goto l1;
 				}
 			}
-			theSP = null;
-		l1:	/* end findSPOrNilOf:on:startingFrom: */;
+			frameAbove = null;
+		l1:	/* end safeFindFrameAbove:on:startingFrom: */;
+			theSP = (!(frameAbove == null)
+				? (/* begin frameCallerSP: */
+					assert(!(isBaseFrame(frameAbove))),
+					(frameAbove + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(frameAbove + FoxMethod)))) < (startOfMemory())
+	? ((mframeCogMethod(frameAbove))->cmNumArgs)
+	: byteAt((frameAbove + FoxIFrameFlags) + 1))))) + BytesPerWord)
+				: 0);
 		}
 	}
 	if (!(theSP)) {
@@ -49726,6 +49733,9 @@
 			: theFP + FoxIFReceiver);
 	}
 	printFrameWithSP(theFP, theSP);
+	if (!(frameAbove == null)) {
+		printFrameThingat("frame pc", frameAbove + FoxCallerSavedIP);
+	}
 }
 
 
@@ -49766,6 +49776,7 @@
     sqInt i;
     sqInt methodClassAssociation;
     sqInt n;
+    sqInt n1;
     char *name;
     sqInt nameLen;
     sqInt obj;
@@ -49812,14 +49823,14 @@
 						/* begin printChar: */
 						putchar(')');
 
-						goto l8;
+						goto l7;
 					}
 					
 					print("unknown immediate ");
 					/* begin printHexnp: */
 					printf("0x%lx", ((unsigned long) oop2));
 
-					goto l8;
+					goto l7;
 				}
 				if (!(((oop2 & 3) == 0)
 					 && (((((usqInt)oop2)) >= (startOfMemory()))
@@ -49828,16 +49839,16 @@
 					print(((oop2 & (BytesPerWord - 1)) != 0
 						? " is misaligned"
 						: whereIs(oop2)));
-					goto l8;
+					goto l7;
 				}
 				if (((longAt(oop2)) & TypeMask) == HeaderTypeFree) {
 					print(" is a free chunk");
-					goto l8;
+					goto l7;
 				}
 				
 				if (isinstanceOfcompactClassIndex(oop2, longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassFloat << (shiftForWord()))), ClassFloatCompactIndex)) {
 					printFloat(dbgFloatValueOf(oop2));
-					goto l8;
+					goto l7;
 				}
 				classOop = (((ccIndex = (((usqInt) (longAt(oop2))) >> (compactClassFieldLSB())) & 0x1F)) == 0
 					? (longAt(oop2 - BaseHeaderSize)) & AllButTypeMask
@@ -49848,28 +49859,28 @@
 					 && (((((usqInt)classOop)) < GIV(freeStart))
 					 && (((longAt(classOop)) & TypeMask) != HeaderTypeGC))))) {
 					print("a ??");
-					goto l8;
+					goto l7;
 				}
 				if ((numSlotsOf(classOop)) == GIV(metaclassNumSlots)) {
 					printNameOfClasscount(oop2, 5);
-					goto l8;
+					goto l7;
 				}
 				if (oop2 == GIV(nilObj)) {
 					print("nil");
-					goto l8;
+					goto l7;
 				}
 				if (oop2 == GIV(trueObj)) {
 					print("true");
-					goto l8;
+					goto l7;
 				}
 				if (oop2 == GIV(falseObj)) {
 					print("false");
-					goto l8;
+					goto l7;
 				}
 				nameLen = lengthOfNameOfClass(classOop);
 				if (nameLen == 0) {
 					print("a ??");
-					goto l8;
+					goto l7;
 				}
 				name = nameOfClass(classOop);
 				if (nameLen == 10) {
@@ -49883,7 +49894,7 @@
 						/* begin printChar: */
 						putchar('\'');
 
-						goto l8;
+						goto l7;
 					}
 					if ((strncmp(name, "ByteSymbol", 10)) == 0) {
 
@@ -49892,7 +49903,7 @@
 						/* begin printChar: */
 						putchar('#');
 						printStringOf(oop2);
-						goto l8;
+						goto l7;
 					}
 				}
 				if ((nameLen == 9)
@@ -49902,7 +49913,7 @@
 					/* begin printChar: */
 					putchar(((longAt((oop2 + BaseHeaderSize) + (0 << (shiftForWord())))) >> 1));
 
-					goto l8;
+					goto l7;
 				}
 				print("a(n) ");
 				for (i = 0; i < nameLen; i += 1) {
@@ -49920,24 +49931,24 @@
 							longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex1 - 1) << (shiftForWord())))));
 					while (1) {
 						if (classLookupKey == GIV(nilObj)) {
-							goto l8;
+							goto l7;
 						}
 						if ((instanceSizeOf(classLookupKey)) == (KeyIndex + 1)) break;
 						classLookupKey = longAt((classLookupKey + BaseHeaderSize) + (SuperclassIndex << (shiftForWord())));
 					}
 					if (classLookupKey == GIV(nilObj)) {
-						goto l5;
+						goto l6;
 					}
 					theClass1 = classOop;
 					while (1) {
 						if (theClass1 == classLookupKey) {
-							goto l6;
+							goto l8;
 						}
 						if (!(theClass1 != GIV(nilObj))) break;
 						theClass1 = longAt((theClass1 + BaseHeaderSize) + (SuperclassIndex << (shiftForWord())));
 					}
-					goto l5;
-				l6:	;
+					goto l6;
+				l8:	;
 					/* begin space */
 					/* begin printChar: */
 					putchar(' ');
@@ -49945,9 +49956,9 @@
 					print(" -> ");
 					/* begin printHexnp: */
 					printf("0x%lx", ((unsigned long) (longAt((oop2 + BaseHeaderSize) + (ValueIndex << (shiftForWord()))))));
-				l5:	;
+				l6:	;
 				}
-			l8:	/* end printOopShortInner: */;
+			l7:	/* end printOopShortInner: */;
 				/* begin cr */
 				printf("\n");
 			}
@@ -50098,6 +50109,7 @@
     sqInt classOop;
     sqInt i;
     sqInt n;
+    sqInt n1;
     char *name;
     sqInt nameLen;
     sqInt oop1;
@@ -50115,14 +50127,14 @@
 			/* begin printChar: */
 			putchar(')');
 
-			goto l4;
+			goto l5;
 		}
 		
 		print("unknown immediate ");
 		/* begin printHexnp: */
 		printf("0x%lx", ((unsigned long) oop));
 
-		goto l4;
+		goto l5;
 	}
 	if (!(((oop & 3) == 0)
 		 && (((((usqInt)oop)) >= (startOfMemory()))
@@ -50131,16 +50143,16 @@
 		print(((oop & (BytesPerWord - 1)) != 0
 			? " is misaligned"
 			: whereIs(oop)));
-		goto l4;
+		goto l5;
 	}
 	if (((longAt(oop)) & TypeMask) == HeaderTypeFree) {
 		print(" is a free chunk");
-		goto l4;
+		goto l5;
 	}
 	
 	if (isinstanceOfcompactClassIndex(oop, longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassFloat << (shiftForWord()))), ClassFloatCompactIndex)) {
 		printFloat(dbgFloatValueOf(oop));
-		goto l4;
+		goto l5;
 	}
 	classOop = (((ccIndex = (((usqInt) (longAt(oop))) >> (compactClassFieldLSB())) & 0x1F)) == 0
 		? (longAt(oop - BaseHeaderSize)) & AllButTypeMask
@@ -50151,28 +50163,28 @@
 		 && (((((usqInt)classOop)) < GIV(freeStart))
 		 && (((longAt(classOop)) & TypeMask) != HeaderTypeGC))))) {
 		print("a ??");
-		goto l4;
+		goto l5;
 	}
 	if ((numSlotsOf(classOop)) == GIV(metaclassNumSlots)) {
 		printNameOfClasscount(oop, 5);
-		goto l4;
+		goto l5;
 	}
 	if (oop == GIV(nilObj)) {
 		print("nil");
-		goto l4;
+		goto l5;
 	}
 	if (oop == GIV(trueObj)) {
 		print("true");
-		goto l4;
+		goto l5;
 	}
 	if (oop == GIV(falseObj)) {
 		print("false");
-		goto l4;
+		goto l5;
 	}
 	nameLen = lengthOfNameOfClass(classOop);
 	if (nameLen == 0) {
 		print("a ??");
-		goto l4;
+		goto l5;
 	}
 	name = nameOfClass(classOop);
 	if (nameLen == 10) {
@@ -50186,7 +50198,7 @@
 			/* begin printChar: */
 			putchar('\'');
 
-			goto l4;
+			goto l5;
 		}

@@ Diff output truncated at 50000 characters. @@


More information about the Vm-dev mailing list