[Vm-dev] [commit][2918] CogVM source as per VMMaker.oscog-eem.712

commits at squeakvm.org commits at squeakvm.org
Sat May 10 14:57:29 UTC 2014


Revision: 2918
Author:   eliot
Date:     2014-05-10 07:57:27 -0700 (Sat, 10 May 2014)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.712

Spur:
Revise pigCompact to maintain the doubly-linked free list after
sweepToCoallesceFreeSpaceForPigCompactFrom:.  This means pigCompact can now be
repeated.  Repeat pigCompact 3 times, which appears to compact well.
This needs lots of profiling!!

Move running of leak checker (which computes the leak map) to markObjects from
clients and hence cure assert failures during GC in the Cogit.

Revise unmarking and mapping during eliminateAndFreeForwardersForPigCompact.
Instead of a scavenge merely mapInterpreterOops and explicitly (via added)
unmarkSurvivingObjectsForPigCompact.

Fix slip in fUOASACFSFPC.

Fix remapObj: to not copyAndForward: unless a scavenge is in progress.

Fix the assert fail on pigCompact.  Since pastSpace is not
voided, pastSpace must be swept to follow forwarders.

Refactor mapMachineCode to mapMachineCode: theGCMode and hence call
mapMachineCode: GCModeFull in eliminateAndFreeForwardersFor[Fit|Pig]Compact.

With these changes the Newspeak bootstrap completes on the NS Spur Cog VM.

