[Vm-dev] [commit][3038] CogVM source as per VMMaker.oscog-eem.811

commits at squeakvm.org commits at squeakvm.org
Wed Jul 9 19:14:39 UTC 2014


Revision: 3038
Author:   eliot
Date:     2014-07-09 12:14:36 -0700 (Wed, 09 Jul 2014)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.811

Spur:
Fix bug in old space GC processing of weaklings.  Old code didn't trace strong
references in weaklings to weaklings in markWeaklingsAndMarkAndFireEphemerons.
Make sure nilUnmarkedWeaklingSlotsIn: can be inlined.  Bug shows up as crashes
in Pharo Spur, Pharo making much more use of weakness than Squeak or Newspeak. 

Move the scanning for young references in scavenger processing of weaklings
into processWeakSurvivor:.

Fix minor slips in allObjects & allInstancesOf: which should only empty
weaklingStack if marking.

Fix a couple of storePointer:ofObject:'s being applied to objStacks.

Rename isReallyForwarded: to isUnambiguouslyForwarder: and add an assert to
isForwarded: to catch accidental applications to free objects.

Fix longPrintOop: for free referents.

Slang:
Assign complex expressions to loop variables in value: expansions.  Old code
would replace variable with expansion of actual parameter everywhere.

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/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/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-07-09 01:16:16 UTC (rev 3037)
+++ branches/Cog/nscogsrc/vm/cogit.c	2014-07-09 19:14:36 UTC (rev 3038)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.808 uuid: 84bdf081-a2e8-4c84-b249-b140228e6636
+	CCodeGenerator VMMaker.oscog-eem.811 uuid: 96eb7a61-d68a-4114-8c1a-c0a7fad3232e
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.808 uuid: 84bdf081-a2e8-4c84-b249-b140228e6636
+	StackToRegisterMappingCogit VMMaker.oscog-eem.811 uuid: 96eb7a61-d68a-4114-8c1a-c0a7fad3232e
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.808 uuid: 84bdf081-a2e8-4c84-b249-b140228e6636 " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.811 uuid: 96eb7a61-d68a-4114-8c1a-c0a7fad3232e " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -10184,7 +10184,8 @@
 	machinery can distinguish normal and super sends (super sends bind to the
 	noCheckEntry). In Newspeak we also need to distinguish dynSuperSends from
 	normal and super
-	and so bind a the preceeding nop (on x86 there happens to be one anyway). */
+	and so on Nespeak, bind the dynSuperEntry to the preceeding nop (on x86
+	there happens to be one anyway). */
 
 static void
 compileEntry(void)
@@ -11270,10 +11271,12 @@
 static void
 generateNewspeakRuntime(void)
 {
+    sqInt destReg;
     AbstractInstruction *jumpItsTheReceiverStupid;
     AbstractInstruction *jumpMiss;
     sqInt offset;
     sqInt offset1;
+    sqInt retpcReg;
 
 
 	/* Generate the non-send runtime support for Newspeak, explicit outer and implicit receiver.
@@ -11298,17 +11301,21 @@
 	genoperandoperandoperand(MoveMwrR, FoxMFReceiver, FPReg, ReceiverResultReg);
 	genGetInlineCacheClassTagFromintoforEntry(ReceiverResultReg, ClassReg, 0);
 	/* begin MoveMw:r:R: */
-	genoperandoperandoperand(MoveMwrR, 0, SPReg, TempReg);
+	destReg = (retpcReg = TempReg);
+	genoperandoperandoperand(MoveMwrR, 0, SPReg, destReg);
+
 	/* begin MoveMw:r:R: */
+	genoperandoperandoperand(MoveMwrR, 0, SPReg, retpcReg);
+	/* begin MoveMw:r:R: */
 	offset = jumpShortByteSize(backEnd);
-	genoperandoperandoperand(MoveMwrR, offset, TempReg, Arg1Reg);
+	genoperandoperandoperand(MoveMwrR, offset, retpcReg, Arg1Reg);
 	/* begin CmpR:R: */
 	genoperandoperand(CmpRR, ClassReg, Arg1Reg);
 	/* begin JumpNonZero: */
 	jumpMiss = genoperand(JumpNonZero, ((sqInt)0));
 	/* begin MoveMw:r:R: */
 	offset1 = (jumpShortByteSize(backEnd)) + BytesPerOop;
-	genoperandoperandoperand(MoveMwrR, offset1, TempReg, ClassReg);
+	genoperandoperandoperand(MoveMwrR, offset1, retpcReg, ClassReg);
 	/* begin CmpCq:R: */
 	genoperandoperand(CmpCqR, 0, ClassReg);
 	/* begin JumpZero: */

Modified: branches/Cog/nscogsrc/vm/cogit.h
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.h	2014-07-09 01:16:16 UTC (rev 3037)
+++ branches/Cog/nscogsrc/vm/cogit.h	2014-07-09 19:14:36 UTC (rev 3038)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.808 uuid: 84bdf081-a2e8-4c84-b249-b140228e6636
+	CCodeGenerator VMMaker.oscog-eem.811 uuid: 96eb7a61-d68a-4114-8c1a-c0a7fad3232e
  */
 
 

Modified: branches/Cog/nscogsrc/vm/cogmethod.h
===================================================================
--- branches/Cog/nscogsrc/vm/cogmethod.h	2014-07-09 01:16:16 UTC (rev 3037)
+++ branches/Cog/nscogsrc/vm/cogmethod.h	2014-07-09 19:14:36 UTC (rev 3038)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.808 uuid: 84bdf081-a2e8-4c84-b249-b140228e6636
+	CCodeGenerator VMMaker.oscog-eem.811 uuid: 96eb7a61-d68a-4114-8c1a-c0a7fad3232e
  */
 
 typedef struct {

Modified: branches/Cog/nscogsrc/vm/cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.c	2014-07-09 01:16:16 UTC (rev 3037)
+++ branches/Cog/nscogsrc/vm/cointerp.c	2014-07-09 19:14:36 UTC (rev 3038)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.808 uuid: 84bdf081-a2e8-4c84-b249-b140228e6636
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.811 uuid: 96eb7a61-d68a-4114-8c1a-c0a7fad3232e
    from
-	CoInterpreter VMMaker.oscog-eem.808 uuid: 84bdf081-a2e8-4c84-b249-b140228e6636
+	CoInterpreter VMMaker.oscog-eem.811 uuid: 96eb7a61-d68a-4114-8c1a-c0a7fad3232e
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.808 uuid: 84bdf081-a2e8-4c84-b249-b140228e6636 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.811 uuid: 96eb7a61-d68a-4114-8c1a-c0a7fad3232e " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -2066,7 +2066,7 @@
 	/* 574 */ (void (*)(void))0,
 	/* 575 */ (void (*)(void))0,
  0 };
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.808";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.811";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
@@ -49435,6 +49435,10 @@
 							: whereIs(oop1)));
 						goto l4;
 					}
