[Vm-dev] [commit][3123] CogVM source as per VMMaker.oscog-eem.921

commits at squeakvm.org commits at squeakvm.org
Tue Nov 4 05:35:21 UTC 2014


Revision: 3123
Author:   eliot
Date:     2014-11-03 21:35:18 -0800 (Mon, 03 Nov 2014)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.921

Spur: Fix possible forwarding of the receiver in implicit receiver sends.

Modified Paths:
--------------
    branches/Cog/nscogsrc/vm/cogit.c
    branches/Cog/nscogsrc/vm/cogit.h
    branches/Cog/nscogsrc/vm/cointerp.c
    branches/Cog/nscogsrc/vm/cointerp.h
    branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
    branches/Cog/nsspursrc/vm/cogit.c
    branches/Cog/nsspursrc/vm/cogit.h
    branches/Cog/nsspursrc/vm/cointerp.c
    branches/Cog/nsspursrc/vm/cointerp.h
    branches/Cog/nsspursrc/vm/gcc3x-cointerp.c
    branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c
    branches/Cog/nsspurstacksrc/vm/interp.c
    branches/Cog/scripts/svnci
    branches/Cog/sistasrc/vm/cogit.c
    branches/Cog/sistasrc/vm/cogit.h
    branches/Cog/sistasrc/vm/cointerp.c
    branches/Cog/sistasrc/vm/cointerp.h
    branches/Cog/sistasrc/vm/gcc3x-cointerp.c
    branches/Cog/spursistasrc/vm/cogit.c
    branches/Cog/spursistasrc/vm/cogit.h
    branches/Cog/spursistasrc/vm/cointerp.c
    branches/Cog/spursistasrc/vm/cointerp.h
    branches/Cog/spursistasrc/vm/gcc3x-cointerp.c
    branches/Cog/spursrc/vm/cogit.c
    branches/Cog/spursrc/vm/cogit.h
    branches/Cog/spursrc/vm/cointerp.c
    branches/Cog/spursrc/vm/cointerp.h
    branches/Cog/spursrc/vm/gcc3x-cointerp.c
    branches/Cog/spurstacksrc/vm/gcc3x-interp.c
    branches/Cog/spurstacksrc/vm/interp.c
    branches/Cog/src/vm/cogit.c
    branches/Cog/src/vm/cogit.h
    branches/Cog/src/vm/cointerp.c
    branches/Cog/src/vm/cointerp.h
    branches/Cog/src/vm/cointerpmt.c
    branches/Cog/src/vm/cointerpmt.h
    branches/Cog/src/vm/gcc3x-cointerp.c
    branches/Cog/src/vm/gcc3x-cointerpmt.c
    branches/Cog/stacksrc/vm/gcc3x-interp.c
    branches/Cog/stacksrc/vm/interp.c

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

Modified: branches/Cog/nscogsrc/vm/cogit.c
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.c	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/nscogsrc/vm/cogit.c	2014-11-04 05:35:18 UTC (rev 3123)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator * VMMaker.oscog-eem.918 uuid: 17402dc7-cd8d-4656-8ec9-a74c22c85ac8
+	CCodeGenerator VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
    from
-	StackToRegisterMappingCogit * VMMaker.oscog-eem.918 uuid: 17402dc7-cd8d-4656-8ec9-a74c22c85ac8
+	StackToRegisterMappingCogit VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit * VMMaker.oscog-eem.918 uuid: 17402dc7-cd8d-4656-8ec9-a74c22c85ac8 " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 

Modified: branches/Cog/nscogsrc/vm/cogit.h
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.h	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/nscogsrc/vm/cogit.h	2014-11-04 05:35:18 UTC (rev 3123)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator * VMMaker.oscog-eem.918 uuid: 17402dc7-cd8d-4656-8ec9-a74c22c85ac8
+	CCodeGenerator VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
 
 

Modified: branches/Cog/nscogsrc/vm/cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.c	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/nscogsrc/vm/cointerp.c	2014-11-04 05:35:18 UTC (rev 3123)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure * VMMaker.oscog-eem.918 uuid: 17402dc7-cd8d-4656-8ec9-a74c22c85ac8
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
    from
-	CoInterpreter * VMMaker.oscog-eem.918 uuid: 17402dc7-cd8d-4656-8ec9-a74c22c85ac8
+	CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
-static char __buildInfo[] = "CoInterpreter * VMMaker.oscog-eem.918 uuid: 17402dc7-cd8d-4656-8ec9-a74c22c85ac8 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -853,7 +853,7 @@
 void printWronglySizedContexts(sqInt printContexts);
 static void restoreHeadersFromtofromandtofrom(sqInt firstIn, sqInt lastIn, sqInt hdrBaseIn, sqInt firstOut, sqInt lastOut, sqInt hdrBaseOut) NoDbgRegParms;
 static void runLeakCheckerForFullGC(sqInt fullGCFlag) NoDbgRegParms;