General:
Rename checkValidObjectReference: et al to checkValidOopReference: et al (since
that's what they check) and add checkValidObjectReference: to check just that.

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/nsspursrc/vm/cogit.c
    branches/Cog/nsspursrc/vm/cogit.h
    branches/Cog/nsspursrc/vm/cogmethod.h
    branches/Cog/nsspursrc/vm/cointerp.c
    branches/Cog/nsspursrc/vm/cointerp.h
    branches/Cog/nsspursrc/vm/gcc3x-cointerp.c
    branches/Cog/nsspursrc/vm/interp.h
    branches/Cog/nsspursrc/vm/vmCallback.h
    branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c
    branches/Cog/nsspurstacksrc/vm/interp.c
    branches/Cog/nsspurstacksrc/vm/interp.h
    branches/Cog/nsspurstacksrc/vm/vmCallback.h
    branches/Cog/sistasrc/vm/cogit.c
    branches/Cog/sistasrc/vm/cogit.h
    branches/Cog/sistasrc/vm/cogmethod.h
    branches/Cog/sistasrc/vm/cointerp.c
    branches/Cog/sistasrc/vm/cointerp.h
    branches/Cog/sistasrc/vm/gcc3x-cointerp.c
    branches/Cog/sistasrc/vm/interp.h
    branches/Cog/sistasrc/vm/vmCallback.h
    branches/Cog/spursistasrc/vm/cogit.c
    branches/Cog/spursistasrc/vm/cogit.h
    branches/Cog/spursistasrc/vm/cogmethod.h
    branches/Cog/spursistasrc/vm/cointerp.c
    branches/Cog/spursistasrc/vm/cointerp.h
    branches/Cog/spursistasrc/vm/gcc3x-cointerp.c
    branches/Cog/spursistasrc/vm/interp.h
    branches/Cog/spursistasrc/vm/vmCallback.h
    branches/Cog/spursrc/vm/cogit.c
    branches/Cog/spursrc/vm/cogit.h
    branches/Cog/spursrc/vm/cogmethod.h
    branches/Cog/spursrc/vm/cointerp.c
    branches/Cog/spursrc/vm/cointerp.h
    branches/Cog/spursrc/vm/gcc3x-cointerp.c
    branches/Cog/spursrc/vm/interp.h
    branches/Cog/spursrc/vm/vmCallback.h
    branches/Cog/spurstacksrc/vm/gcc3x-interp.c
    branches/Cog/spurstacksrc/vm/interp.c
    branches/Cog/spurstacksrc/vm/interp.h
    branches/Cog/spurstacksrc/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
    branches/Cog/stacksrc/vm/gcc3x-interp.c
    branches/Cog/stacksrc/vm/interp.c
    branches/Cog/stacksrc/vm/interp.h
    branches/Cog/stacksrc/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	2014-05-07 04:38:16 UTC (rev 2917)
+++ branches/Cog/nscogsrc/vm/cogit.c	2014-05-10 14:57:27 UTC (rev 2918)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701
+	CCodeGenerator VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701
+	StackToRegisterMappingCogit VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701 " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -406,14 +406,15 @@
 static sqInt ceImplicitReceiverForreceiverclass(sqInt selector, sqInt receiver, sqInt rcvrClass);
 sqInt ceSICMiss(sqInt receiver);
 void checkAssertsEnabledInCogit(void);
-static sqInt checkIfValidObjectRefAndTargetpccogMethod(sqInt annotation, char *mcpc, sqInt cogMethod);
-static sqInt checkIfValidObjectRefpccogMethod(sqInt annotation, char *mcpc, sqInt cogMethod);
+static sqInt checkIfValidOopRefAndTargetpccogMethod(sqInt annotation, char *mcpc, sqInt cogMethod);
+static sqInt checkIfValidOopRefpccogMethod(sqInt annotation, char *mcpc, sqInt cogMethod);
 sqInt checkIntegrityOfObjectReferencesInCode(sqInt fullGCFlag);
 static sqInt checkMaybeObjRefAt(sqInt mcpc);
 static void checkPrimitiveTableEnablers(void);
 static sqInt checkValidInlineCacheTag(sqInt cacheTag);
 static sqInt checkValidObjectReferencesInClosedPIC(CogMethod *cPIC);
 static sqInt checkValidObjectReference(sqInt anOop);
+static sqInt checkValidOopReference(sqInt anOop);
 static void clearCogCompiledCode(void);
 static sqInt closedPICRefersToUnmarkedObject(CogMethod *cPIC);
 static CogMethod * cmHomeMethod(CogBlockMethod * self_in_cmHomeMethod);
@@ -2300,7 +2301,7 @@
 	cogMethod = ((CogMethod *) methodZoneBase);
 	while (cogMethod < (limitZony())) {
 		if (((cogMethod->cmType)) != CMFree) {
-			if (!(asserta(checkValidObjectReference((cogMethod->selector))))) {
+			if (!(asserta(checkValidOopReference((cogMethod->selector))))) {
 				ok = 0;
 			}
 			if (!(asserta((cogMethodDoesntLookKosher(cogMethod)) == 0))) {
@@ -2309,7 +2310,7 @@
 		}
 		if ((((cogMethod->cmType)) == CMMethod)
 		 || (((cogMethod->cmType)) == CMOpenPIC)) {
-			if (!(asserta((mapForperformUntilarg(cogMethod, checkIfValidObjectRefAndTargetpccogMethod, ((sqInt)cogMethod))) == 0))) {
+			if (!(asserta((mapForperformUntilarg(cogMethod, checkIfValidOopRefAndTargetpccogMethod, ((sqInt)cogMethod))) == 0))) {
 				ok = 0;
 			}
 		}
@@ -3117,7 +3118,7 @@
 }
 
 static sqInt
-checkIfValidObjectRefAndTargetpccogMethod(sqInt annotation, char *mcpc, sqInt cogMethod)
+checkIfValidOopRefAndTargetpccogMethod(sqInt annotation, char *mcpc, sqInt cogMethod)
 {
     sqInt cacheTag;
     sqInt cacheTag1;
@@ -3134,7 +3135,7 @@
 
 	if (annotation == IsObjectReference) {
 		literal = literalBeforeFollowingAddress(backEnd, ((sqInt)mcpc));
-		if (!(asserta(checkValidObjectReference(literal)))) {
+		if (!(asserta(checkValidOopReference(literal)))) {
 			return 1;
 		}
 		if ((couldBeObject(literal))
@@ -3167,7 +3168,7 @@
 		 && ((((((CogMethod *) (entryPoint1 - cmEntryOffset)))->cmType)) == CMOpenPIC))));
 		if (tagCouldBeObj) {
 			if (couldBeObject(cacheTag1)) {
-				if (!(asserta(checkValidObjectReference(cacheTag1)))) {
+				if (!(asserta(checkValidOopReference(cacheTag1)))) {
 					return 4;
 				}
 			}
@@ -3222,7 +3223,7 @@
 }
 
 static sqInt
-checkIfValidObjectRefpccogMethod(sqInt annotation, char *mcpc, sqInt cogMethod)
+checkIfValidOopRefpccogMethod(sqInt annotation, char *mcpc, sqInt cogMethod)
 {
     sqInt entryPoint;
     sqInt literal;
@@ -3233,7 +3234,7 @@
 
 	if (annotation == IsObjectReference) {
 		literal = literalBeforeFollowingAddress(backEnd, ((sqInt)mcpc));
-		if (!(checkValidObjectReference(literal))) {
+		if (!(checkValidOopReference(literal))) {
 			print("object ref leak in CM ");
 			printHex(((sqInt)cogMethod));
 			print(" @ ");
@@ -3287,7 +3288,7 @@
 
 			/* unlinked send or super send; cacheTag is a selector */
 
-			if (!(checkValidObjectReference(selectorOrCacheTag))) {
+			if (!(checkValidOopReference(selectorOrCacheTag))) {
 				print("selector leak in CM ");
 				printHex(((sqInt)cogMethod));
 				print(" @ ");
@@ -3331,7 +3332,7 @@
 					ok = 0;
 				}
 			}
-			if (!(checkValidObjectReference((cogMethod->selector)))) {
+			if (!(checkValidOopReference((cogMethod->selector)))) {
 				print("object leak in CM ");
 				printHex(((sqInt)cogMethod));
 				print(" selector");
@@ -3347,14 +3348,14 @@
 					cr();
 					ok = 0;
 				}
-				if (!(isCompiledMethod((cogMethod->methodObject)))) {
+				if (!(isOopCompiledMethod((cogMethod->methodObject)))) {
 					print("non-method in CM ");
 					printHex(((sqInt)cogMethod));
 					print(" methodObject");
 					cr();
 					ok = 0;
 				}
-				if ((mapForperformUntilarg(cogMethod, checkIfValidObjectRefpccogMethod, ((sqInt)cogMethod))) != 0) {
+				if ((mapForperformUntilarg(cogMethod, checkIfValidOopRefpccogMethod, ((sqInt)cogMethod))) != 0) {
 					ok = 0;
 				}
 				if (!fullGCFlag) {
@@ -3377,7 +3378,7 @@
 				}
 				else {
 					if (((cogMethod->cmType)) == CMOpenPIC) {
-						if ((mapForperformUntilarg(cogMethod, checkIfValidObjectRefpccogMethod, ((sqInt)cogMethod))) != 0) {
+						if ((mapForperformUntilarg(cogMethod, checkIfValidOopRefpccogMethod, ((sqInt)cogMethod))) != 0) {
 							ok = 0;
 						}
 					}
@@ -3475,6 +3476,13 @@
 static sqInt
 checkValidObjectReference(sqInt anOop)
 {
+	return (!(isImmediate(anOop)))
+	 && ((heapMapAtWord(pointerForOop(anOop))) != 0);
+}
+
+static sqInt
+checkValidOopReference(sqInt anOop)
+{
 	return ((anOop & 1))
 	 || ((heapMapAtWord(pointerForOop(anOop))) != 0);
 }

Modified: branches/Cog/nscogsrc/vm/cogit.h
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.h	2014-05-07 04:38:16 UTC (rev 2917)
+++ branches/Cog/nscogsrc/vm/cogit.h	2014-05-10 14:57:27 UTC (rev 2918)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701
+	CCodeGenerator VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d
  */
 
 

Modified: branches/Cog/nscogsrc/vm/cogmethod.h
===================================================================
--- branches/Cog/nscogsrc/vm/cogmethod.h	2014-05-07 04:38:16 UTC (rev 2917)
+++ branches/Cog/nscogsrc/vm/cogmethod.h	2014-05-10 14:57:27 UTC (rev 2918)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701
+	CCodeGenerator VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d
  */
 
 typedef struct {

Modified: branches/Cog/nscogsrc/vm/cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.c	2014-05-07 04:38:16 UTC (rev 2917)
+++ branches/Cog/nscogsrc/vm/cointerp.c	2014-05-10 14:57:27 UTC (rev 2918)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d
    from
-	CoInterpreter VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701
+	CoInterpreter VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -1157,7 +1157,7 @@
 static void rewriteMethodCacheEntryForExternalPrimitiveToFunction(void (*localPrimAddress)(void));
 static sqInt roomToPushNArgs(sqInt n);
 static void runLeakCheckerForFullGC(sqInt fullGCFlag);
-static usqInt safeObjectAfter(sqInt oop);
+static sqInt safeObjectAfter(sqInt oop);
 static sqInt safePrintStringOf(sqInt oop);
 usqInt scavengeThresholdAddress(void);
 EXPORT(sqInt) sendInvokeCallbackContext(VMCallbackContext *vmCallbackContext);
@@ -2045,7 +2045,7 @@
 	/* 574 */ (void (*)(void))0,
 	/* 575 */ (void (*)(void))0,
  0 };
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.706";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.712";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
@@ -2088,7 +2088,6 @@
 #define setDesiredCogCodeSize(dccs) (desiredCogCodeSize = (dccs))
 #define stackPageAtpages(index,pages) ((pages) + (index))
 #define startOfMemory() heapBase
-#define validate() 0
 #define youngStart() GIV(youngStart)
 
 
@@ -5684,7 +5683,6 @@
 						/* begin internalPush: */
 						longAtPointerput((localSP -= BytesPerOop), longAt((rcvr + BaseHeaderSize) + (byte3 << ShiftForWord)));
 					}
-					null;
 					goto l4;
 				}
 				if (opType == 3) {
@@ -5694,7 +5692,6 @@
 					assert(GIV(method) == (iframeMethod(localFP)));
 					object = longAt((GIV(method) + BaseHeaderSize) + ((byte3 + LiteralStart) << ShiftForWord));
 					longAtPointerput((localSP -= BytesPerOop), object);
-					null;
 					goto l4;
 				}
 				if (opType == 4) {
@@ -5708,7 +5705,6 @@
 					object2 = longAt((oop + BaseHeaderSize) + (ValueIndex << ShiftForWord));
 					longAtPointerput((localSP -= BytesPerOop), object2);
 
-					null;
 					goto l4;
 				}
 				top = longAtPointer(localSP);
@@ -24007,15 +24003,17 @@
     sqInt header1;
     sqInt header2;
     sqInt header3;
+    sqInt header4;
     usqInt lastWord;
     sqInt newFreeChunk;
     sqInt newOop;
-    usqInt next;
+    sqInt next;
     sqInt oop;
     sqInt realHeader;
     sqInt sz;
     sqInt sz1;
     sqInt sz2;
+    sqInt sz3;
     sqInt target;
     usqInt w;
 
@@ -24026,7 +24024,21 @@
 		/* begin objectAfterWhileForwarding: */
 		header2 = longAt(oop);
 		if ((header2 & MarkBit) == 0) {
-			next = ((sqInt) (objectAfter(oop)));
+			/* begin objectAfter: */
+			if (!(asserta(oopisLessThan(oop, GIV(freeStart))))) {
+				error("no objects after the end of memory");
+			}
+			if (((longAt(oop)) & TypeMask) == HeaderTypeFree) {
+				sz2 = (longAt(oop)) & AllButTypeMask;
+			}
+			else {
+				/* begin sizeBitsOf: */
+				header3 = longAt(oop);
+				sz2 = ((header3 & TypeMask) == HeaderTypeSizeAndClass
+					? (longAt(oop - (BytesPerWord * 2))) & LongSizeMask
+					: header3 & SizeMask);
+			}
+			next = (oop + sz2) + (headerTypeBytes[(longAt(oop + sz2)) & TypeMask]);
 			goto l1;
 		}
 		fwdBlock1 = (header2 & AllButMarkBitAndTypeMask) << 1;
@@ -24041,7 +24053,7 @@
 		else {
 			sz1 = realHeader & SizeMask;
 		}
-		next = ((sqInt) ((oop + sz1) + (headerTypeBytes[(longAt(oop + sz1)) & TypeMask])));
+		next = (oop + sz1) + (headerTypeBytes[(longAt(oop + sz1)) & TypeMask]);
 	l1:	/* end objectAfterWhileForwarding: */;
 		if (!(((longAt(oop)) & TypeMask) == HeaderTypeFree)) {
 
@@ -24095,18 +24107,18 @@
 	}
 	/* begin safeObjectAfter: */
 	if (((longAt(newFreeChunk)) & TypeMask) == HeaderTypeFree) {
-		sz2 = (longAt(newFreeChunk)) & AllButTypeMask;
+		sz3 = (longAt(newFreeChunk)) & AllButTypeMask;
 	}
 	else {
 		/* begin sizeBitsOf: */
-		header3 = longAt(newFreeChunk);
-		sz2 = ((header3 & TypeMask) == HeaderTypeSizeAndClass
+		header4 = longAt(newFreeChunk);
+		sz3 = ((header4 & TypeMask) == HeaderTypeSizeAndClass
 			? (longAt(newFreeChunk - (BytesPerWord * 2))) & LongSizeMask
-			: header3 & SizeMask);
+			: header4 & SizeMask);
 	}
-	next = ((newFreeChunk + sz2) >= GIV(freeStart)
+	next = ((newFreeChunk + sz3) >= GIV(freeStart)
 		? GIV(freeStart)
-		: (newFreeChunk + sz2) + (headerTypeBytes[(longAt(newFreeChunk + sz2)) & TypeMask]));
+		: (newFreeChunk + sz3) + (headerTypeBytes[(longAt(newFreeChunk + sz3)) & TypeMask]));
 	assert((next == GIV(freeStart))
 	 || (next == (oopFromChunk(GIV(compEnd)))));
 	if (next == GIV(freeStart)) {
@@ -27367,7 +27379,7 @@
     sqInt oop;
 
 	mapStackPages();
-	/* begin mapMachineCode */
+	/* begin mapMachineCode: */
 	mapObjectReferencesInMachineCode(GIV(gcMode));
 	/* begin mapTraceLogs */
 	mapTraceLog();
@@ -50586,7 +50598,7 @@
 	given object or free chunk in memory. Return freeStart when
 	enumeration is complete. This is for assertion checking only. */
 
-static usqInt
+static sqInt
 safeObjectAfter(sqInt oop)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt header;

Modified: branches/Cog/nscogsrc/vm/cointerp.h
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.h	2014-05-07 04:38:16 UTC (rev 2917)
+++ branches/Cog/nscogsrc/vm/cointerp.h	2014-05-10 14:57:27 UTC (rev 2918)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d
  */
 
 

Modified: branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2014-05-07 04:38:16 UTC (rev 2917)
+++ branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2014-05-10 14:57:27 UTC (rev 2918)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d
    from
-	CoInterpreter VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701
+	CoInterpreter VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -1160,7 +1160,7 @@
 static void rewriteMethodCacheEntryForExternalPrimitiveToFunction(void (*localPrimAddress)(void));
 static sqInt roomToPushNArgs(sqInt n);
 static void runLeakCheckerForFullGC(sqInt fullGCFlag);
-static usqInt safeObjectAfter(sqInt oop);
+static sqInt safeObjectAfter(sqInt oop);
 static sqInt safePrintStringOf(sqInt oop);
 usqInt scavengeThresholdAddress(void);
 EXPORT(sqInt) sendInvokeCallbackContext(VMCallbackContext *vmCallbackContext);
@@ -2048,7 +2048,7 @@
 	/* 574 */ (void (*)(void))0,
 	/* 575 */ (void (*)(void))0,
  0 };
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.706";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.712";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
@@ -2091,7 +2091,6 @@
 #define setDesiredCogCodeSize(dccs) (desiredCogCodeSize = (dccs))
 #define stackPageAtpages(index,pages) ((pages) + (index))
 #define startOfMemory() heapBase
-#define validate() 0
 #define youngStart() GIV(youngStart)
 
 
@@ -5693,7 +5692,6 @@
 						/* begin internalPush: */
 						longAtPointerput((localSP -= BytesPerOop), longAt((rcvr + BaseHeaderSize) + (byte3 << ShiftForWord)));
 					}
-					null;
 					goto l4;
 				}
 				if (opType == 3) {
@@ -5703,7 +5701,6 @@
 					assert(GIV(method) == (iframeMethod(localFP)));
 					object = longAt((GIV(method) + BaseHeaderSize) + ((byte3 + LiteralStart) << ShiftForWord));
 					longAtPointerput((localSP -= BytesPerOop), object);
-					null;
 					goto l4;
 				}
 				if (opType == 4) {
@@ -5717,7 +5714,6 @@
 					object2 = longAt((oop + BaseHeaderSize) + (ValueIndex << ShiftForWord));
 					longAtPointerput((localSP -= BytesPerOop), object2);
 
-					null;
 					goto l4;
 				}
 				top = longAtPointer(localSP);
@@ -24016,15 +24012,17 @@
     sqInt header1;
     sqInt header2;
     sqInt header3;
+    sqInt header4;
     usqInt lastWord;
     sqInt newFreeChunk;
     sqInt newOop;
-    usqInt next;
+    sqInt next;
     sqInt oop;
     sqInt realHeader;
     sqInt sz;
     sqInt sz1;
     sqInt sz2;
+    sqInt sz3;
     sqInt target;
     usqInt w;
 
@@ -24035,7 +24033,21 @@
 		/* begin objectAfterWhileForwarding: */
 		header2 = longAt(oop);
 		if ((header2 & MarkBit) == 0) {
-			next = ((sqInt) (objectAfter(oop)));
+			/* begin objectAfter: */
+			if (!(asserta(oopisLessThan(oop, GIV(freeStart))))) {
+				error("no objects after the end of memory");
+			}
+			if (((longAt(oop)) & TypeMask) == HeaderTypeFree) {
+				sz2 = (longAt(oop)) & AllButTypeMask;
+			}
+			else {
+				/* begin sizeBitsOf: */
+				header3 = longAt(oop);
+				sz2 = ((header3 & TypeMask) == HeaderTypeSizeAndClass
+					? (longAt(oop - (BytesPerWord * 2))) & LongSizeMask
+					: header3 & SizeMask);
+			}
+			next = (oop + sz2) + (headerTypeBytes[(longAt(oop + sz2)) & TypeMask]);
 			goto l1;
 		}
 		fwdBlock1 = (header2 & AllButMarkBitAndTypeMask) << 1;
@@ -24050,7 +24062,7 @@
 		else {
 			sz1 = realHeader & SizeMask;
 		}
-		next = ((sqInt) ((oop + sz1) + (headerTypeBytes[(longAt(oop + sz1)) & TypeMask])));
+		next = (oop + sz1) + (headerTypeBytes[(longAt(oop + sz1)) & TypeMask]);
 	l1:	/* end objectAfterWhileForwarding: */;
 		if (!(((longAt(oop)) & TypeMask) == HeaderTypeFree)) {
 
@@ -24104,18 +24116,18 @@
 	}
 	/* begin safeObjectAfter: */
 	if (((longAt(newFreeChunk)) & TypeMask) == HeaderTypeFree) {
-		sz2 = (longAt(newFreeChunk)) & AllButTypeMask;
+		sz3 = (longAt(newFreeChunk)) & AllButTypeMask;
 	}
 	else {
 		/* begin sizeBitsOf: */
-		header3 = longAt(newFreeChunk);
-		sz2 = ((header3 & TypeMask) == HeaderTypeSizeAndClass
+		header4 = longAt(newFreeChunk);
+		sz3 = ((header4 & TypeMask) == HeaderTypeSizeAndClass
 			? (longAt(newFreeChunk - (BytesPerWord * 2))) & LongSizeMask
-			: header3 & SizeMask);
+			: header4 & SizeMask);
 	}
-	next = ((newFreeChunk + sz2) >= GIV(freeStart)
+	next = ((newFreeChunk + sz3) >= GIV(freeStart)
 		? GIV(freeStart)
-		: (newFreeChunk + sz2) + (headerTypeBytes[(longAt(newFreeChunk + sz2)) & TypeMask]));
+		: (newFreeChunk + sz3) + (headerTypeBytes[(longAt(newFreeChunk + sz3)) & TypeMask]));
 	assert((next == GIV(freeStart))
 	 || (next == (oopFromChunk(GIV(compEnd)))));
 	if (next == GIV(freeStart)) {
@@ -27376,7 +27388,7 @@
     sqInt oop;
 
 	mapStackPages();
-	/* begin mapMachineCode */
+	/* begin mapMachineCode: */
 	mapObjectReferencesInMachineCode(GIV(gcMode));
 	/* begin mapTraceLogs */
 	mapTraceLog();
@@ -50595,7 +50607,7 @@
 	given object or free chunk in memory. Return freeStart when
 	enumeration is complete. This is for assertion checking only. */
 
-static usqInt
+static sqInt
 safeObjectAfter(sqInt oop)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt header;

Modified: branches/Cog/nscogsrc/vm/interp.h
===================================================================
--- branches/Cog/nscogsrc/vm/interp.h	2014-05-07 04:38:16 UTC (rev 2917)
+++ branches/Cog/nscogsrc/vm/interp.h	2014-05-10 14:57:27 UTC (rev 2918)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d
  */
 
 #define VM_PROXY_MAJOR 1

Modified: branches/Cog/nscogsrc/vm/vmCallback.h
===================================================================
--- branches/Cog/nscogsrc/vm/vmCallback.h	2014-05-07 04:38:16 UTC (rev 2917)
+++ branches/Cog/nscogsrc/vm/vmCallback.h	2014-05-10 14:57:27 UTC (rev 2918)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d
  */
 
 #define VM_CALLBACK_INC 1

Modified: branches/Cog/nsspursrc/vm/cogit.c
===================================================================
--- branches/Cog/nsspursrc/vm/cogit.c	2014-05-07 04:38:16 UTC (rev 2917)
+++ branches/Cog/nsspursrc/vm/cogit.c	2014-05-10 14:57:27 UTC (rev 2918)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701
+	CCodeGenerator VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701
+	StackToRegisterMappingCogit VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701 " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -394,14 +394,15 @@
 static sqInt ceImplicitReceiverForreceiverclass(sqInt selector, sqInt receiver, sqInt rcvrClass);
 sqInt ceSICMiss(sqInt receiver);
 void checkAssertsEnabledInCogit(void);
-static sqInt checkIfValidObjectRefAndTargetpccogMethod(sqInt annotation, char *mcpc, sqInt cogMethod);
-static sqInt checkIfValidObjectRefpccogMethod(sqInt annotation, char *mcpc, sqInt cogMethod);
+static sqInt checkIfValidOopRefAndTargetpccogMethod(sqInt annotation, char *mcpc, sqInt cogMethod);
+static sqInt checkIfValidOopRefpccogMethod(sqInt annotation, char *mcpc, sqInt cogMethod);
 sqInt checkIntegrityOfObjectReferencesInCode(sqInt fullGCFlag);
 static sqInt checkMaybeObjRefAt(sqInt mcpc);
 static void checkPrimitiveTableEnablers(void);
 static sqInt checkValidInlineCacheTag(sqInt classIndexOrTagPattern);
 static sqInt checkValidObjectReferencesInClosedPIC(CogMethod *cPIC);
 static sqInt checkValidObjectReference(sqInt anOop);
+static sqInt checkValidOopReference(sqInt anOop);
 static void clearCogCompiledCode(void);
 static CogMethod * cmHomeMethod(CogBlockMethod * self_in_cmHomeMethod);
 char * codeEntryFor(char *address);
@@ -2297,7 +2298,7 @@
 	cogMethod = ((CogMethod *) methodZoneBase);
 	while (cogMethod < (limitZony())) {
 		if (((cogMethod->cmType)) != CMFree) {
-			if (!(asserta(checkValidObjectReference((cogMethod->selector))))) {
+			if (!(asserta(checkValidOopReference((cogMethod->selector))))) {
 				ok = 0;
 			}
 			if (!(asserta((cogMethodDoesntLookKosher(cogMethod)) == 0))) {
@@ -2306,7 +2307,7 @@
 		}
 		if ((((cogMethod->cmType)) == CMMethod)
 		 || (((cogMethod->cmType)) == CMOpenPIC)) {
-			if (!(asserta((mapForperformUntilarg(cogMethod, checkIfValidObjectRefAndTargetpccogMethod, ((sqInt)cogMethod))) == 0))) {
+			if (!(asserta((mapForperformUntilarg(cogMethod, checkIfValidOopRefAndTargetpccogMethod, ((sqInt)cogMethod))) == 0))) {
 				ok = 0;
 			}
 		}
@@ -3116,7 +3117,7 @@
 }
 
 static sqInt
-checkIfValidObjectRefAndTargetpccogMethod(sqInt annotation, char *mcpc, sqInt cogMethod)
+checkIfValidOopRefAndTargetpccogMethod(sqInt annotation, char *mcpc, sqInt cogMethod)
 {
     sqInt cacheTag;
     sqInt cacheTag1;
@@ -3133,7 +3134,7 @@
 
 	if (annotation == IsObjectReference) {
 		literal = literalBeforeFollowingAddress(backEnd, ((sqInt)mcpc));
-		if (!(asserta(checkValidObjectReference(literal)))) {
+		if (!(asserta(checkValidOopReference(literal)))) {
 			return 1;
 		}
 		if ((couldBeObject(literal))
@@ -3166,7 +3167,7 @@
 		 && ((((((CogMethod *) (entryPoint1 - cmEntryOffset)))->cmType)) == CMOpenPIC))));
 		if (tagCouldBeObj) {
 			if (couldBeObject(cacheTag1)) {
-				if (!(asserta(checkValidObjectReference(cacheTag1)))) {
+				if (!(asserta(checkValidOopReference(cacheTag1)))) {
 					return 4;
 				}
 			}
@@ -3221,7 +3222,7 @@
 }
 
 static sqInt
-checkIfValidObjectRefpccogMethod(sqInt annotation, char *mcpc, sqInt cogMethod)
+checkIfValidOopRefpccogMethod(sqInt annotation, char *mcpc, sqInt cogMethod)
 {
     sqInt entryPoint;
     sqInt literal;
@@ -3232,7 +3233,7 @@
 
 	if (annotation == IsObjectReference) {
 		literal = literalBeforeFollowingAddress(backEnd, ((sqInt)mcpc));
-		if (!(checkValidObjectReference(literal))) {
+		if (!(checkValidOopReference(literal))) {
 			print("object ref leak in CM ");
 			printHex(((sqInt)cogMethod));
 			print(" @ ");
@@ -3286,7 +3287,7 @@
 
 			/* unlinked send or super send; cacheTag is a selector */
 
-			if (!(checkValidObjectReference(selectorOrCacheTag))) {
+			if (!(checkValidOopReference(selectorOrCacheTag))) {
 				print("selector leak in CM ");
 				printHex(((sqInt)cogMethod));
 				print(" @ ");
@@ -3330,7 +3331,7 @@
 					ok = 0;
 				}
 			}
-			if (!(checkValidObjectReference((cogMethod->selector)))) {
+			if (!(checkValidOopReference((cogMethod->selector)))) {
 				print("object leak in CM ");
 				printHex(((sqInt)cogMethod));
 				print(" selector");
@@ -3346,14 +3347,14 @@
 					cr();
 					ok = 0;
 				}
-				if (!(isCompiledMethod((cogMethod->methodObject)))) {
+				if (!(isOopCompiledMethod((cogMethod->methodObject)))) {
 					print("non-method in CM ");
 					printHex(((sqInt)cogMethod));
 					print(" methodObject");
 					cr();
 					ok = 0;
 				}
-				if ((mapForperformUntilarg(cogMethod, checkIfValidObjectRefpccogMethod, ((sqInt)cogMethod))) != 0) {
+				if ((mapForperformUntilarg(cogMethod, checkIfValidOopRefpccogMethod, ((sqInt)cogMethod))) != 0) {
 					ok = 0;
 				}
 				if (!fullGCFlag) {
@@ -3376,7 +3377,7 @@
 				}
 				else {
 					if (((cogMethod->cmType)) == CMOpenPIC) {
-						if ((mapForperformUntilarg(cogMethod, checkIfValidObjectRefpccogMethod, ((sqInt)cogMethod))) != 0) {
+						if ((mapForperformUntilarg(cogMethod, checkIfValidOopRefpccogMethod, ((sqInt)cogMethod))) != 0) {
 							ok = 0;
 						}
 					}
@@ -3465,6 +3466,13 @@
 static sqInt
 checkValidObjectReference(sqInt anOop)
 {
+	return (!(isImmediate(anOop)))
+	 && ((heapMapAtWord(pointerForOop(anOop))) != 0);
+}
+
+static sqInt
+checkValidOopReference(sqInt anOop)
+{
 	return (isImmediate(anOop))
 	 || ((heapMapAtWord(pointerForOop(anOop))) != 0);
 }

Modified: branches/Cog/nsspursrc/vm/cogit.h
===================================================================
--- branches/Cog/nsspursrc/vm/cogit.h	2014-05-07 04:38:16 UTC (rev 2917)
+++ branches/Cog/nsspursrc/vm/cogit.h	2014-05-10 14:57:27 UTC (rev 2918)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701
+	CCodeGenerator VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d
  */
 
 

Modified: branches/Cog/nsspursrc/vm/cogmethod.h
===================================================================
--- branches/Cog/nsspursrc/vm/cogmethod.h	2014-05-07 04:38:16 UTC (rev 2917)
+++ branches/Cog/nsspursrc/vm/cogmethod.h	2014-05-10 14:57:27 UTC (rev 2918)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701
+	CCodeGenerator VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d
  */
 
 typedef struct {

Modified: branches/Cog/nsspursrc/vm/cointerp.c
===================================================================
--- branches/Cog/nsspursrc/vm/cointerp.c	2014-05-07 04:38:16 UTC (rev 2917)
+++ branches/Cog/nsspursrc/vm/cointerp.c	2014-05-10 14:57:27 UTC (rev 2918)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d
    from
-	CoInterpreter VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701
+	CoInterpreter VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.706 uuid: 6eba60e7-a131-4353-870a-b34e8230b701 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.712 uuid: 2f12e8dd-7da6-4358-9eb4-ba4782b7206d " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -935,12 +935,14 @@
 static sqInt okayOop(sqInt signedOop);
 static sqInt oopisGreaterThanOrEqualTo(sqInt anOop, sqInt otherOop);
 static sqInt oopisGreaterThanOrEqualToandLessThanOrEqualTo(sqInt anOop, sqInt baseOop, sqInt limitOop);
+static sqInt oopisGreaterThanOrEqualToandLessThan(sqInt anOop, sqInt baseOop, sqInt limitOop);
 static sqInt oopisGreaterThan(sqInt anOop, sqInt otherOop);
 static sqInt oopisLessThanOrEqualTo(sqInt anOop, sqInt otherOop);
 static sqInt oopisLessThan(sqInt anOop, sqInt otherOop);
 static sqInt pageIndexFor(void *pointer);
 static sqInt pageListIsWellFormed(void);
 sqInt penultimateLiteralOf(sqInt aMethodOop);
+static void pigCompact(void);
 void pinObject(sqInt objOop);
 static sqInt popObjStack(sqInt objStack);
 sqInt popRemappableOop(void);
@@ -1453,19 +1455,19 @@
 _iss char * stackBasePlus1;
 _iss sqInt hiddenRootsObj;
 _iss usqInt endOfMemory;
+_iss SpurCircularBuffer highestObjects;
 _iss sqInt totalFreeOldSpace;
-_iss SpurCircularBuffer highestObjects;
 _iss sqInt trueObj;
 _iss sqInt remapBufferCount;
 _iss SpurSegmentInfo * segments;
 _iss sqInt needGCFlag;
 _iss sqInt falseObj;
 _iss sqInt traceLogIndex;
+_iss sqInt firstFreeChunk;
 _iss sqInt bytesPerPage;
-_iss sqInt firstFreeChunk;
 _iss sqInt * freeLists;
+_iss usqInt pastSpaceStart;
 _iss sqInt numSegments;
-_iss usqInt pastSpaceStart;
 _iss usqInt freeListsMask;
 _iss char * stackLimit;
 _iss usqInt scavengeThreshold;
@@ -1481,7 +1483,6 @@
 _iss usqInt oldSpaceStart;
 _iss sqInt weaklingStack;
 _iss SpurNewSpaceSpace futureSpace;
-_iss sqInt futureSurvivorStart;
 _iss sqInt jmpDepth;
 _iss sqLong nextProfileTick;
 _iss sqInt numRememberedEphemerons;
@@ -1489,6 +1490,7 @@
 _iss sqInt numClassTablePages;
 _iss sqInt longRunningPrimitiveCheckSemaphore;
 _iss sqInt tempOop;
+_iss sqInt futureSurvivorStart;
 _iss char * objStackInvalidBecause;
 _iss SpurNewSpaceSpace eden;
 _iss sqInt profileSemaphore;
@@ -1510,7 +1512,6 @@
 _iss sqInt lastMethodCacheProbeWrite;
 _iss sqInt lkupClass;
 _iss sqInt backwardJumpCount;
-_iss sqInt gcMode;
 _iss sqInt metaclassNumSlots;
 _iss usqLong nextWakeupUsecs;
 _iss sqInt preemptionYields;
@@ -1520,6 +1521,7 @@
 _iss usqLong longRunningPrimitiveStopUsecs;
 _iss sqInt numSegInfos;
 _iss usqLong statCheckForEvents;
+_iss sqInt gcMode;
 _iss sqInt lastCoggableInterpretedBlockMethod;
 _iss sqInt lastUncoggableInterpretedBlockMethod;
 _iss usqInt lowSpaceThreshold;
@@ -1555,6 +1557,7 @@
 _iss sqInt globalSessionID;
 _iss sqInt interruptKeycode;
 _iss sqInt maxExtSemTabSizeSet;
+_iss sqInt scavengeInProgress;
 _iss usqLong statFullGCUsecs;
 _iss sqInt statFullGCs;
 _iss sqInt statGrowMemory;
@@ -1569,7 +1572,6 @@
 _iss sqInt longRunningPrimitiveSignalUndelivered;
 _iss StackPage * overflowedPage;
 _iss sqInt savedWindowSize;
-_iss sqInt scavengeInProgress;
 _iss sqInt signalLowSpace;
 _iss sqInt statCodeCompactionCount;
 _iss usqLong statCodeCompactionUsecs;
@@ -2220,7 +2222,7 @@
 	/* 574 */ (void (*)(void))0,
 	/* 575 */ (void (*)(void))0,
  0 };
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.706";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.712";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
@@ -2242,6 +2244,7 @@
 #define flush() fflush(stdout)
 #define freeStart() GIV(freeStart)
 #define futureSpace() GIV(futureSpace)
+#define futureSurvivorStart() GIV(futureSurvivorStart)
 #define getCodeCompactionCount() integerObjectOf(GIV(statCodeCompactionCount))
 #define getCodeCompactionMSecs() integerObjectOf((GIV(statCodeCompactionUsecs) + 500) / 1000)
 #define getCogCodeSize() integerObjectOf(GIV(cogCodeSize))
@@ -5512,6 +5515,7 @@
 							GIV(framePointer) = localFP;
 							
 							ceEnterCogCodePopReceiverReg();
+							null;
 							goto l290;
 						}
 						localIP = pointerForOop(longAt(localFP + FoxIFSavedIP));
@@ -5529,7 +5533,7 @@
 					/* begin fetchNextBytecode */
 					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
-					/* return self */
+					null;
 				l290:	/* end baseFrameReturn */;
 					goto l287;
 				}
@@ -6573,7 +6577,6 @@
 						/* begin internalPush: */
 						longAtPointerput((localSP -= BytesPerOop), longAt((rcvr1 + (BaseHeaderSize)) + (byte3 << 2)));
 					}
-					null;
 					goto l5;
 				}
 				if (opType == 3) {
@@ -6583,7 +6586,6 @@
 					assert(GIV(method) == (iframeMethod(localFP)));
 					object = longAt((GIV(method) + (BaseHeaderSize)) + ((byte3 + LiteralStart) << 2));
 					longAtPointerput((localSP -= BytesPerOop), object);
-					null;
 					goto l5;
 				}
 				if (opType == 4) {
@@ -6611,7 +6613,6 @@
 					/* begin internalPush: */
 					longAtPointerput((localSP -= BytesPerOop), longAt((litVar1 + (BaseHeaderSize)) + (ValueIndex << 2)));
 
-					null;
 					goto l5;
 				}
 				top = longAtPointer(localSP);
@@ -15496,8 +15497,7 @@
 	 || ((((((usqInt) address)) >= (((usqInt) (((pastSpace()).start)))))
 	 && ((((usqInt) address)) < (((usqInt) GIV(pastSpaceStart)))))
 	 || (GIV(scavengeInProgress)
-	 && (((((usqInt) address)) >= (((usqInt) (((futureSpace()).start)))))
-	 && ((((usqInt) address)) < (((usqInt) GIV(futureSurvivorStart)))))))));
+	 && (oopisGreaterThanOrEqualToandLessThan(address, ((futureSpace()).start), futureSurvivorStart()))))));
 }
 
 static sqInt
@@ -15833,9 +15833,6 @@
 	l1:	/* end allocateSlots:format:classIndex: */;
 		return freeChunk;
 	}
-	/* begin runLeakCheckerForFullGC: */
-	runLeakCheckerForFullGCexcludeUnmarkedNewSpaceObjsclassIndicesShouldBeValid(0, 0, 1);
-	/* return self */
 	markObjects();
 	/* begin allocateLargestFreeChunk */
 	freeChunk1 = findLargestFreeChunk();
@@ -16113,9 +16110,6 @@
     sqInt slotBytes;
     sqInt start;
 
-	/* begin runLeakCheckerForFullGC: */
-	runLeakCheckerForFullGCexcludeUnmarkedNewSpaceObjsclassIndicesShouldBeValid(0, 0, 1);
-	/* return self */
 	markObjects();
 	/* begin allocateLargestFreeChunk */
 	freeChunk1 = findLargestFreeChunk();
@@ -22553,86 +22547,10 @@
 static void
 compact(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
-    sqInt cascade0;
-    sqInt cascade1;
-    sqInt free;
-    sqInt high;
-    sqInt low;
-    sqInt nextFree;
-    usqInt numSlots;
-    usqInt numSlots1;
-    sqInt prevFree;
-    sqInt prevPrevFree;
-    sqInt scanAddress;
-    sqInt slotBytes;
-
 	assert((GIV(firstFreeChunk) == 0)
 	 || (isFreeObject(GIV(firstFreeChunk))));
-	/* begin pigCompact */
-	;
-	/* begin sortedFreeListPairwiseReverseDo: */
-	free = GIV(lastFreeChunk);
-	prevPrevFree = (prevFree = 0);
-	while (free != 0) {
-		nextFree = (longAt((free + (BaseHeaderSize)) + (0 << 2))) ^ prevFree;
-		assert((free == 0)
-		 || (isFreeObject(free)));
-		assert((prevFree == 0)
-		 || (prevFree > free));
-		
-		/* begin addressAfter: */
-		/* begin numSlotsOfAny: */
-		numSlots1 = byteAt(free + 7);
-		numSlots = (numSlots1 == 0xFF
-			? longAt(free - (BaseHeaderSize))
-			: numSlots1);
-		slotBytes = (numSlots == 0
-			? 8
-			: (numSlots + (numSlots & 1)) << 2);
-		scanAddress = (free + (BaseHeaderSize)) + slotBytes;
-		while ((((usqInt) scanAddress)) < (((usqInt) ((prevFree == 0
-	? GIV(endOfMemory) - (2 * (BaseHeaderSize))
-	: ((byteAt(prevFree + 7)) == 0xFF
-			? prevFree - (BaseHeaderSize)
-			: prevFree)))))) {
-			scanAddress = moveARunOfObjectsStartingAtupTo(scanAddress, (prevFree == 0
-				? GIV(endOfMemory) - (2 * (BaseHeaderSize))
-				: ((byteAt(prevFree + 7)) == 0xFF
-						? prevFree - (BaseHeaderSize)
-						: prevFree)));
-			if (scanAddress == 0) {
-				goto l1;
-			}
-		}
+	pigCompact();
 
-		assert((prevFree == 0)
-		 || (isFreeObject(prevFree)));
-		assert((prevPrevFree == 0)
-		 || (isFreeObject(prevPrevFree)));
-		if (!(((longAt(free)) & 0x3FFFFF) == 0)) {
-			free = (longAt((prevFree + (BaseHeaderSize)) + (0 << 2))) ^ prevPrevFree;
-		}
-		if ((nextFree == 0)
-		 || (((longAt(nextFree)) & 0x3FFFFF) == 0)) {
-			prevPrevFree = prevFree;
-			prevFree = free;
-			free = nextFree;
-		}
-		else {
-			free = GIV(lastFreeChunk);
-			prevPrevFree = (prevFree = 0);
-			while (free > nextFree) {
-				nextFree = (longAt((free + (BaseHeaderSize)) + (0 << 2))) ^ prevFree;
-				assert(isFreeObject(nextFree));
-				prevPrevFree = prevFree;
-				prevFree = free;
-				free = nextFree;
-			}
-		}
-	}
-	null;
-l1:	/* end pigCompact */;
-
 }
 
 sqInt
@@ -24236,8 +24154,8 @@
 		}
 	}
 	doScavenge(DontTenureButDoUnmark);
-	/* begin mapMachineCode */
-	mapObjectReferencesInMachineCode(GIV(gcMode));
+	/* begin mapMachineCode: */
+	mapObjectReferencesInMachineCode(GCModeFull);
 	/* begin checkFreeSpace */
 	assert(bitsSetInFreeSpaceMaskForAllFreeLists());
 	assert(GIV(totalFreeOldSpace) == (totalFreeListBytes()));
@@ -24392,30 +24310,46 @@
 static void
 eliminateAndFreeForwardersForPigCompact(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt address;
+    sqInt address1;
     sqInt bytes;
+    sqInt endOfFreeRun;
     sqInt f;
-    sqInt firstFree;
-    sqInt firstFreeStart;
+    sqInt firstOfFreeRun;
     sqInt i;
     sqInt iLimiT;
     sqInt index;
-    sqInt lastFree;
     sqInt lowest;
     sqInt lowestForwarder;
     sqInt lowestForwarder1;
+    usqInt numSlots;
+    usqInt numSlots1;
     sqInt o;
     sqInt o1;
     sqInt obj;
     sqInt objOop;
     sqInt objOop1;
+    sqInt objOop11;
+    sqInt objOop12;
     sqInt objOop2;
+    sqInt objOop21;
+    sqInt objOop3;
+    sqInt objOop4;
+    sqInt prevFree;
     sqInt prevObj;
     sqInt prevObj1;
+    sqInt prevObj11;
+    sqInt prevObj2;
+    sqInt prevPrevFree;
     sqInt prevPrevObj;
     sqInt prevPrevObj1;
+    sqInt prevPrevObj11;
+    sqInt prevPrevObj2;
     sqInt referent;
     sqInt referent1;
+    sqInt referent11;
     sqInt referent2;
+    sqInt startOfFreeRun;
 
 	assert(!(isForwarded(GIV(nilObj))));
 	assert(!(isForwarded(GIV(falseObj))));
@@ -24427,17 +24361,18 @@
 	if (((longAt(GIV(specialObjectsOop))) & 0x3FFFFF) == 8) {
 		/* begin followForwarded: */
 		assert(isForwarded(GIV(specialObjectsOop)));
-		referent1 = longAt((GIV(specialObjectsOop) + (BaseHeaderSize)) + (0 << 2));
-		while (((referent1 & 3) == 0)
-		 && (((longAt(referent1)) & 0x3FFFFF) == 8)) {
-			referent1 = longAt((referent1 + (BaseHeaderSize)) + (0 << 2));
+		referent = longAt((GIV(specialObjectsOop) + (BaseHeaderSize)) + (0 << 2));
+		while (((referent & 3) == 0)
+		 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
+			referent = longAt((referent + (BaseHeaderSize)) + (0 << 2));
 		}
-		GIV(specialObjectsOop) = referent1;
+		GIV(specialObjectsOop) = referent;
 	}
 	/* begin followForwardedObjStacks */
 	followForwardedInObjStackatIndex(GIV(markStack), MarkStackRootIndex);
 	followForwardedInObjStackatIndex(GIV(weaklingStack), WeaklingStackRootIndex);
 	followForwardedInObjStackatIndex(GIV(ephemeronQueue), EphemeronQueueRootIndex);
+	mapInterpreterOops();
 	/* begin followRememberedForwardersAndForgetFreeObjectsForPigCompact */
 	index = 0;
 	while (index < GIV(rememberedSetSize)) {
@@ -24456,85 +24391,143 @@
 				longAtput(obj, (longAt(obj)) & (~(1 << 29)));
 				/* begin followForwarded: */
 				assert(isForwarded(obj));
-				referent2 = longAt((obj + (BaseHeaderSize)) + (0 << 2));
-				while (((referent2 & 3) == 0)
-				 && (((longAt(referent2)) & 0x3FFFFF) == 8)) {
-					referent2 = longAt((referent2 + (BaseHeaderSize)) + (0 << 2));
+				referent1 = longAt((obj + (BaseHeaderSize)) + (0 << 2));
+				while (((referent1 & 3) == 0)
+				 && (((longAt(referent1)) & 0x3FFFFF) == 8)) {
+					referent1 = longAt((referent1 + (BaseHeaderSize)) + (0 << 2));
 				}
-				obj = referent2;
+				obj = referent1;
 				assert(isRemembered(obj));
 				GIV(rememberedSet)[index] = obj;
 			}
 			index += 1;
 		}
 	}
-	GIV(totalFreeOldSpace) = 0;
-	doScavenge(DontTenureButDoUnmark);
-	assert(GIV(totalFreeOldSpace) == 0);
-	/* begin mapMachineCode */
-	mapObjectReferencesInMachineCode(GIV(gcMode));
+	/* begin unmarkSurvivingObjectsForPigCompact */
+	/* begin allPastSpaceObjectsDo: */
+	/* begin allPastSpaceEntitiesDo: */
+	prevPrevObj = (prevObj = null);
+	/* begin objectStartingAt: */
+	address = ((pastSpace()).start);
+	numSlots = byteAt(address + 7);
+	objOop1 = (numSlots == 0xFF
+		? address + (BaseHeaderSize)
+		: address);
+	while ((((usqInt) objOop1)) < (((usqInt) GIV(pastSpaceStart)))) {
+		assert(isEnumerableObjectNoAssert(objOop1));
+		if (((((usqInt) (longAt(objOop1 + 4))) >> 23) & 1) != 0) {
+			setIsMarkedOfto(objOop1, 0);
+		}
+
+
+		prevPrevObj = prevObj;
+		prevObj = objOop1;
+		objOop1 = objectAfterlimit(objOop1, GIV(pastSpaceStart));
+	}
+	
+	
 	/* begin sweepToFollowForwardersForPigCompact */
+	assert((GIV(freeStart) == (((eden()).start)))
+	 && ((futureSurvivorStart()) == (((futureSpace()).start))));
+	/* begin allPastSpaceObjectsDo: */
+	/* begin allPastSpaceEntitiesDo: */
+	prevPrevObj2 = (prevObj2 = null);
+	/* begin objectStartingAt: */
+	address1 = ((pastSpace()).start);
+	numSlots1 = byteAt(address1 + 7);
+	objOop12 = (numSlots1 == 0xFF
+		? address1 + (BaseHeaderSize)
+		: address1);
+	while ((((usqInt) objOop12)) < (((usqInt) GIV(pastSpaceStart)))) {
+		assert(isEnumerableObjectNoAssert(objOop12));
+		if (!(((longAt(objOop12)) & 0x3FFFFF) == 8)) {
+			for (i = 0, iLimiT = ((numPointerSlotsOf(objOop12)) - 1); i <= iLimiT; i += 1) {
+				f = longAt((objOop12 + (BaseHeaderSize)) + (i << 2));
+				if (((f & 3) == 0)
+				 && (((longAt(f)) & 0x3FFFFF) == 8)) {
+					/* begin followForwarded: */
+					assert(isForwarded(f));
+					referent2 = longAt((f + (BaseHeaderSize)) + (0 << 2));
+					while (((referent2 & 3) == 0)
+					 && (((longAt(referent2)) & 0x3FFFFF) == 8)) {
+						referent2 = longAt((referent2 + (BaseHeaderSize)) + (0 << 2));
+					}
+					f = referent2;
+					/* begin storePointerUnchecked:ofObject:withValue: */
+					assert(!(isForwarded(objOop12)));
+					longAtput((objOop12 + (BaseHeaderSize)) + (i << 2), f);
+				}
+			}
+		}
+
+
+		prevPrevObj2 = prevObj2;
+		prevObj2 = objOop12;
+		objOop12 = objectAfterlimit(objOop12, GIV(pastSpaceStart));
+	}
+	
+	
 	lowestForwarder1 = 0;
 	/* begin allOldSpaceObjectsDo: */
 	/* begin allOldSpaceObjectsFrom:do: */
 	/* begin allOldSpaceEntitiesFrom:do: */
-	prevPrevObj = (prevObj = null);
-	objOop1 = GIV(nilObj);
+	prevPrevObj11 = (prevObj11 = null);
+	objOop11 = GIV(nilObj);
 	while (1) {
-		assert((objOop1 % (allocationUnit())) == 0);
-		if (!((((usqInt) objOop1)) < (((usqInt) GIV(endOfMemory))))) break;
-		assert((long64At(objOop1)) != 0);
-		if (isEnumerableObject(objOop1)) {
-			if (((longAt(objOop1)) & 0x3FFFFF) == 8) {
+		assert((objOop11 % (allocationUnit())) == 0);
+		if (!((((usqInt) objOop11)) < (((usqInt) GIV(endOfMemory))))) break;
+		assert((long64At(objOop11)) != 0);
+		if (isEnumerableObject(objOop11)) {
+			if (((longAt(objOop11)) & 0x3FFFFF) == 8) {
 				if (lowestForwarder1 == 0) {
 					lowestForwarder1 = 0;
 				}
 			}
 			else {
-				for (i = 0, iLimiT = ((numPointerSlotsOf(objOop1)) - 1); i <= iLimiT; i += 1) {
-					f = longAt((objOop1 + (BaseHeaderSize)) + (i << 2));
+				for (i = 0, iLimiT = ((numPointerSlotsOf(objOop11)) - 1); i <= iLimiT; i += 1) {
+					f = longAt((objOop11 + (BaseHeaderSize)) + (i << 2));
 					if (((f & 3) == 0)
 					 && (((longAt(f)) & 0x3FFFFF) == 8)) {
 						/* begin followForwarded: */
 						assert(isForwarded(f));
-						referent = longAt((f + (BaseHeaderSize)) + (0 << 2));
-						while (((referent & 3) == 0)
-						 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
-							referent = longAt((referent + (BaseHeaderSize)) + (0 << 2));
+						referent11 = longAt((f + (BaseHeaderSize)) + (0 << 2));
+						while (((referent11 & 3) == 0)
+						 && (((longAt(referent11)) & 0x3FFFFF) == 8)) {
+							referent11 = longAt((referent11 + (BaseHeaderSize)) + (0 << 2));
 						}
-						f = referent;
+						f = referent11;
 						/* begin storePointer:ofObject:withValue: */
-						assert(!(isForwarded(objOop1)));
-						if (isOldObject(objOop1)) {
+						assert(!(isForwarded(objOop11)));
+						if (isOldObject(objOop11)) {
 
 							/* most stores into young objects */
 
 							if (((f & 3) == 0)
 							 && ((((usqInt) f)) < (((usqInt) GIV(newSpaceLimit))))) {
 								/* begin possibleRootStoreInto: */
-								if (!(((((usqInt) (longAt(objOop1))) >> 29) & 1) != 0)) {
-									remember(objOop1);
+								if (!(((((usqInt) (longAt(objOop11))) >> 29) & 1) != 0)) {
+									remember(objOop11);
 									/* begin setIsRememberedOf:to: */
 									flag("endianness");
-									longAtput(objOop1, (longAt(objOop1)) | (1 << 29));
+									longAtput(objOop11, (longAt(objOop11)) | (1 << 29));
 								}
 							}
 						}
-						longAtput((objOop1 + (BaseHeaderSize)) + (i << 2), f);
+						longAtput((objOop11 + (BaseHeaderSize)) + (i << 2), f);
 					}
 				}
 			}
 
 		}
 
-		prevPrevObj = prevObj;
-		prevObj = objOop1;
-		objOop1 = objectAfterlimit(objOop1, GIV(endOfMemory));
+		prevPrevObj11 = prevObj11;
+		prevObj11 = objOop11;
+		objOop11 = objectAfterlimit(objOop11, GIV(endOfMemory));
 	}
 	
 	
 	lowestForwarder = lowestForwarder1;
-	/* begin sweepToCoallesceFreeSpaceAndRebuildFreeListsForPigCompactFrom: */
+	/* begin sweepToCoallesceFreeSpaceForPigCompactFrom: */
 	lowest = ((((lowestForwarder == 0
 	? GIV(endOfMemory)
 	: lowestForwarder)) < ((GIV(firstFreeChunk) == 0
@@ -24544,50 +24537,82 @@
 	: lowestForwarder)) : ((GIV(firstFreeChunk) == 0
 	? GIV(endOfMemory)
 	: GIV(firstFreeChunk))));
-	firstFree = (GIV(totalFreeOldSpace) = 0);
+	firstOfFreeRun = (prevPrevFree = (prevFree = 0));
 	/* begin allOldSpaceEntitiesFrom:do: */
 	prevPrevObj1 = (prevObj1 = null);
-	objOop2 = lowest;
+	objOop3 = lowest;
 	while (1) {
-		assert((objOop2 % (allocationUnit())) == 0);
-		if (!((((usqInt) objOop2)) < (((usqInt) GIV(endOfMemory))))) break;
-		assert((long64At(objOop2)) != 0);
-		if ((((longAt(objOop2)) & 0x3FFFFF) == 0)
-		 || (((longAt(objOop2)) & 0x3FFFFF) == 8)) {
-			if (firstFree == 0) {
-				firstFree = objOop2;
-				firstFreeStart = ((byteAt(objOop2 + 7)) == 0xFF
-					? objOop2 - (BaseHeaderSize)
-					: objOop2);
+		assert((objOop3 % (allocationUnit())) == 0);
+		if (!((((usqInt) objOop3)) < (((usqInt) GIV(endOfMemory))))) break;
+		assert((long64At(objOop3)) != 0);
+		if ((((longAt(objOop3)) & 0x3FFFFF) == 0)
+		 || (((longAt(objOop3)) & 0x3FFFFF) == 8)) {
+			if (firstOfFreeRun == 0) {
+				/* begin setObjectFree: */
+				if ((byteAt(objOop3 + 7)) == 0) {
+					/* begin setRawNumSlotsOf:to: */
+					flag("endian");
+					byteAtput(objOop3 + 7, 1);
+				}
+				/* begin setFree: */
+				long32Atput(objOop3, 0);
+				firstOfFreeRun = objOop3;
+				startOfFreeRun = ((byteAt(objOop3 + 7)) == 0xFF
+					? objOop3 - (BaseHeaderSize)
+					: objOop3);
 			}
-			lastFree = objOop2;
+			endOfFreeRun = objOop3;
 		}
 		else {
-			if (firstFree != 0) {
-				bytes = (addressAfter(lastFree)) - firstFreeStart;
-				/* begin addFreeChunkWithBytes:at: */
-				freeChunkWithBytesat(bytes, firstFreeStart);
-				GIV(totalFreeOldSpace) += bytes;
+			if (firstOfFreeRun != 0) {
+				bytes = (addressAfter(endOfFreeRun)) - startOfFreeRun;
+				firstOfFreeRun = initFreeChunkWithBytesat(bytes, startOfFreeRun);
+				/* begin inSortedFreeListLink:to:given: */
+				if (prevFree == 0) {
+					GIV(firstFreeChunk) = firstOfFreeRun;
+				}
+				else {
+					/* begin storePointer:ofFreeChunk:withUncheckedValue: */
+					assert(isFreeObject(prevFree));
+					longAtput((prevFree + (BaseHeaderSize)) + (0 << 2), prevPrevFree ^ firstOfFreeRun);
+				}
+				prevPrevFree = prevFree;
+				prevFree = firstOfFreeRun;
+				firstOfFreeRun = 0;
 			}
-			firstFree = 0;
 		}
 
 		prevPrevObj1 = prevObj1;
-		prevObj1 = objOop2;
-		objOop2 = objectAfterlimit(objOop2, GIV(endOfMemory));
+		prevObj1 = objOop3;
+		objOop3 = objectAfterlimit(objOop3, GIV(endOfMemory));
 	}
 	
 	
-	if (firstFree != 0) {
-		bytes = (addressAfter(lastFree)) - firstFreeStart;
-		/* begin addFreeChunkWithBytes:at: */
-		freeChunkWithBytesat(bytes, firstFreeStart);
-		GIV(totalFreeOldSpace) += bytes;
+	if (firstOfFreeRun != 0) {
+		bytes = (addressAfter(endOfFreeRun)) - startOfFreeRun;
+		firstOfFreeRun = initFreeChunkWithBytesat(bytes, startOfFreeRun);
+		/* begin inSortedFreeListLink:to:given: */
+		if (prevFree == 0) {
+			GIV(firstFreeChunk) = firstOfFreeRun;
+		}
+		else {
+			/* begin storePointer:ofFreeChunk:withUncheckedValue: */
+			assert(isFreeObject(prevFree));
+			longAtput((prevFree + (BaseHeaderSize)) + (0 << 2), prevPrevFree ^ firstOfFreeRun);
+		}
+		prevPrevFree = prevFree;
+		prevFree = firstOfFreeRun;
+		firstOfFreeRun = 0;
 	}
-	GIV(firstFreeChunk) = (GIV(lastFreeChunk) = 0);
-	/* begin checkFreeSpace */
-	assert(bitsSetInFreeSpaceMaskForAllFreeLists());
-	assert(GIV(totalFreeOldSpace) == (totalFreeListBytes()));
+	if (prevFree != GIV(firstFreeChunk)) {
+		/* begin storePointer:ofFreeChunk:withValue: */
+		assert(isFreeObject(prevFree));
+		assert((prevPrevFree == 0)
+		 || (isFreeObject(prevPrevFree)));
+		longAtput((prevFree + (BaseHeaderSize)) + (0 << 2), prevPrevFree);
+	}
+	GIV(lastFreeChunk) = prevFree;
+	null;
 	assert((numberOfForwarders()) == 0);
 }
 
@@ -30090,7 +30115,7 @@
 	   the need to test firstFreeChunk when filling highestObjects. */
 
 	GIV(firstFreeChunk) = (sortedFreeChunks = (lastLargeFree = 0));
-	/* begin allOldSpaceEntitiesForCoalescingDo: */
+	/* begin allOldSpaceEntitiesForCoalescingFrom:do: */
 	prevPrevObj = (prevObj = null);
 	objOop = GIV(nilObj);
 	while (1) {
@@ -30183,6 +30208,7 @@
 			}
 		}
 
+		flag("future work");
 		rawNumSlotsAfter = byteAt(objOop + 7);
 		if ((rawNumSlotsAfter != rawNumSlots)
 		 && (rawNumSlotsAfter == 0xFF)) {
@@ -30288,7 +30314,7 @@
 		GIV(freeLists)[i] = 0;
 	}
 	GIV(firstFreeChunk) = (prevPrevFree = (prevFree = 0));
-	/* begin allOldSpaceEntitiesForCoalescingDo: */
+	/* begin allOldSpaceEntitiesForCoalescingFrom:do: */
 	prevPrevObj = (prevObj = null);
 	objOop = GIV(nilObj);
 	while (1) {
@@ -30345,6 +30371,7 @@
 			prevFree = here;
 		}
 
+		flag("future work");
 		rawNumSlotsAfter = byteAt(objOop + 7);
 		if ((rawNumSlotsAfter != rawNumSlots)
 		 && (rawNumSlotsAfter == 0xFF)) {
@@ -30422,10 +30449,18 @@
 usqLong
 fullGC(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    usqInt bytes;
     sqInt cascade0;
     sqInt cascade01;
+    sqInt free;
+    sqInt freeObj;
     sqInt i;
     sqInt i1;
+    sqInt i2;
+    sqInt nextFree;
+    sqInt prevFree;
+    sqInt prevPrevFree;
+    sqInt start;
     sqInt traceType;
 
 	GIV(needGCFlag) = 0;
@@ -30480,9 +30515,6 @@
 		primTraceLogIndex(GIV(primTraceLogIndex) + 1);
 	}
 	/* begin globalGarbageCollect */
-	/* begin runLeakCheckerForFullGC: */
-	runLeakCheckerForFullGCexcludeUnmarkedNewSpaceObjsclassIndicesShouldBeValid(1, 0, 1);
-	/* return self */
 	assert(validObjStacks());
 	assert(isEmptyObjStack(GIV(markStack)));
 	assert(isEmptyObjStack(GIV(weaklingStack)));
@@ -30494,12 +30526,36 @@
 	freeUnmarkedObjectsAndSortAndCoalesceFreeSpaceForPigCompact();
 
 	runLeakCheckerForFullGCexcludeUnmarkedNewSpaceObjsclassIndicesShouldBeValid(1, 1, 1);
-	flag("future work");
-	compact();
-	/* begin eliminateAndFreeForwarders */
-	;

@@ Diff output truncated at 50000 characters. @@


More information about the Vm-dev mailing list