+					if (((longAt(oop1)) & TypeMask) == HeaderTypeFree) {
+						print(" is a free chunk");
+						goto l4;
+					}
 					
 					if (((oop1 & 1) == 0)
 					 && (ClassFloatCompactIndex == ((((usqInt) (longAt(oop1))) >> (compactClassFieldLSB())) & 0x1F))) {
@@ -49695,6 +49699,10 @@
 			: whereIs(oop)));
 		goto l2;
 	}
+	if (((longAt(oop)) & TypeMask) == HeaderTypeFree) {
+		print(" is a free chunk");
+		goto l2;
+	}
 	
 	if (((oop & 1) == 0)
 	 && (ClassFloatCompactIndex == ((((usqInt) (longAt(oop))) >> (compactClassFieldLSB())) & 0x1F))) {
@@ -52896,7 +52904,7 @@
 	index = longAt(GIV(stackPointer) + (1 * BytesPerWord));
 	aContext = longAt(GIV(stackPointer) + (2 * BytesPerWord));
 	if (!((index & 1))) {
-		(GIV(primFailCode) = PrimErrBadArgument);
+		GIV(primFailCode) = PrimErrBadArgument;
 		return;
 	}
 	hdr = longAt(aContext);
@@ -53016,11 +53024,11 @@
 		}
 		value;
 	l7:	/* end stObject:at:put: */;
-		(!GIV(primFailCode)
-			? (/* begin pop:thenPush: */
-				longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value),
-				(GIV(stackPointer) = sp))
-			: 0);
+		if (!GIV(primFailCode)) {
+			/* begin pop:thenPush: */
+			longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
+			GIV(stackPointer) = sp;
+		}
 		return;
 	}
 	/* begin externalWriteBackHeadFramePointers */
@@ -53080,7 +53088,7 @@
 		stSize = (sp1 >> 1);
 	l2:	/* end fetchStackPointerOf: */;
 		if (!(((index >= 1) && (index <= stSize)))) {
-			(GIV(primFailCode) = PrimErrBadIndex);
+			GIV(primFailCode) = PrimErrBadIndex;
 			return;
 		}
 		/* begin subscript:with:storing:format: */