-static usqInt safeObjectAfter(sqInt oop) NoDbgRegParms;
+static sqInt safeObjectAfter(sqInt oop) NoDbgRegParms;
 static sqInt safePrintStringOf(sqInt oop) NoDbgRegParms;
 static sqInt shortentoIndexableSize(sqInt obj, sqInt nSlots) NoDbgRegParms;
 static sqInt sizeBitsOfSafe(sqInt oop) NoDbgRegParms;
@@ -2086,7 +2086,7 @@
 	/* 574 */ (void (*)(void))0,
 	/* 575 */ (void (*)(void))0,
  0 };
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_*_VMMaker.oscog-eem.918";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.921";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -4881,7 +4881,6 @@
 							GIV(framePointer) = localFP;
 							
 							ceEnterCogCodePopReceiverReg();
-							null;
 							goto l302;
 						}
 						localIP = pointerForOop(longAt(localFP + FoxIFSavedIP));
@@ -4899,7 +4898,7 @@
 					/* begin fetchNextBytecode */
 					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
-					null;
+					/* return self */
 				l302:	/* end baseFrameReturn */;
 					goto l301;
 				}
@@ -4987,7 +4986,9 @@
 		case 127:
 			/* pushImplicitReceiverBytecode */
 			{
+				sqInt followedReceiver;
 				sqInt object;
+				sqInt rcvr;
 				sqInt selector;
 
 				VM_LABEL(0pushImplicitReceiverBytecode);
@@ -4997,8 +4998,12 @@
 				/* begin fetchNextBytecode */
 				currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
+				/* begin internalFollowedReceiver */
+				rcvr = longAt(localFP + FoxIFReceiver);
+				
+				followedReceiver = rcvr;
 				/* begin internalPush: */
-				object = implicitReceiverFormixinimplementing(longAt(localFP + FoxIFReceiver), methodClassOf(GIV(method)), selector);
+				object = implicitReceiverFormixinimplementing(followedReceiver, methodClassOf(GIV(method)), selector);
 				longAtPointerput((localSP -= BytesPerOop), object);
 			}
 			break;