@@ -53126,7 +53134,7 @@
 	assert((senderOop & 1));
 	spouseFP = pointerForOop(senderOop - 1);
 	if (!(((index >= 1) && (index <= (stackPointerIndexForFrame(spouseFP)))))) {
-		(GIV(primFailCode) = PrimErrBadIndex);
+		GIV(primFailCode) = PrimErrBadIndex;
 		return;
 	}
 	if ((((usqInt)(longAt(spouseFP + FoxMethod)))) < (startOfMemory())) {

Modified: branches/Cog/nscogsrc/vm/cointerp.h
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.h	2014-07-09 01:16:16 UTC (rev 3037)
+++ branches/Cog/nscogsrc/vm/cointerp.h	2014-07-09 19:14:36 UTC (rev 3038)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.808 uuid: 84bdf081-a2e8-4c84-b249-b140228e6636
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.811 uuid: 96eb7a61-d68a-4114-8c1a-c0a7fad3232e
  */
 
 

Modified: branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2014-07-09 01:16:16 UTC (rev 3037)
+++ branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2014-07-09 19:14:36 UTC (rev 3038)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.808 uuid: 84bdf081-a2e8-4c84-b249-b140228e6636
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.811 uuid: 96eb7a61-d68a-4114-8c1a-c0a7fad3232e
    from
-	CoInterpreter VMMaker.oscog-eem.808 uuid: 84bdf081-a2e8-4c84-b249-b140228e6636
+	CoInterpreter VMMaker.oscog-eem.811 uuid: 96eb7a61-d68a-4114-8c1a-c0a7fad3232e
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.808 uuid: 84bdf081-a2e8-4c84-b249-b140228e6636 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.811 uuid: 96eb7a61-d68a-4114-8c1a-c0a7fad3232e " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -2069,7 +2069,7 @@
 	/* 574 */ (void (*)(void))0,
 	/* 575 */ (void (*)(void))0,
  0 };
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.808";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.811";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
@@ -49444,6 +49444,10 @@
 							: whereIs(oop1)));
 						goto l4;
 					}
+					if (((longAt(oop1)) & TypeMask) == HeaderTypeFree) {
+						print(" is a free chunk");
+						goto l4;
+					}
 					
 					if (((oop1 & 1) == 0)
 					 && (ClassFloatCompactIndex == ((((usqInt) (longAt(oop1))) >> (compactClassFieldLSB())) & 0x1F))) {
@@ -49704,6 +49708,10 @@
 			: whereIs(oop)));
 		goto l2;
 	}
+	if (((longAt(oop)) & TypeMask) == HeaderTypeFree) {
+		print(" is a free chunk");
+		goto l2;
+	}
 	
 	if (((oop & 1) == 0)
 	 && (ClassFloatCompactIndex == ((((usqInt) (longAt(oop))) >> (compactClassFieldLSB())) & 0x1F))) {
@@ -52905,7 +52913,7 @@
 	index = longAt(GIV(stackPointer) + (1 * BytesPerWord));
 	aContext = longAt(GIV(stackPointer) + (2 * BytesPerWord));
 	if (!((index & 1))) {
-		(GIV(primFailCode) = PrimErrBadArgument);
+		GIV(primFailCode) = PrimErrBadArgument;
 		return;
 	}
 	hdr = longAt(aContext);
@@ -53025,11 +53033,11 @@
 		}
 		value;
 	l7:	/* end stObject:at:put: */;
-		(!GIV(primFailCode)
-			? (/* begin pop:thenPush: */
-				longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value),
-				(GIV(stackPointer) = sp))
-			: 0);
+		if (!GIV(primFailCode)) {
+			/* begin pop:thenPush: */
+			longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
+			GIV(stackPointer) = sp;
+		}
 		return;
 	}
 	/* begin externalWriteBackHeadFramePointers */
@@ -53089,7 +53097,7 @@
 		stSize = (sp1 >> 1);
 	l2:	/* end fetchStackPointerOf: */;
 		if (!(((index >= 1) && (index <= stSize)))) {
-			(GIV(primFailCode) = PrimErrBadIndex);
+			GIV(primFailCode) = PrimErrBadIndex;
 			return;
 		}
 		/* begin subscript:with:storing:format: */
@@ -53135,7 +53143,7 @@
 	assert((senderOop & 1));
 	spouseFP = pointerForOop(senderOop - 1);
 	if (!(((index >= 1) && (index <= (stackPointerIndexForFrame(spouseFP)))))) {
-		(GIV(primFailCode) = PrimErrBadIndex);
+		GIV(primFailCode) = PrimErrBadIndex;
 		return;
 	}
 	if ((((usqInt)(longAt(spouseFP + FoxMethod)))) < (startOfMemory())) {

Modified: branches/Cog/nscogsrc/vm/interp.h
===================================================================
--- branches/Cog/nscogsrc/vm/interp.h	2014-07-09 01:16:16 UTC (rev 3037)
+++ branches/Cog/nscogsrc/vm/interp.h	2014-07-09 19:14:36 UTC (rev 3038)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.808 uuid: 84bdf081-a2e8-4c84-b249-b140228e6636
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.811 uuid: 96eb7a61-d68a-4114-8c1a-c0a7fad3232e
  */
 
 #define VM_PROXY_MAJOR 1

Modified: branches/Cog/nscogsrc/vm/vmCallback.h
===================================================================
--- branches/Cog/nscogsrc/vm/vmCallback.h	2014-07-09 01:16:16 UTC (rev 3037)
+++ branches/Cog/nscogsrc/vm/vmCallback.h	2014-07-09 19:14:36 UTC (rev 3038)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.808 uuid: 84bdf081-a2e8-4c84-b249-b140228e6636
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.811 uuid: 96eb7a61-d68a-4114-8c1a-c0a7fad3232e
  */
 
 #define VM_CALLBACK_INC 1

Modified: branches/Cog/nsspursrc/vm/cointerp.c
===================================================================
--- branches/Cog/nsspursrc/vm/cointerp.c	2014-07-09 01:16:16 UTC (rev 3037)
+++ branches/Cog/nsspursrc/vm/cointerp.c	2014-07-09 19:14:36 UTC (rev 3038)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.810 uuid: a10a6172-0f6e-47a1-be39-cffd498c9661
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.811 uuid: 96eb7a61-d68a-4114-8c1a-c0a7fad3232e
    from
-	CoInterpreter VMMaker.oscog-eem.810 uuid: a10a6172-0f6e-47a1-be39-cffd498c9661
+	CoInterpreter VMMaker.oscog-eem.811 uuid: 96eb7a61-d68a-4114-8c1a-c0a7fad3232e
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.810 uuid: a10a6172-0f6e-47a1-be39-cffd498c9661 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.811 uuid: 96eb7a61-d68a-4114-8c1a-c0a7fad3232e " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -818,13 +818,14 @@
 static sqInt copyAndForward(sqInt survivor) NoDbgRegParms;
 static sqInt firstCorpse(sqInt headOfCorpseList) NoDbgRegParms;
 static sqInt isInRememberedSet(sqInt objOop) NoDbgRegParms;
+static sqInt isMaybeOldScavengeSurvivor(sqInt oop) NoDbgRegParms;
 static sqInt isScavengeSurvivor(sqInt oop) NoDbgRegParms;
 static sqInt isonWeaklingList(sqInt oop, sqInt listHead) NoDbgRegParms;
 static usqInt newSpaceCapacity(void);
 static sqInt noUnfiredEphemeronsAtEndOfRememberedSet(void);
 static void processEphemerons(void);
 static void processWeaklings(void);
-static void processWeakSurvivor(sqInt weakObj) NoDbgRegParms;
+static sqInt processWeakSurvivor(sqInt weakObj) NoDbgRegParms;
 static void remember(sqInt objOop) NoDbgRegParms;
 static void scavengeFutureSurvivorSpaceStartingAt(sqInt initialAddress) NoDbgRegParms;
 static void scavengeLoop(void);
@@ -845,6 +846,7 @@
 static sqInt allocateNewSpaceSlotsformatclassIndex(sqInt numSlots, sqInt formatField, sqInt classIndex) NoDbgRegParms;
 static sqInt allocateOldSpaceChunkOfBytes(usqInt chunkBytes) NoDbgRegParms;
 static sqInt allocationUnit(void);
+static sqInt allStrongSlotsOfWeaklingAreMarked(sqInt aWeakling) NoDbgRegParms;
 static sqInt allUnscannedEphemeronsAreActive(void);
 static sqInt arrayClassIndexPun(void);
 sqInt arrayFormat(void);
@@ -963,7 +965,6 @@
 static float getHeapGrowthToSizeGCRatio(void);
 static sqInt goodContextSize(sqInt oop) NoDbgRegParms;
 static usqInt growOldSpaceByAtLeast(sqInt minAmmount) NoDbgRegParms;
-static sqInt hasYoungReferents(sqInt objOop) NoDbgRegParms;
 usqLong headerForSlotsformatclassIndex(sqInt numSlots, sqInt formatField, sqInt classIndex);
 static sqInt hiddenRootSlots(void);
 sqInt identityHashHalfWordMask(void);
@@ -1010,11 +1011,11 @@
 sqInt isOopMutable(sqInt oop);
 sqInt isPinned(sqInt objOop);
 sqInt isPointers(sqInt oop);
-sqInt isReallyForwarded(sqInt objOop);
 sqInt isReallyYoung(sqInt oop);
 static sqInt isRemembered(sqInt objOop) NoDbgRegParms;
 static sqInt isSegmentBridge(sqInt objOop) NoDbgRegParms;
 static sqInt isSemaphoreOop(sqInt anOop) NoDbgRegParms;
+sqInt isUnambiguouslyForwarder(sqInt objOop);
 static sqInt isValidFreeObject(sqInt objOop) NoDbgRegParms;
 static sqInt isValidObjStackAt(sqInt objStackRootIndex) NoDbgRegParms;
 static sqInt isValidObjStackPagemyIndex(sqInt objStackPage, sqInt myx) NoDbgRegParms;
@@ -1056,7 +1057,6 @@
 sqInt nextInSortedFreeListLinkgiven(sqInt freeChunk, sqInt prevFree);
 sqInt nilObject(void);
 static void nilUnmarkedWeaklingSlots(void);
-static sqInt nilUnmarkedWeaklingSlotsIn(sqInt aWeakling) NoDbgRegParms;
 static sqInt noCheckPushonObjStack(sqInt objOop, sqInt objStack) NoDbgRegParms;
 sqInt nonIndexablePointerFormat(void);
 static sqInt noUnscannedEphemerons(void);
@@ -1110,6 +1110,7 @@
 sqInt shouldRemapOop(sqInt oop);
 static sqInt sixtyFourBitIndexableFormat(void);
 static usqInt sizeOfFree(sqInt objOop) NoDbgRegParms;
+static sqInt sizeOfObjStack(sqInt objStack) NoDbgRegParms;
 sqInt slotSizeOf(sqInt oop);
 sqInt splObj(sqInt index);
 static sqInt startOfObject(sqInt objOop) NoDbgRegParms;
@@ -1482,8 +1483,8 @@
 _iss usqInt instructionPointer;
 _iss usqInt newMethod;
 _iss sqInt messageSelector;
+_iss StackPage * pages;
 _iss usqInt newSpaceLimit;
-_iss StackPage * pages;
 _iss char * stackBasePlus1;
 _iss sqInt hiddenRootsObj;
 _iss usqInt endOfMemory;
@@ -1506,12 +1507,12 @@
 _iss usqInt firstFreeChunk;
 _iss unsigned char primTraceLogIndex;
 _iss StackPage * mostRecentlyUsedPage;
+_iss sqInt weaklingStack;
 _iss sqInt numStackPages;
 _iss SpurNewSpaceSpace pastSpace;
 _iss usqInt newSpaceStart;
 _iss usqInt oldSpaceStart;
 _iss sqInt classTableFirstPage;
-_iss sqInt weaklingStack;
 _iss sqInt markStack;
 _iss sqInt profileProcess;
 _iss SpurNewSpaceSpace futureSpace;
@@ -1581,6 +1582,7 @@
 _iss usqLong statProcessSwitch;
 _iss usqLong statStackOverflow;
 _iss usqLong statStackPageDivorce;
+_iss sqInt tenureCriterion;
 _iss sqInt extraFramesToMoveOnOverflow;
 _iss sqInt globalSessionID;
 _iss float heapGrowthToSizeGCRatio;
@@ -1595,7 +1597,6 @@
 _iss usqLong statScavengeGCUsecs;
 _iss sqInt statScavenges;
 _iss sqInt statTenures;
-_iss sqInt tenureCriterion;
 _iss sqInt canSwizzle;
 _iss sqInt deferSmash;
 _iss sqInt deferredSmash;
@@ -2285,7 +2286,7 @@
 /*540*/	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
 /*560*/	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0,-1,-1
 	};
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.810";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.811";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
@@ -3519,9 +3520,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 4 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -3558,9 +3559,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 8 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -3597,9 +3598,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 12 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -3636,9 +3637,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 16 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -3675,9 +3676,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 20 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -3714,9 +3715,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 24 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -3753,9 +3754,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 28 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -3792,9 +3793,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 32 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -3831,9 +3832,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 36 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -3870,9 +3871,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 40 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -3909,9 +3910,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 44 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -3948,9 +3949,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 48 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -3987,9 +3988,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 52 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -4026,9 +4027,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 56 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -4065,9 +4066,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 60 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -4104,9 +4105,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 64 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -4142,9 +4143,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 68 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -4180,9 +4181,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 72 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -4218,9 +4219,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 76 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -4256,9 +4257,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 80 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -4294,9 +4295,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 84 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -4332,9 +4333,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 88 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -4370,9 +4371,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 92 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -4408,9 +4409,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 96 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -4446,9 +4447,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 100 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -4484,9 +4485,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 104 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -4522,9 +4523,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 108 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -4560,9 +4561,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 112 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -4598,9 +4599,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 116 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -4636,9 +4637,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 120 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -4674,9 +4675,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 0x7C /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -4712,9 +4713,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + 128 /* ((currentBytecode bitAnd: 31) + LiteralStart) << 2 */);
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -5755,9 +5756,9 @@
 					/* begin literal: */
 					assert(GIV(method) == (iframeMethod(localFP)));
 					litVar = longAt((GIV(method) + (BaseHeaderSize)) + ((variableIndex + LiteralStart) << 2));