@@ -12728,12 +12733,18 @@
 			/* commonSendAbsentImplicit */
 			{
 				sqInt ccIndex;
+				sqInt followedReceiver;
 				sqInt i;
 				sqInt implicitReceiver;
 				sqInt oop;
+				sqInt rcvr;
 
 				VM_LABEL(0commonSendAbsentImplicit);
-				implicitReceiver = implicitReceiverFormixinimplementing(longAt(localFP + FoxIFReceiver), methodClassOf(GIV(method)), GIV(messageSelector));
+				/* begin internalFollowedReceiver */
+				rcvr = longAt(localFP + FoxIFReceiver);
+				
+				followedReceiver = rcvr;
+				implicitReceiver = implicitReceiverFormixinimplementing(followedReceiver, methodClassOf(GIV(method)), GIV(messageSelector));
 				/* begin shuffleArgumentsAndStoreAbsentReceiver: */
 
 				/* a.k.a. self internalPush: anything */
@@ -36634,15 +36645,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;
 
@@ -36653,7 +36666,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;
@@ -36668,7 +36695,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)) {
 
@@ -36722,18 +36749,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 = ((((usqInt)(newFreeChunk + sz2))) >= GIV(freeStart)
+	next = ((((usqInt)(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)) {
@@ -38609,7 +38636,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-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/nscogsrc/vm/cointerp.h	2014-11-04 05:35:18 UTC (rev 3123)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure * VMMaker.oscog-eem.918 uuid: 17402dc7-cd8d-4656-8ec9-a74c22c85ac8
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
 
 

Modified: branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2014-11-04 05:35:18 UTC (rev 3123)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure * VMMaker.oscog-eem.918 uuid: 17402dc7-cd8d-4656-8ec9-a74c22c85ac8
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
    from
-	CoInterpreter * VMMaker.oscog-eem.918 uuid: 17402dc7-cd8d-4656-8ec9-a74c22c85ac8
+	CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
-static char __buildInfo[] = "CoInterpreter * VMMaker.oscog-eem.918 uuid: 17402dc7-cd8d-4656-8ec9-a74c22c85ac8 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -856,7 +856,7 @@
 void printWronglySizedContexts(sqInt printContexts);
 static void restoreHeadersFromtofromandtofrom(sqInt firstIn, sqInt lastIn, sqInt hdrBaseIn, sqInt firstOut, sqInt lastOut, sqInt hdrBaseOut) NoDbgRegParms;
 static void runLeakCheckerForFullGC(sqInt fullGCFlag) NoDbgRegParms;
-static usqInt safeObjectAfter(sqInt oop) NoDbgRegParms;
+static sqInt safeObjectAfter(sqInt oop) NoDbgRegParms;
 static sqInt safePrintStringOf(sqInt oop) NoDbgRegParms;
 static sqInt shortentoIndexableSize(sqInt obj, sqInt nSlots) NoDbgRegParms;
 static sqInt sizeBitsOfSafe(sqInt oop) NoDbgRegParms;
@@ -2089,7 +2089,7 @@
 	/* 574 */ (void (*)(void))0,
 	/* 575 */ (void (*)(void))0,
  0 };
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_*_VMMaker.oscog-eem.918";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.921";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -4890,7 +4890,6 @@
 							GIV(framePointer) = localFP;
 							
 							ceEnterCogCodePopReceiverReg();
-							null;
 							goto l302;
 						}
 						localIP = pointerForOop(longAt(localFP + FoxIFSavedIP));
@@ -4908,7 +4907,7 @@
 					/* begin fetchNextBytecode */
 					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
-					null;
+					/* return self */
 				l302:	/* end baseFrameReturn */;
 					goto l301;
 				}
@@ -4996,7 +4995,9 @@
 		CASE(127)
 			/* pushImplicitReceiverBytecode */
 			{
+				sqInt followedReceiver;
 				sqInt object;
+				sqInt rcvr;
 				sqInt selector;
 
 				VM_LABEL(0pushImplicitReceiverBytecode);
@@ -5006,8 +5007,12 @@
 				/* begin fetchNextBytecode */
 				currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
+				/* begin internalFollowedReceiver */
+				rcvr = longAt(localFP + FoxIFReceiver);
+				
+				followedReceiver = rcvr;
 				/* begin internalPush: */
-				object = implicitReceiverFormixinimplementing(longAt(localFP + FoxIFReceiver), methodClassOf(GIV(method)), selector);
+				object = implicitReceiverFormixinimplementing(followedReceiver, methodClassOf(GIV(method)), selector);
 				longAtPointerput((localSP -= BytesPerOop), object);
 			}
 			BREAK;
@@ -12737,12 +12742,18 @@
 			/* commonSendAbsentImplicit */
 			{
 				sqInt ccIndex;
+				sqInt followedReceiver;
 				sqInt i;
 				sqInt implicitReceiver;
 				sqInt oop;
+				sqInt rcvr;
 
 				VM_LABEL(0commonSendAbsentImplicit);
-				implicitReceiver = implicitReceiverFormixinimplementing(longAt(localFP + FoxIFReceiver), methodClassOf(GIV(method)), GIV(messageSelector));
+				/* begin internalFollowedReceiver */
+				rcvr = longAt(localFP + FoxIFReceiver);
+				
+				followedReceiver = rcvr;
+				implicitReceiver = implicitReceiverFormixinimplementing(followedReceiver, methodClassOf(GIV(method)), GIV(messageSelector));
 				/* begin shuffleArgumentsAndStoreAbsentReceiver: */
 
 				/* a.k.a. self internalPush: anything */
@@ -36643,15 +36654,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;
 
@@ -36662,7 +36675,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;
@@ -36677,7 +36704,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)) {
 
@@ -36731,18 +36758,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 = ((((usqInt)(newFreeChunk + sz2))) >= GIV(freeStart)
+	next = ((((usqInt)(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)) {
@@ -38618,7 +38645,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/nsspursrc/vm/cogit.c
===================================================================
--- branches/Cog/nsspursrc/vm/cogit.c	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/nsspursrc/vm/cogit.c	2014-11-04 05:35:18 UTC (rev 3123)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator * VMMaker.oscog-eem.918 uuid: 17402dc7-cd8d-4656-8ec9-a74c22c85ac8
+	CCodeGenerator VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
    from
-	StackToRegisterMappingCogit * VMMaker.oscog-eem.918 uuid: 17402dc7-cd8d-4656-8ec9-a74c22c85ac8
+	StackToRegisterMappingCogit VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit * VMMaker.oscog-eem.918 uuid: 17402dc7-cd8d-4656-8ec9-a74c22c85ac8 " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -873,6 +873,7 @@
 static sqInt genConvertCharacterToCodeInReg(sqInt reg) NoDbgRegParms;
 static sqInt genConvertIntegerToCharacterInReg(sqInt reg) NoDbgRegParms;
 static sqInt genEnsureObjInRegNotForwardedscratchReg(sqInt reg, sqInt scratch) NoDbgRegParms;
+static sqInt genEnsureObjInRegNotForwardedscratchRegupdatingMwr(sqInt reg, sqInt scratch, sqInt offset, sqInt baseReg) NoDbgRegParms;
 static sqInt genEnsureOopInRegNotForwardedscratchReg(sqInt reg, sqInt scratch) NoDbgRegParms;
 static void generateObjectRepresentationTrampolines(void);
 static sqInt genGetActiveContextNumArgslargeinBlock(sqInt numArgs, sqInt isLargeContext, sqInt isInBlock) NoDbgRegParms;
@@ -11209,6 +11210,7 @@
 	genoperandoperand(MoveRR, TempReg, ReceiverResultReg);
 	jmpTarget(jumpItsTheReceiverStupid, gRetN(0));
 	jmpTarget(jumpMiss, gLabel());
+	genEnsureObjInRegNotForwardedscratchRegupdatingMwr(ReceiverResultReg, TempReg, FoxMFReceiver, FPReg);
 	ceImplicitReceiverTrampoline = genTrampolineForcallednumArgsargargargargsaveRegspushLinkRegresultRegappendOpcodes(ceImplicitReceiverForreceivercache, "ceImplicitReceiverTrampoline", 3, SendNumArgsReg, ReceiverResultReg, Arg1Reg, null, 0, 1, ReceiverResultReg, 1);
 
 }
@@ -17632,6 +17634,49 @@
 }
 
 
+/*	Make sure that the object in reg is not forwarded, and update the field
+	reg[offset] is
+	updated if the object in reg is forwarded.
+	Use the fact that isForwardedObjectClassIndexPun is a power of two to save
+	an instruction. */
+
+static sqInt
+genEnsureObjInRegNotForwardedscratchRegupdatingMwr(sqInt reg, sqInt scratch, sqInt offset, sqInt baseReg)
+{
+    AbstractInstruction *imm;
+    AbstractInstruction *loop;
+    AbstractInstruction *ok;
+    sqInt quickConstant;
+
+	assert(reg != scratch);
+	/* begin Label */
+	loop = genoperandoperand(Label, (labelCounter += 1), bytecodePC);
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, reg, scratch);
+
+	/* notionally
+	   self genGetClassIndexOfNonImm: reg into: scratch.
+	   cogit CmpCq: objectMemory isForwardedObjectClassIndexPun R: TempReg.
+	   but the following is an instruction shorter: */
+
+	imm = genJumpImmediateInScratchReg(scratch);
+	/* begin MoveMw:r:R: */
+	genoperandoperandoperand(MoveMwrR, 0, reg, scratch);
+	/* begin AndCq:R: */
+	quickConstant = (classIndexMask()) - (isForwardedObjectClassIndexPun());
+	genoperandoperand(AndCqR, quickConstant, scratch);
+	/* begin JumpNonZero: */
+	ok = genoperand(JumpNonZero, ((sqInt)0));
+	genLoadSlotsourceRegdestReg(0, reg, reg);
+	/* begin MoveR:Mw:r: */
+	genoperandoperandoperand(MoveRMwr, reg, offset, baseReg);
+	/* begin Jump: */
+	genoperand(Jump, ((sqInt)loop));
+	jmpTarget(ok, jmpTarget(imm, gLabel()));
+	return 0;
+}
+
+
 /*	Make sure that the oop in reg is not forwarded. */
 
 static sqInt

Modified: branches/Cog/nsspursrc/vm/cogit.h
===================================================================
--- branches/Cog/nsspursrc/vm/cogit.h	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/nsspursrc/vm/cogit.h	2014-11-04 05:35:18 UTC (rev 3123)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator * VMMaker.oscog-eem.918 uuid: 17402dc7-cd8d-4656-8ec9-a74c22c85ac8
+	CCodeGenerator VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
 
 

Modified: branches/Cog/nsspursrc/vm/cointerp.c
===================================================================
--- branches/Cog/nsspursrc/vm/cointerp.c	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/nsspursrc/vm/cointerp.c	2014-11-04 05:35:18 UTC (rev 3123)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
    from
-	CoInterpreter VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -2335,7 +2335,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 CoInterpreterPrimitives_VMMaker.oscog-eem.920";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.921";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -5784,7 +5784,10 @@
 		case 127:
 			/* pushImplicitReceiverBytecode */
 			{
+				sqInt followedReceiver;
 				sqInt object;
+				sqInt rcvr;
+				sqInt referent;
 				sqInt selector;
 
 				VM_LABEL(0pushImplicitReceiverBytecode);
@@ -5794,8 +5797,23 @@
 				/* begin fetchNextBytecode */
 				currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
+				/* begin internalFollowedReceiver */
+				rcvr = longAt(localFP + FoxIFReceiver);
+				if (((rcvr & 3) == 0)
+				 && (((longAt(rcvr)) & 0x3FFFFF) == 8)) {
+					/* begin followForwarded: */
+					assert(isUnambiguouslyForwarder(rcvr));
+					referent = longAt((rcvr + BaseHeaderSize) + (0 << 2));
+					while (((referent & 3) == 0)
+					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
+						referent = longAt((referent + BaseHeaderSize) + (0 << 2));
+					}
+					rcvr = referent;
+					longAtput(localFP + FoxIFReceiver, rcvr);
+				}
+				followedReceiver = rcvr;
 				/* begin internalPush: */
-				object = implicitReceiverFormixinimplementing(longAt(localFP + FoxIFReceiver), methodClassOf(GIV(method)), selector);
+				object = implicitReceiverFormixinimplementing(followedReceiver, methodClassOf(GIV(method)), selector);
 				longAtPointerput((localSP -= BytesPerOop), object);
 			}
 			break;
@@ -14533,13 +14551,31 @@
 		commonSendAbsentImplicit:
 			/* commonSendAbsentImplicit */
 			{
+				sqInt followedReceiver;
 				sqInt i;
 				sqInt implicitReceiver;
 				sqInt oop;
+				sqInt rcvr;
+				sqInt referent;
 				sqInt tagBits;
 
 				VM_LABEL(0commonSendAbsentImplicit);
-				implicitReceiver = implicitReceiverFormixinimplementing(longAt(localFP + FoxIFReceiver), methodClassOf(GIV(method)), GIV(messageSelector));
+				/* begin internalFollowedReceiver */
+				rcvr = longAt(localFP + FoxIFReceiver);
+				if (((rcvr & 3) == 0)
+				 && (((longAt(rcvr)) & 0x3FFFFF) == 8)) {
+					/* begin followForwarded: */
+					assert(isUnambiguouslyForwarder(rcvr));
+					referent = longAt((rcvr + BaseHeaderSize) + (0 << 2));
+					while (((referent & 3) == 0)
+					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
+						referent = longAt((referent + BaseHeaderSize) + (0 << 2));
+					}
+					rcvr = referent;
+					longAtput(localFP + FoxIFReceiver, rcvr);
+				}
+				followedReceiver = rcvr;
+				implicitReceiver = implicitReceiverFormixinimplementing(followedReceiver, methodClassOf(GIV(method)), GIV(messageSelector));
 				/* begin shuffleArgumentsAndStoreAbsentReceiver: */
 
 				/* a.k.a. self internalPush: anything */

Modified: branches/Cog/nsspursrc/vm/cointerp.h
===================================================================
--- branches/Cog/nsspursrc/vm/cointerp.h	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/nsspursrc/vm/cointerp.h	2014-11-04 05:35:18 UTC (rev 3123)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
 
 

Modified: branches/Cog/nsspursrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nsspursrc/vm/gcc3x-cointerp.c	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/nsspursrc/vm/gcc3x-cointerp.c	2014-11-04 05:35:18 UTC (rev 3123)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
    from
-	CoInterpreter VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -2338,7 +2338,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 CoInterpreterPrimitives_VMMaker.oscog-eem.920";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.921";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -5793,7 +5793,10 @@
 		CASE(127)
 			/* pushImplicitReceiverBytecode */
 			{
+				sqInt followedReceiver;
 				sqInt object;
+				sqInt rcvr;
+				sqInt referent;
 				sqInt selector;
 
 				VM_LABEL(0pushImplicitReceiverBytecode);
@@ -5803,8 +5806,23 @@
 				/* begin fetchNextBytecode */
 				currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
+				/* begin internalFollowedReceiver */
+				rcvr = longAt(localFP + FoxIFReceiver);
+				if (((rcvr & 3) == 0)
+				 && (((longAt(rcvr)) & 0x3FFFFF) == 8)) {
+					/* begin followForwarded: */
+					assert(isUnambiguouslyForwarder(rcvr));
+					referent = longAt((rcvr + BaseHeaderSize) + (0 << 2));
+					while (((referent & 3) == 0)
+					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
+						referent = longAt((referent + BaseHeaderSize) + (0 << 2));
+					}
+					rcvr = referent;
+					longAtput(localFP + FoxIFReceiver, rcvr);
+				}
+				followedReceiver = rcvr;
 				/* begin internalPush: */
-				object = implicitReceiverFormixinimplementing(longAt(localFP + FoxIFReceiver), methodClassOf(GIV(method)), selector);
+				object = implicitReceiverFormixinimplementing(followedReceiver, methodClassOf(GIV(method)), selector);
 				longAtPointerput((localSP -= BytesPerOop), object);
 			}
 			BREAK;
@@ -14542,13 +14560,31 @@
 		commonSendAbsentImplicit:
 			/* commonSendAbsentImplicit */
 			{
+				sqInt followedReceiver;
 				sqInt i;
 				sqInt implicitReceiver;
 				sqInt oop;
+				sqInt rcvr;
+				sqInt referent;
 				sqInt tagBits;
 
 				VM_LABEL(0commonSendAbsentImplicit);
-				implicitReceiver = implicitReceiverFormixinimplementing(longAt(localFP + FoxIFReceiver), methodClassOf(GIV(method)), GIV(messageSelector));
+				/* begin internalFollowedReceiver */
+				rcvr = longAt(localFP + FoxIFReceiver);
+				if (((rcvr & 3) == 0)
+				 && (((longAt(rcvr)) & 0x3FFFFF) == 8)) {
+					/* begin followForwarded: */
+					assert(isUnambiguouslyForwarder(rcvr));
+					referent = longAt((rcvr + BaseHeaderSize) + (0 << 2));
+					while (((referent & 3) == 0)
+					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
+						referent = longAt((referent + BaseHeaderSize) + (0 << 2));
+					}
+					rcvr = referent;
+					longAtput(localFP + FoxIFReceiver, rcvr);
+				}
+				followedReceiver = rcvr;
+				implicitReceiver = implicitReceiverFormixinimplementing(followedReceiver, methodClassOf(GIV(method)), GIV(messageSelector));
 				/* begin shuffleArgumentsAndStoreAbsentReceiver: */
 
 				/* a.k.a. self internalPush: anything */

Modified: branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c
===================================================================
--- branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c	2014-11-04 05:35:18 UTC (rev 3123)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
    from
-	StackInterpreter VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	StackInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
-static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c " __DATE__ ;
+static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -2084,7 +2084,7 @@
  0 };
 char * breakSelector;
 sqInt breakSelectorLength = -1;
-const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.920";
+const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.921";
 volatile int sendTrace;
 sqInt suppressHeartbeatFlag;
 
@@ -5381,7 +5381,10 @@
 		CASE(127)
 			/* pushImplicitReceiverBytecode */
 			{
+				sqInt followedReceiver;
 				sqInt object;
+				sqInt rcvr;
+				sqInt referent;
 				sqInt selector;
 
 				VM_LABEL(0pushImplicitReceiverBytecode);
@@ -5391,8 +5394,23 @@
 				/* begin fetchNextBytecode */
 				currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
+				/* begin internalFollowedReceiver */
+				rcvr = longAt(localFP + FoxReceiver);
+				if (((rcvr & 3) == 0)
+				 && (((longAt(rcvr)) & 0x3FFFFF) == 8)) {
+					/* begin followForwarded: */
+					assert(isUnambiguouslyForwarder(rcvr));
+					referent = longAt((rcvr + BaseHeaderSize) + (0 << 2));
+					while (((referent & 3) == 0)
+					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
+						referent = longAt((referent + BaseHeaderSize) + (0 << 2));
+					}
+					rcvr = referent;
+					longAtput(localFP + FoxReceiver, rcvr);
+				}
+				followedReceiver = rcvr;
 				/* begin internalPush: */
-				object = implicitReceiverFormixinimplementing(longAt(localFP + FoxReceiver), methodClassOf(GIV(method)), selector);
+				object = implicitReceiverFormixinimplementing(followedReceiver, methodClassOf(GIV(method)), selector);
 				longAtPointerput((localSP -= BytesPerOop), object);
 			}
 			BREAK;
@@ -13816,13 +13834,31 @@
 		commonSendAbsentImplicit:
 			/* commonSendAbsentImplicit */
 			{
+				sqInt followedReceiver;
 				sqInt i;
 				sqInt implicitReceiver;
 				sqInt oop;
+				sqInt rcvr;
+				sqInt referent;
 				sqInt tagBits;
 
 				VM_LABEL(0commonSendAbsentImplicit);
-				implicitReceiver = implicitReceiverFormixinimplementing(longAt(localFP + FoxReceiver), methodClassOf(GIV(method)), GIV(messageSelector));
+				/* begin internalFollowedReceiver */
+				rcvr = longAt(localFP + FoxReceiver);
+				if (((rcvr & 3) == 0)
+				 && (((longAt(rcvr)) & 0x3FFFFF) == 8)) {
+					/* begin followForwarded: */
+					assert(isUnambiguouslyForwarder(rcvr));
+					referent = longAt((rcvr + BaseHeaderSize) + (0 << 2));
+					while (((referent & 3) == 0)
+					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
+						referent = longAt((referent + BaseHeaderSize) + (0 << 2));
+					}
+					rcvr = referent;
+					longAtput(localFP + FoxReceiver, rcvr);
+				}
+				followedReceiver = rcvr;
+				implicitReceiver = implicitReceiverFormixinimplementing(followedReceiver, methodClassOf(GIV(method)), GIV(messageSelector));
 				/* begin shuffleArgumentsAndStoreAbsentReceiver: */
 
 				/* a.k.a. self internalPush: anything */

Modified: branches/Cog/nsspurstacksrc/vm/interp.c
===================================================================
--- branches/Cog/nsspurstacksrc/vm/interp.c	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/nsspurstacksrc/vm/interp.c	2014-11-04 05:35:18 UTC (rev 3123)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
    from
-	StackInterpreter VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	StackInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
-static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c " __DATE__ ;
+static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -2081,7 +2081,7 @@
  0 };
 char * breakSelector;
 sqInt breakSelectorLength = -1;
-const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.920";
+const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.921";
 volatile int sendTrace;
 sqInt suppressHeartbeatFlag;
 
@@ -5372,7 +5372,10 @@
 		case 127:
 			/* pushImplicitReceiverBytecode */
 			{
+				sqInt followedReceiver;
 				sqInt object;
+				sqInt rcvr;
+				sqInt referent;
 				sqInt selector;
 
 				VM_LABEL(0pushImplicitReceiverBytecode);
@@ -5382,8 +5385,23 @@
 				/* begin fetchNextBytecode */
 				currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
+				/* begin internalFollowedReceiver */
+				rcvr = longAt(localFP + FoxReceiver);
+				if (((rcvr & 3) == 0)
+				 && (((longAt(rcvr)) & 0x3FFFFF) == 8)) {
+					/* begin followForwarded: */
+					assert(isUnambiguouslyForwarder(rcvr));
+					referent = longAt((rcvr + BaseHeaderSize) + (0 << 2));
+					while (((referent & 3) == 0)
+					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
+						referent = longAt((referent + BaseHeaderSize) + (0 << 2));
+					}
+					rcvr = referent;
+					longAtput(localFP + FoxReceiver, rcvr);
+				}
+				followedReceiver = rcvr;
 				/* begin internalPush: */
-				object = implicitReceiverFormixinimplementing(longAt(localFP + FoxReceiver), methodClassOf(GIV(method)), selector);
+				object = implicitReceiverFormixinimplementing(followedReceiver, methodClassOf(GIV(method)), selector);
 				longAtPointerput((localSP -= BytesPerOop), object);
 			}
 			break;
@@ -13807,13 +13825,31 @@
 		commonSendAbsentImplicit:
 			/* commonSendAbsentImplicit */
 			{
+				sqInt followedReceiver;
 				sqInt i;
 				sqInt implicitReceiver;
 				sqInt oop;
+				sqInt rcvr;
+				sqInt referent;
 				sqInt tagBits;
 
 				VM_LABEL(0commonSendAbsentImplicit);
-				implicitReceiver = implicitReceiverFormixinimplementing(longAt(localFP + FoxReceiver), methodClassOf(GIV(method)), GIV(messageSelector));
+				/* begin internalFollowedReceiver */
+				rcvr = longAt(localFP + FoxReceiver);
+				if (((rcvr & 3) == 0)
+				 && (((longAt(rcvr)) & 0x3FFFFF) == 8)) {
+					/* begin followForwarded: */
+					assert(isUnambiguouslyForwarder(rcvr));
+					referent = longAt((rcvr + BaseHeaderSize) + (0 << 2));
+					while (((referent & 3) == 0)
+					 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
+						referent = longAt((referent + BaseHeaderSize) + (0 << 2));
+					}
+					rcvr = referent;
+					longAtput(localFP + FoxReceiver, rcvr);
+				}
+				followedReceiver = rcvr;
+				implicitReceiver = implicitReceiverFormixinimplementing(followedReceiver, methodClassOf(GIV(method)), GIV(messageSelector));
 				/* begin shuffleArgumentsAndStoreAbsentReceiver: */
 
 				/* a.k.a. self internalPush: anything */


Property changes on: branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
___________________________________________________________________
Modified: checkindate
   - Mon Nov  3 15:51:59 PST 2014
   + Mon Nov  3 21:34:53 PST 2014

Modified: branches/Cog/scripts/svnci
===================================================================
--- branches/Cog/scripts/svnci	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/scripts/svnci	2014-11-04 05:35:18 UTC (rev 3123)
@@ -2,5 +2,7 @@
 # checkin script for subverison that serves to cause
 # platforms/Cross/vm/sqSCCSVersion.h to be checked-in so that its version
 # info reflects that of the current check-in.
+`dirname $0`/revertUnchangedPlugins
+`dirname $0`/revertUnchangedPlugins nscogsrc/plugins
 svn propset checkindate "`date`" platforms/Cross/vm/sqSCCSVersion.h
 svn ci

Modified: branches/Cog/sistasrc/vm/cogit.c
===================================================================
--- branches/Cog/sistasrc/vm/cogit.c	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/sistasrc/vm/cogit.c	2014-11-04 05:35:18 UTC (rev 3123)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	CCodeGenerator VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
    from
-	SistaStackToRegisterMappingCogit VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	SistaStackToRegisterMappingCogit VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
-static char __buildInfo[] = "SistaStackToRegisterMappingCogit VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c " __DATE__ ;
+static char __buildInfo[] = "SistaStackToRegisterMappingCogit VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 

Modified: branches/Cog/sistasrc/vm/cogit.h
===================================================================
--- branches/Cog/sistasrc/vm/cogit.h	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/sistasrc/vm/cogit.h	2014-11-04 05:35:18 UTC (rev 3123)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	CCodeGenerator VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
 
 

Modified: branches/Cog/sistasrc/vm/cointerp.c
===================================================================
--- branches/Cog/sistasrc/vm/cointerp.c	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/sistasrc/vm/cointerp.c	2014-11-04 05:35:18 UTC (rev 3123)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
    from
-	CoInterpreter VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -852,7 +852,7 @@
 void printWronglySizedContexts(sqInt printContexts);
 static void restoreHeadersFromtofromandtofrom(sqInt firstIn, sqInt lastIn, sqInt hdrBaseIn, sqInt firstOut, sqInt lastOut, sqInt hdrBaseOut) NoDbgRegParms;
 static void runLeakCheckerForFullGC(sqInt fullGCFlag) NoDbgRegParms;
-static usqInt safeObjectAfter(sqInt oop) NoDbgRegParms;
+static sqInt safeObjectAfter(sqInt oop) NoDbgRegParms;
 static sqInt safePrintStringOf(sqInt oop) NoDbgRegParms;
 static sqInt shortentoIndexableSize(sqInt obj, sqInt nSlots) NoDbgRegParms;
 static sqInt sizeBitsOfSafe(sqInt oop) NoDbgRegParms;
@@ -2084,7 +2084,7 @@
 	/* 574 */ (void (*)(void))0,
 	/* 575 */ (void (*)(void))0,
  0 };
-const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreterPrimitives VMMaker.oscog-eem.920]";
+const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreterPrimitives VMMaker.oscog-eem.921]";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -36707,15 +36707,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;
 
@@ -36726,7 +36728,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;
@@ -36741,7 +36757,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)) {
 
@@ -36795,18 +36811,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 = ((((usqInt)(newFreeChunk + sz2))) >= GIV(freeStart)
+	next = ((((usqInt)(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)) {
@@ -38682,7 +38698,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/sistasrc/vm/cointerp.h
===================================================================
--- branches/Cog/sistasrc/vm/cointerp.h	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/sistasrc/vm/cointerp.h	2014-11-04 05:35:18 UTC (rev 3123)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
 
 

Modified: branches/Cog/sistasrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/sistasrc/vm/gcc3x-cointerp.c	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/sistasrc/vm/gcc3x-cointerp.c	2014-11-04 05:35:18 UTC (rev 3123)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
    from
-	CoInterpreter VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -855,7 +855,7 @@
 void printWronglySizedContexts(sqInt printContexts);
 static void restoreHeadersFromtofromandtofrom(sqInt firstIn, sqInt lastIn, sqInt hdrBaseIn, sqInt firstOut, sqInt lastOut, sqInt hdrBaseOut) NoDbgRegParms;
 static void runLeakCheckerForFullGC(sqInt fullGCFlag) NoDbgRegParms;
-static usqInt safeObjectAfter(sqInt oop) NoDbgRegParms;
+static sqInt safeObjectAfter(sqInt oop) NoDbgRegParms;
 static sqInt safePrintStringOf(sqInt oop) NoDbgRegParms;
 static sqInt shortentoIndexableSize(sqInt obj, sqInt nSlots) NoDbgRegParms;
 static sqInt sizeBitsOfSafe(sqInt oop) NoDbgRegParms;
@@ -2087,7 +2087,7 @@
 	/* 574 */ (void (*)(void))0,
 	/* 575 */ (void (*)(void))0,
  0 };
-const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreterPrimitives VMMaker.oscog-eem.920]";
+const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreterPrimitives VMMaker.oscog-eem.921]";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -36716,15 +36716,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;
 
@@ -36735,7 +36737,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;
@@ -36750,7 +36766,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)) {
 
@@ -36804,18 +36820,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 = ((((usqInt)(newFreeChunk + sz2))) >= GIV(freeStart)
+	next = ((((usqInt)(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)) {
@@ -38691,7 +38707,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/spursistasrc/vm/cogit.c
===================================================================
--- branches/Cog/spursistasrc/vm/cogit.c	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/spursistasrc/vm/cogit.c	2014-11-04 05:35:18 UTC (rev 3123)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	CCodeGenerator VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
    from
-	SistaStackToRegisterMappingCogit VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	SistaStackToRegisterMappingCogit VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
-static char __buildInfo[] = "SistaStackToRegisterMappingCogit VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c " __DATE__ ;
+static char __buildInfo[] = "SistaStackToRegisterMappingCogit VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 

Modified: branches/Cog/spursistasrc/vm/cogit.h
===================================================================
--- branches/Cog/spursistasrc/vm/cogit.h	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/spursistasrc/vm/cogit.h	2014-11-04 05:35:18 UTC (rev 3123)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	CCodeGenerator VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
 
 

Modified: branches/Cog/spursistasrc/vm/cointerp.c
===================================================================
--- branches/Cog/spursistasrc/vm/cointerp.c	2014-11-03 23:52:54 UTC (rev 3122)
+++ branches/Cog/spursistasrc/vm/cointerp.c	2014-11-04 05:35:18 UTC (rev 3123)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
    from
-	CoInterpreter VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c
+	CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.920 uuid: cfdfcd30-b5f8-4c49-a6b4-2c55bd7a3b6c " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -2333,7 +2333,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 = "Croquet Closure Cog VM [CoInterpreterPrimitives VMMaker.oscog-eem.920]";
+const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreterPrimitives VMMaker.oscog-eem.921]";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 


@@ Diff output truncated at 50000 characters. @@


More information about the Vm-dev mailing list