-					if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+					if (isForwarded(litVar)) {
 						/* begin followForwarded: */
-						assert(isReallyForwarded(litVar));
+						assert(isUnambiguouslyForwarder(litVar));
 						referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 						while (((referent & 3) == 0)
 						 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -5828,9 +5829,9 @@
 					/* begin literal: */
 					assert(GIV(method) == (iframeMethod(localFP)));
 					litVar = longAt((GIV(method) + (BaseHeaderSize)) + ((variableIndex + LiteralStart) << 2));
-					if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+					if (isForwarded(litVar)) {
 						/* begin followForwarded: */
-						assert(isReallyForwarded(litVar));
+						assert(isUnambiguouslyForwarder(litVar));
 						referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 						while (((referent & 3) == 0)
 						 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -5919,9 +5920,9 @@
 					/* begin literal: */
 					assert(GIV(method) == (iframeMethod(localFP)));
 					litVar = longAt((GIV(method) + (BaseHeaderSize)) + ((variableIndex + LiteralStart) << 2));
-					if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+					if (isForwarded(litVar)) {
 						/* begin followForwarded: */
-						assert(isReallyForwarded(litVar));
+						assert(isUnambiguouslyForwarder(litVar));
 						referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 						while (((referent & 3) == 0)
 						 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -6674,9 +6675,9 @@
 					/* begin literal: */
 					assert(GIV(method) == (iframeMethod(localFP)));
 					litVar1 = longAt((GIV(method) + (BaseHeaderSize)) + ((byte3 + LiteralStart) << 2));
-					if (((longAt(litVar1)) & (0x3FFFFF - 8)) == 0) {
+					if (isForwarded(litVar1)) {
 						/* begin followForwarded: */
-						assert(isReallyForwarded(litVar1));
+						assert(isUnambiguouslyForwarder(litVar1));
 						referent1 = longAt((litVar1 + (BaseHeaderSize)) + (0 << 2));
 						while (((referent1 & 3) == 0)
 						 && (((longAt(referent1)) & 0x3FFFFF) == 8)) {
@@ -6692,13 +6693,12 @@
 				top = longAtPointer(localSP);
 				if (opType == 7) {
 					/* begin storeLiteralVariable:withValue: */
-					VM_LABEL(2storeLiteralVariablewithValue);
 					/* begin literal: */
 					assert(GIV(method) == (iframeMethod(localFP)));
 					litVar = longAt((GIV(method) + (BaseHeaderSize)) + ((byte3 + LiteralStart) << 2));
-					if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+					if (isForwarded(litVar)) {
 						/* begin followForwarded: */
-						assert(isReallyForwarded(litVar));
+						assert(isUnambiguouslyForwarder(litVar));
 						referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 						while (((referent & 3) == 0)
 						 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -6707,6 +6707,7 @@
 						litVar = referent;
 					}
 					/* begin storePointer:ofObject:withValue: */
+					VM_LABEL(2storePointerofObjectwithValue);
 					assert(!(isForwarded(litVar)));
 					if (isOldObject(litVar)) {
 
@@ -6754,7 +6755,7 @@
 					if (!((((longAt((rcvr1 + (BaseHeaderSize)) + (SenderIndex << 2))) & 1))
 						 && (!(isWidowedContext(rcvr1))))) {
 						/* begin storePointer:ofObject:withValue: */
-						VM_LABEL(2storePointerofObjectwithValue);
+						VM_LABEL(3storePointerofObjectwithValue);
 						assert(!(isForwarded(rcvr1)));
 						if (isOldObject(rcvr1)) {
 
@@ -6810,7 +6811,7 @@
 					GIV(framePointer) = localFP;
 					externalDivorceFrameandContext(theFP, rcvr1);
 					/* begin storePointer:ofObject:withValue: */
-					VM_LABEL(3storePointerofObjectwithValue);
+					VM_LABEL(4storePointerofObjectwithValue);
 					assert(!(isForwarded(rcvr1)));
 					if (isOldObject(rcvr1)) {
 
@@ -7133,7 +7134,7 @@
 					? longAt((localFP + FoxCallerSavedIP) + ((frameNumArgs - tempVectorIndex) * BytesPerWord))
 					: longAt(((localFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs - tempVectorIndex) * BytesPerWord)));
 				/* begin storePointer:ofObject:withValue: */
-				VM_LABEL(4storePointerofObjectwithValue);
+				VM_LABEL(5storePointerofObjectwithValue);
 				assert(!(isForwarded(tempVector)));
 				if (isOldObject(tempVector)) {
 
@@ -7175,7 +7176,7 @@
 					? longAt((localFP + FoxCallerSavedIP) + ((frameNumArgs - tempVectorIndex) * BytesPerWord))
 					: longAt(((localFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs - tempVectorIndex) * BytesPerWord)));
 				/* begin storePointer:ofObject:withValue: */
-				VM_LABEL(5storePointerofObjectwithValue);
+				VM_LABEL(6storePointerofObjectwithValue);
 				assert(!(isForwarded(tempVector)));
 				if (isOldObject(tempVector)) {
 
@@ -9089,7 +9090,7 @@
 						longAtput((pointResult1 + (BaseHeaderSize)) + (YIndex << 2), ((0 << 1) | 1));
 						pt = pointResult1;
 						/* begin storePointer:ofObject:withValue: */
-						VM_LABEL(6storePointerofObjectwithValue);
+						VM_LABEL(7storePointerofObjectwithValue);
 						assert(!(isForwarded(pt)));
 						if (isOldObject(pt)) {
 
@@ -9179,7 +9180,7 @@
 					longAtput((pointResult2 + (BaseHeaderSize)) + (YIndex << 2), ((0 << 1) | 1));
 					pt = pointResult2;
 					/* begin storePointer:ofObject:withValue: */
-					VM_LABEL(7storePointerofObjectwithValue);
+					VM_LABEL(8storePointerofObjectwithValue);
 					assert(!(isForwarded(pt)));
 					if (isOldObject(pt)) {
 
@@ -9198,7 +9199,7 @@
 					}
 					longAtput((pt + (BaseHeaderSize)) + (0 << 2), longAt(GIV(stackPointer) + (1 * BytesPerWord)));
 					/* begin storePointer:ofObject:withValue: */
-					VM_LABEL(8storePointerofObjectwithValue);
+					VM_LABEL(9storePointerofObjectwithValue);
 					assert(!(isForwarded(pt)));
 					if (isOldObject(pt)) {
 
@@ -9952,7 +9953,7 @@
 								assert(!(isContextNonImm(rcvr)));
 								fixedFields2 = GIV(atCache)[atIx + AtCacheFixedFields];
 								/* begin storePointer:ofObject:withValue: */
-								VM_LABEL(9storePointerofObjectwithValue);
+								VM_LABEL(10storePointerofObjectwithValue);
 								assert(!(isForwarded(rcvr)));
 								if (isOldObject(rcvr)) {
 
@@ -12129,7 +12130,7 @@
 						longAtput((pointResult1 + (BaseHeaderSize)) + (YIndex << 2), ((0 << 1) | 1));
 						pt = pointResult1;
 						/* begin storePointer:ofObject:withValue: */
-						VM_LABEL(10storePointerofObjectwithValue);
+						VM_LABEL(11storePointerofObjectwithValue);
 						assert(!(isForwarded(pt)));
 						if (isOldObject(pt)) {
 
@@ -12219,7 +12220,7 @@
 					longAtput((pointResult2 + (BaseHeaderSize)) + (YIndex << 2), ((0 << 1) | 1));
 					pt = pointResult2;
 					/* begin storePointer:ofObject:withValue: */
-					VM_LABEL(11storePointerofObjectwithValue);
+					VM_LABEL(12storePointerofObjectwithValue);
 					assert(!(isForwarded(pt)));
 					if (isOldObject(pt)) {
 
@@ -12238,7 +12239,7 @@
 					}
 					longAtput((pt + (BaseHeaderSize)) + (0 << 2), longAt(GIV(stackPointer) + (1 * BytesPerWord)));
 					/* begin storePointer:ofObject:withValue: */
-					VM_LABEL(12storePointerofObjectwithValue);
+					VM_LABEL(13storePointerofObjectwithValue);
 					assert(!(isForwarded(pt)));
 					if (isOldObject(pt)) {
 
@@ -12992,7 +12993,7 @@
 								assert(!(isContextNonImm(rcvr)));
 								fixedFields2 = GIV(atCache)[atIx + AtCacheFixedFields];
 								/* begin storePointer:ofObject:withValue: */
-								VM_LABEL(13storePointerofObjectwithValue);
+								VM_LABEL(14storePointerofObjectwithValue);
 								assert(!(isForwarded(rcvr)));
 								if (isOldObject(rcvr)) {
 
@@ -13981,9 +13982,9 @@
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + ((index + LiteralStart) << 2));
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -14168,7 +14169,7 @@
 					if (!((((longAt((rcvr + (BaseHeaderSize)) + (SenderIndex << 2))) & 1))
 						 && (!(isWidowedContext(rcvr))))) {
 						/* begin storePointer:ofObject:withValue: */
-						VM_LABEL(14storePointerofObjectwithValue);
+						VM_LABEL(15storePointerofObjectwithValue);
 						assert(!(isForwarded(rcvr)));
 						if (isOldObject(rcvr)) {
 
@@ -14224,7 +14225,7 @@
 					GIV(framePointer) = localFP;
 					externalDivorceFrameandContext(theFP, rcvr);
 					/* begin storePointer:ofObject:withValue: */
-					VM_LABEL(15storePointerofObjectwithValue);
+					VM_LABEL(16storePointerofObjectwithValue);
 					assert(!(isForwarded(rcvr)));
 					if (isOldObject(rcvr)) {
 
@@ -14290,13 +14291,12 @@
 
 				extA = 0;
 				/* begin storeLiteralVariable:withValue: */
-				VM_LABEL(3storeLiteralVariablewithValue);
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + ((variableIndex + LiteralStart) << 2));
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -14305,6 +14305,7 @@
 					litVar = referent;
 				}
 				/* begin storePointer:ofObject:withValue: */
+				VM_LABEL(17storePointerofObjectwithValue);
 				assert(!(isForwarded(litVar)));
 				if (isOldObject(litVar)) {
 
@@ -14387,7 +14388,7 @@
 					if (!((((longAt((rcvr + (BaseHeaderSize)) + (SenderIndex << 2))) & 1))
 						 && (!(isWidowedContext(rcvr))))) {
 						/* begin storePointer:ofObject:withValue: */
-						VM_LABEL(16storePointerofObjectwithValue);
+						VM_LABEL(18storePointerofObjectwithValue);
 						assert(!(isForwarded(rcvr)));
 						if (isOldObject(rcvr)) {
 
@@ -14443,7 +14444,7 @@
 					GIV(framePointer) = localFP;
 					externalDivorceFrameandContext(theFP, rcvr);
 					/* begin storePointer:ofObject:withValue: */
-					VM_LABEL(17storePointerofObjectwithValue);
+					VM_LABEL(19storePointerofObjectwithValue);
 					assert(!(isForwarded(rcvr)));
 					if (isOldObject(rcvr)) {
 
@@ -14506,19 +14507,19 @@
 
 				VM_LABEL(0extStoreAndPopLiteralVariableBytecode);
 				/* begin extStoreLiteralVariableBytecode */
+				VM_LABEL(1extStoreLiteralVariableBytecode);
 				variableIndex = (byteAtPointer(++localIP)) + (extA << 8);
 				/* begin fetchNextBytecode */
 				currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
 				extA = 0;
 				/* begin storeLiteralVariable:withValue: */
-				VM_LABEL(4storeLiteralVariablewithValue);
 				/* begin literal: */
 				assert(GIV(method) == (iframeMethod(localFP)));
 				litVar = longAt((GIV(method) + (BaseHeaderSize)) + ((variableIndex + LiteralStart) << 2));
-				if (((longAt(litVar)) & (0x3FFFFF - 8)) == 0) {
+				if (isForwarded(litVar)) {
 					/* begin followForwarded: */
-					assert(isReallyForwarded(litVar));
+					assert(isUnambiguouslyForwarder(litVar));
 					referent = longAt((litVar + (BaseHeaderSize)) + (0 << 2));
 					while (((referent & 3) == 0)
 					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -14527,6 +14528,7 @@
 					litVar = referent;
 				}
 				/* begin storePointer:ofObject:withValue: */
+				VM_LABEL(20storePointerofObjectwithValue);
 				assert(!(isForwarded(litVar)));
 				if (isOldObject(litVar)) {
 
@@ -18660,10 +18662,10 @@
     char *theSP;
 
 	if (theBecomeEffectsFlags & BecameCompiledMethodFlag) {
-		if (((longAt(GIV(method))) & (0x3FFFFF - 8)) == 0) {
+		if (isForwarded(GIV(method))) {
 			theIPPtr = GIV(instructionPointer) - GIV(method);
 			/* begin followForwarded: */
-			assert(isReallyForwarded(GIV(method)));
+			assert(isUnambiguouslyForwarder(GIV(method)));
 			referent = longAt((GIV(method) + (BaseHeaderSize)) + (0 << 2));
 			while (((referent & 3) == 0)
 			 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -18672,9 +18674,9 @@
 			GIV(method) = ((sqInt) referent);
 			GIV(instructionPointer) = GIV(method) + theIPPtr;
 		}
-		if (((longAt(GIV(newMethod))) & (0x3FFFFF - 8)) == 0) {
+		if (isForwarded(GIV(newMethod))) {
 			/* begin followForwarded: */
-			assert(isReallyForwarded(GIV(newMethod)));
+			assert(isUnambiguouslyForwarder(GIV(newMethod)));
 			referent1 = longAt((GIV(newMethod) + (BaseHeaderSize)) + (0 << 2));
 			while (((referent1 & 3) == 0)
 			 && (((longAt(referent1)) & 0x3FFFFF) == 8)) {
@@ -18717,7 +18719,7 @@
 				if ((((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory())
 					? ((longAt(theFP + FoxMethod)) & MFMethodFlagHasContextFlag) != 0
 					: (byteAt((theFP + FoxIFrameFlags) + 2)) != 0))
-				 && (((longAt(longAt(theFP + FoxThisContext))) & (0x3FFFFF - 8)) == 0)) {
+				 && (isForwarded(longAt(theFP + FoxThisContext)))) {
 					longAtput(theFP + FoxThisContext, followForwarded(longAt(theFP + FoxThisContext)));
 				}
 				if ((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory())) {
@@ -18736,9 +18738,9 @@
 						longAtput(theFP + FoxIFReceiver, followForwarded(oop));
 					}
 					oop = longAt(theFP + FoxMethod);
-					if (((longAt(oop)) & (0x3FFFFF - 8)) == 0) {
+					if (isForwarded(oop)) {
 						/* begin followForwarded: */
-						assert(isReallyForwarded(oop));
+						assert(isUnambiguouslyForwarder(oop));
 						referent2 = longAt((oop + (BaseHeaderSize)) + (0 << 2));
 						while (((referent2 & 3) == 0)
 						 && (((longAt(referent2)) & 0x3FFFFF) == 8)) {
@@ -18997,7 +18999,7 @@
 	rcvrStackIndex = GIV(argumentCount) + stackDelta;
 	assert((stackValue(rcvrStackIndex)) == forwardedReceiver);
 	/* begin followForwarded: */
-	assert(isReallyForwarded(forwardedReceiver));
+	assert(isUnambiguouslyForwarder(forwardedReceiver));
 	referent = longAt((forwardedReceiver + (BaseHeaderSize)) + (0 << 2));
 	while (((referent & 3) == 0)
 	 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
@@ -19082,7 +19084,7 @@
 			/* begin followObjField:ofObject: */
 			objOop = longAt((currentClass + (BaseHeaderSize)) + (MethodDictionaryIndex << 2));
 			assert(isNonImmediate(objOop));
-			if (((longAt(objOop)) & (0x3FFFFF - 8)) == 0) {
+			if (isForwarded(objOop)) {
 				objOop = fixFollowedFieldofObjectwithInitialValue(MethodDictionaryIndex, currentClass, objOop);
 			}

@@ Diff output truncated at 50000 characters. @@


More information about the Vm-dev mailing list