[Vm-dev] [commit][3082] CogVM source as per VMMaker.oscog-eem.882

commits at squeakvm.org commits at squeakvm.org
Thu Sep 25 17:53:45 UTC 2014


Revision: 3082
Author:   eliot
Date:     2014-09-25 10:53:41 -0700 (Thu, 25 Sep 2014)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.882

Spur:
Fix bug in sweepToFollowForwardersForPigCompact which failed to update and
answer lowest forwarder.  Fixes numForwarders == 0 assert failures.

Fix bug with become and class table not removing
classes which become causes them to be unhashed.

Fix bogus assert fail in synchronousSignal:. Refactor following code into
ensureSemaphoreForwardedThroughContext: and fix the assert there-in.

Use rawOverflowSlotsOf: in bytesInObject:.

Make a little more progress on Spur image segment support.  Provide a
classTableEntriesDo: and use it to compute an arrayOfUnmarkedClasses.

Cogit:
Make sure voidImplicitReceiverCacheAt: sets codeModified if IRCs are inline.

Make sure freeMethod: clears cmRefersToYoung

Fix assert in cogitPostGCAction: that would fire erroneously in Spur become.

Nuke some unneeded pruneYoungReferrers calls.

Factor-out send-site unlinking into unlinkSendAt:targetMethod:sendTable:

Sista:
Rename ceClassTrap: et al to ceSistaTrap: given that Sista may trap in more
cases than just unknown classes.

Renumber the primitives in StackInterpreter>>callPrimitiveBytecode.

Modified Paths:
--------------
    branches/Cog/build.linux32x86/HowToBuild
    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/revertIfEssentiallyUnchanged
    branches/Cog/scripts/svnrevert
    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/build.linux32x86/HowToBuild
===================================================================
--- branches/Cog/build.linux32x86/HowToBuild	2014-09-18 17:12:31 UTC (rev 3081)
+++ branches/Cog/build.linux32x86/HowToBuild	2014-09-25 17:53:41 UTC (rev 3082)
@@ -188,6 +188,8 @@
 
 N.B. The plugin set is defined by plugins.ext and plugins.int in the build dir.
 
+Be prepared to install libuuid support.  e.g. on CentOS 6.5 use
+sudo yum -y install libuuid-devel
 
 
 Testing an external plugin has completely linked

Modified: branches/Cog/nscogsrc/vm/cogit.c
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.c	2014-09-18 17:12:31 UTC (rev 3081)
+++ branches/Cog/nscogsrc/vm/cogit.c	2014-09-25 17:53:41 UTC (rev 3082)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.880 uuid: 4aeaa3e0-8c6b-44b4-a124-128870605261
+	CCodeGenerator VMMaker.oscog-eem.882 uuid: f22a00ff-acaf-49b0-9f6d-44efec689c0d
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.880 uuid: 4aeaa3e0-8c6b-44b4-a124-128870605261
+	StackToRegisterMappingCogit VMMaker.oscog-eem.882 uuid: f22a00ff-acaf-49b0-9f6d-44efec689c0d
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.880 uuid: 4aeaa3e0-8c6b-44b4-a124-128870605261 " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.882 uuid: f22a00ff-acaf-49b0-9f6d-44efec689c0d " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -9413,7 +9413,8 @@
 		voidYoungReferrersPostTenureAll();
 	}
 	assert(allMethodsHaveCorrectHeader());
-	assert(kosherYoungReferrers());
+	assert((gcMode == GCModeBecome)
+	 || (kosherYoungReferrers()));
 }
 
 
@@ -12114,10 +12115,8 @@
 		}
 		cogMethod = ((CogMethod *) (roundUpLength((((sqInt)cogMethod)) + ((cogMethod->blockSize)))));
 	}
-	pruneYoungReferrers();
 	if (freedPIC) {
 		unlinkSendsToFree();
-		codeModified = 1;
 	}
 	if (codeModified) {
 
@@ -12553,7 +12552,7 @@
 {
     sqInt *address;
     sqInt *address1;
-    usqInt cacheAddress;
+    sqInt cacheAddress;
     sqInt cacheTag;
     sqInt cacheTag1;
     sqInt cacheTagMarked;
@@ -12626,6 +12625,7 @@
 				/* Either the cacheTag is unmarked (e.g. new class) or the target
 				   has been freed (because it is unmarked), so unlink the send. */
 
+				/* begin unlinkSendAt:targetMethod:sendTable: */
 				unlinkedRoutine = sendTable1[((((targetMethod1->cmNumArgs)) < (NumSendTrampolines - 1)) ? ((targetMethod1->cmNumArgs)) : (NumSendTrampolines - 1))];
 				rewriteInlineCacheAttagtarget(backEnd, ((sqInt)mcpc), (targetMethod1->selector), unlinkedRoutine);
 				codeModified = 1;
@@ -12722,7 +12722,7 @@
 static sqInt
 markYoungObjectspcmethod(sqInt annotation, char *mcpc, sqInt cogMethod)
 {
-    usqInt cacheAddress;
+    sqInt cacheAddress;
     sqInt cacheTag;
     sqInt cacheTag1;
     sqInt class;
@@ -13813,7 +13813,7 @@
 static sqInt
 remapIfObjectRefpchasYoung(sqInt annotation, char *mcpc, sqInt hasYoungPtr)
 {
-    usqInt cacheAddress;
+    sqInt cacheAddress;
     sqInt cacheTag;
     sqInt cacheTag1;
     sqInt entryPoint;
@@ -14150,6 +14150,7 @@
 
 			if ((((targetMethod1->cmType)) == CMFree)
 			 || (((targetMethod1->selector)) == theSelector)) {
+				/* begin unlinkSendAt:targetMethod:sendTable: */
 				unlinkedRoutine = sendTable1[((((targetMethod1->cmNumArgs)) < (NumSendTrampolines - 1)) ? ((targetMethod1->cmNumArgs)) : (NumSendTrampolines - 1))];
 				rewriteInlineCacheAttagtarget(backEnd, ((sqInt)mcpc), (targetMethod1->selector), unlinkedRoutine);
 				codeModified = 1;
@@ -14201,6 +14202,7 @@
 			}
 
 			if (((targetMethod1->cmType)) == CMFree) {
+				/* begin unlinkSendAt:targetMethod:sendTable: */
 				unlinkedRoutine = sendTable1[((((targetMethod1->cmNumArgs)) < (NumSendTrampolines - 1)) ? ((targetMethod1->cmNumArgs)) : (NumSendTrampolines - 1))];
 				rewriteInlineCacheAttagtarget(backEnd, ((sqInt)mcpc), (targetMethod1->selector), unlinkedRoutine);
 				codeModified = 1;
@@ -14244,8 +14246,10 @@
 				}
 			}
 
+			/* begin unlinkSendAt:targetMethod:sendTable: */
 			unlinkedRoutine = sendTable1[((((targetMethod1->cmNumArgs)) < (NumSendTrampolines - 1)) ? ((targetMethod1->cmNumArgs)) : (NumSendTrampolines - 1))];
 			rewriteInlineCacheAttagtarget(backEnd, ((sqInt)mcpc), (targetMethod1->selector), unlinkedRoutine);
+			codeModified = 1;
 
 		}
 		else {
@@ -14292,6 +14296,7 @@
 			}
 
 			if ((((sqInt)targetMethod1)) == theCogMethod) {
+				/* begin unlinkSendAt:targetMethod:sendTable: */
 				unlinkedRoutine = sendTable1[((((targetMethod1->cmNumArgs)) < (NumSendTrampolines - 1)) ? ((targetMethod1->cmNumArgs)) : (NumSendTrampolines - 1))];
 				rewriteInlineCacheAttagtarget(backEnd, ((sqInt)mcpc), (targetMethod1->selector), unlinkedRoutine);
 				codeModified = 1;
@@ -14577,12 +14582,14 @@
 static void
 voidImplicitReceiverCacheAt(sqInt mcpc)
 {
-    usqInt cacheAddress;
+    sqInt cacheAddress;
 
 	assert(NumOopsPerIRC == 2);
 	cacheAddress = (((usqInt)mcpc)) + (jumpShortByteSize(backEnd));
 	unalignedLongAtput(backEnd, cacheAddress, 0);
 	unalignedLongAtput(backEnd, cacheAddress + BytesPerOop, 0);
+	codeModified = 1;
+
 }
 
 static AbstractInstruction *
@@ -14842,12 +14849,11 @@
 
 		}
 		/* begin maybeFreeCountersOf: */
-		(cogMethod->cmRefersToYoung = 0);
 	}
 	if (((cogMethod->cmType)) == CMOpenPIC) {
 		removeFromOpenPICList(cogMethod);
-		(cogMethod->cmRefersToYoung = 0);
 	}
+	(cogMethod->cmRefersToYoung = 0);
 	(cogMethod->cmType = CMFree);
 	methodBytesFreedSinceLastCompaction += (cogMethod->blockSize);
 }
@@ -15117,8 +15123,15 @@
 	while (pointer < limitAddress) {
 		cogMethod = ((CogMethod *) (longAt(pointer)));
 		if (!((cogMethod->cmRefersToYoung))) {
-			print("* ");
+			print("*");
 		}
+		if (((cogMethod->cmType)) == CMFree) {
+			print("!");
+		}
+		if (!(((cogMethod->cmRefersToYoung))
+			 && (((cogMethod->cmType)) != CMFree))) {
+			print(" ");
+		}
 		printCogMethod(cogMethod);
 		pointer += BytesPerWord;
 	}

Modified: branches/Cog/nscogsrc/vm/cogit.h
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.h	2014-09-18 17:12:31 UTC (rev 3081)
+++ branches/Cog/nscogsrc/vm/cogit.h	2014-09-25 17:53:41 UTC (rev 3082)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.880 uuid: 4aeaa3e0-8c6b-44b4-a124-128870605261
+	CCodeGenerator VMMaker.oscog-eem.882 uuid: f22a00ff-acaf-49b0-9f6d-44efec689c0d
  */
 
 

Modified: branches/Cog/nscogsrc/vm/cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.c	2014-09-18 17:12:31 UTC (rev 3081)
+++ branches/Cog/nscogsrc/vm/cointerp.c	2014-09-25 17:53:41 UTC (rev 3082)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.881 uuid: 539d444b-dd24-4254-a007-bd1e298e84f7
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.882 uuid: f22a00ff-acaf-49b0-9f6d-44efec689c0d
    from
-	CoInterpreter VMMaker.oscog-eem.881 uuid: 539d444b-dd24-4254-a007-bd1e298e84f7
+	CoInterpreter VMMaker.oscog-eem.882 uuid: f22a00ff-acaf-49b0-9f6d-44efec689c0d
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.881 uuid: 539d444b-dd24-4254-a007-bd1e298e84f7 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.882 uuid: f22a00ff-acaf-49b0-9f6d-44efec689c0d " __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;
@@ -923,7 +923,6 @@
 void * firstIndexableField(sqInt oop);
 sqInt firstLongFormat(void);
 static sqInt fixedFieldsOfformatlength(sqInt oop, sqInt fmt, sqInt wordLength) NoDbgRegParms;
-static void followForwardedObjectFieldstoDepth(sqInt objOop, sqInt depth) NoDbgRegParms;
 static sqInt followForwarded(sqInt objOop) NoDbgRegParms;
 sqInt formatOfClass(sqInt classPointer);
 static sqInt fwdBlockValid(sqInt addr) NoDbgRegParms;
@@ -2086,7 +2085,7 @@
 	/* 574 */ (void (*)(void))0,
 	/* 575 */ (void (*)(void))0,
  0 };
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.881";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.882";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -4385,7 +4384,7 @@
 						? ((longAt(localFP + FoxMethod)) & MFMethodFlagIsBlockFlag) != 0
 						: (byteAt((localFP + FoxIFrameFlags) + 3)) != 0))) {
 					goto commonCallerReturn;
-					goto l297;
+					goto l298;
 				}
 				closure = longAt(localFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(localFP + FoxMethod)))) < (startOfMemory())
 	? ((mframeCogMethod(localFP))->cmNumArgs)
@@ -4422,11 +4421,11 @@
 					theMethod = longAt((home + BaseHeaderSize) + (MethodIndex << ShiftForWord));
 					if ((primitiveIndexOfMethodheader(theMethod, methodHeaderOf(theMethod))) == 198) {
 						unwindContextOrNilOrZero = home;
-						goto l299;
+						goto l300;
 					}
 				}
 				unwindContextOrNilOrZero = ctxtOrNilOrZero;
-			l299:	/* end internalFindUnwindThroughContext: */;
+			l300:	/* end internalFindUnwindThroughContext: */;
 				if (unwindContextOrNilOrZero == GIV(nilObj)) {
 
 					/* error: can't find home on chain; cannot return */
@@ -4440,10 +4439,10 @@
 						: (byteAt((localFP + FoxIFrameFlags) + 2)) != 0)) {
 						assert(isContext(frameContext(localFP)));
 						ourContext = longAt(localFP + FoxThisContext);
-						goto l301;
+						goto l302;
 					}
 					ourContext = marryFrameSP(localFP, localSP);
-				l301:	/* end ensureFrameIsMarried:SP: */;
+				l302:	/* end ensureFrameIsMarried:SP: */;
 					/* begin internalPush: */
 					longAtPointerput((localSP -= BytesPerOop), ourContext);
 					/* begin internalPush: */
@@ -4452,7 +4451,7 @@
 					GIV(argumentCount) = 1;
 					goto normalSend;
 					/* return self */
-					goto l297;
+					goto l298;
 				}
 				if (unwindContextOrNilOrZero != 0) {
 					/* begin internalAboutToReturn:through: */
@@ -4464,10 +4463,10 @@
 						: (byteAt((localFP + FoxIFrameFlags) + 2)) != 0)) {
 						assert(isContext(frameContext(localFP)));
 						ourContext1 = longAt(localFP + FoxThisContext);
-						goto l298;
+						goto l299;
 					}
 					ourContext1 = marryFrameSP(localFP, localSP);
-				l298:	/* end ensureFrameIsMarried:SP: */;
+				l299:	/* end ensureFrameIsMarried:SP: */;
 					/* begin internalPush: */
 					longAtPointerput((localSP -= BytesPerOop), ourContext1);
 					/* begin internalPush: */
@@ -4478,7 +4477,7 @@
 					GIV(argumentCount) = 2;
 					goto normalSend;
 					/* return self */
-					goto l297;
+					goto l298;
 				}
 				contextToReturnTo = null;
 				if (((longAt((home + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1)) {
@@ -4537,10 +4536,10 @@
 							: (byteAt((localFP + FoxIFrameFlags) + 2)) != 0)) {
 							assert(isContext(frameContext(localFP)));
 							ourContext2 = longAt(localFP + FoxThisContext);
-							goto l300;
+							goto l301;
 						}
 						ourContext2 = marryFrameSP(localFP, localSP);
-					l300:	/* end ensureFrameIsMarried:SP: */;
+					l301:	/* end ensureFrameIsMarried:SP: */;
 						/* begin internalPush: */
 						longAtPointerput((localSP -= BytesPerOop), ourContext2);
 						/* begin internalPush: */
@@ -4549,7 +4548,7 @@
 						GIV(argumentCount) = 1;
 						goto normalSend;
 						/* return self */
-						goto l297;
+						goto l298;
 					}
 				}
 				assert(pageListIsWellFormed());
@@ -4660,7 +4659,7 @@
 						GIV(framePointer) = localFP;
 						
 						ceEnterCogCodePopReceiverReg();
-						goto l297;
+						goto l298;
 					}
 					localIP = pointerForOop(longAt(localFP + FoxIFSavedIP));
 				}
@@ -4678,7 +4677,7 @@
 
 				/* return self */
 			}
-		l297:	/* end case */;
+		l298:	/* end case */;
 			break;
 		case 121:
 			/* returnTrue */
@@ -4798,27 +4797,27 @@
 							fp = (thePage->headFP);
 							if (fp == theFP) {
 								frameAbove = 0;
-								goto l304;
+								goto l305;
 							}
 							while (((callerFP = frameCallerFP(fp))) != 0) {
 								if (callerFP == theFP) {
 									frameAbove = fp;
-									goto l304;
+									goto l305;
 								}
 								fp = callerFP;
 							}
 							error("did not find theFP in stack page");
 							frameAbove = 0;
-						l304:	/* end findFrameAbove:inPage: */;
+						l305:	/* end findFrameAbove:inPage: */;
 							/* begin newStackPage */
 							lruOrFree = ((mostRecentlyUsedPage())->nextPage);
 							if (isFree(lruOrFree)) {
 								newPage = lruOrFree;
-								goto l305;
+								goto l306;
 							}
 							divorceFramesIn(lruOrFree);
 							newPage = lruOrFree;
-						l305:	/* end newStackPage */;
+						l306:	/* end newStackPage */;
 							assert(newPage == GIV(stackPage));
 							moveFramesInthroughtoPage(thePage, frameAbove, newPage);
 							markStackPageMostRecentlyUsed(newPage);
@@ -4842,7 +4841,7 @@
 							longAtput((sp2 = GIV(stackPointer) - BytesPerWord), GIV(instructionPointer));
 							GIV(stackPointer) = sp2;
 							ceSendAborttonumArgs(longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SelectorCannotReturn << ShiftForWord)), contextToReturnFrom, 1);
-							goto l303;
+							goto l304;
 						}
 						GIV(instructionPointer) = 0;
 						thePage = makeBaseFrameFor(contextToReturnTo);
@@ -4881,7 +4880,7 @@
 							GIV(framePointer) = localFP;
 							
 							ceEnterCogCodePopReceiverReg();
-							goto l303;
+							goto l304;
 						}
 						localIP = pointerForOop(longAt(localFP + FoxIFSavedIP));
 					}
@@ -4899,8 +4898,8 @@
 					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
 					/* return self */
-				l303:	/* end baseFrameReturn */;
-					goto l302;
+				l304:	/* end baseFrameReturn */;
+					goto l303;
 				}
 				/* begin frameCallerSavedIP: */
 				localIP = pointerForOop(longAt(localFP + FoxCallerSavedIP));
@@ -4929,7 +4928,7 @@
 						GIV(framePointer) = localFP;
 						
 						ceEnterCogCodePopReceiverReg();
-						goto l302;
+						goto l303;
 					}
 					localIP = pointerForOop(longAt(localFP + FoxIFSavedIP));
 				}
@@ -4946,7 +4945,7 @@
 
 				longAtPointerput(localSP, localReturnValue);
 			}
-		l302:	/* end case */;
+		l303:	/* end case */;
 			break;
 		case 126:
 			/* dynamicSuperSendBytecode */
@@ -5238,7 +5237,7 @@
 						GIV(newMethod) = GIV(methodCache)[probe + MethodCacheMethod];
 						primitiveFunctionPointer = ((void (*)()) (GIV(methodCache)[probe + MethodCachePrimFunction]));
 						ok = 1;
-						goto l309;
+						goto l310;
 					}
 
 					/* second probe */
@@ -5249,7 +5248,7 @@
 						GIV(newMethod) = GIV(methodCache)[probe + MethodCacheMethod];
 						primitiveFunctionPointer = ((void (*)()) (GIV(methodCache)[probe + MethodCachePrimFunction]));
 						ok = 1;
-						goto l309;
+						goto l310;
 					}
 					probe = (((usqInt) hash) >> 2) & MethodCacheMask;
 					if (((GIV(methodCache)[probe + MethodCacheSelector]) == GIV(messageSelector))
@@ -5257,10 +5256,10 @@
 						GIV(newMethod) = GIV(methodCache)[probe + MethodCacheMethod];
 						primitiveFunctionPointer = ((void (*)()) (GIV(methodCache)[probe + MethodCachePrimFunction]));
 						ok = 1;
-						goto l309;
+						goto l310;
 					}
 					ok = 0;
-				l309:	/* end inlineLookupInMethodCacheSel:classTag: */;
+				l310:	/* end inlineLookupInMethodCacheSel:classTag: */;
 					if (ok) {
 						/* begin ifAppropriateCompileToNativeCode:selector: */
 						methodHeader2 = longAt((GIV(newMethod) + BaseHeaderSize) + (HeaderIndex << ShiftForWord));
@@ -5298,7 +5297,7 @@
 						localFP = pointerForOop(GIV(framePointer));
 						addNewMethodToCache(GIV(lkupClass));
 					}
-				l306:	/* end internalFindNewMethod */;
+				l307:	/* end internalFindNewMethod */;
 					/* begin internalExecuteNewMethod */
 					VM_LABEL(0internalExecuteNewMethod);
 					if (primitiveFunctionPointer != 0) {
@@ -5312,31 +5311,31 @@
 							if (localPrimIndex >= 264) {
 								longAtPointerput(localSP, longAt(((longAtPointer(localSP)) + BaseHeaderSize) + ((localPrimIndex - 264) << ShiftForWord)));
 								1;
-								goto l310;
+								goto l311;
 							}
 							if (localPrimIndex == 256) {
 								1;
-								goto l310;
+								goto l311;
 							}
 							if (localPrimIndex == 257) {
 								longAtPointerput(localSP, GIV(trueObj));
 								1;
-								goto l310;
+								goto l311;
 							}
 							if (localPrimIndex == 258) {
 								longAtPointerput(localSP, GIV(falseObj));
 								1;
-								goto l310;
+								goto l311;
 							}
 							if (localPrimIndex == 259) {
 								longAtPointerput(localSP, GIV(nilObj));
 								1;
-								goto l310;
+								goto l311;
 							}
 							longAtPointerput(localSP, (((localPrimIndex - 261) << 1) | 1));
 							1;
-						l310:	/* end internalQuickPrimitiveResponse */;
-							goto l308;
+						l311:	/* end internalQuickPrimitiveResponse */;
+							goto l309;
 						}
 						/* begin externalizeIPandSP */
 						assert((((usqInt)localIP)) != (ceReturnToInterpreterPC()));
@@ -5394,7 +5393,7 @@
 							returntoExecutive(popStack(), 1);
 							browserPluginReturnIfNeeded();
 							null;
-							goto l308;
+							goto l309;
 						}
 					}
 					if (methodHasCogMethod(GIV(newMethod))) {
@@ -5475,11 +5474,11 @@
 										table = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (PrimErrTableIndex << ShiftForWord));
 										if (GIV(primFailCode) <= ((lastPointerOf(table)) / BytesPerWord)) {
 											errorCode = longAt((table + BaseHeaderSize) + ((GIV(primFailCode) - 1) << ShiftForWord));
-											goto l307;
+											goto l308;
 										}
 									}
 									errorCode = ((GIV(primFailCode) << 1) | 1);
-								l307:	/* end getErrorObjectFromPrimFailCode */;
+								l308:	/* end getErrorObjectFromPrimFailCode */;
 									longAtPointerput(localSP, errorCode);
 								}
 								GIV(primFailCode) = 0;
@@ -5503,7 +5502,7 @@
 							localFP = pointerForOop(GIV(framePointer));
 						}
 					}
-				l308:	/* end internalExecuteNewMethod */;
+				l309:	/* end internalExecuteNewMethod */;
 					/* begin fetchNextBytecode */
 					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
@@ -6899,7 +6898,7 @@
 						/* begin fetchNextBytecode */
 						currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
-						goto l311;
+						goto l312;
 					}
 					if (bytecode == 172) {
 
@@ -6909,7 +6908,7 @@
 						/* begin fetchNextBytecode */
 						currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
-						goto l311;
+						goto l312;
 					}
 					if (bytecode > 167) {
 
@@ -6920,7 +6919,7 @@
 						localIP = (localIP + offset) + 1;
 						currentBytecode = (byteAtPointer(localIP)) + GIV(bytecodeSetSelector);
 
-						goto l311;
+						goto l312;
 					}
 				}
 				currentBytecode = bytecode + GIV(bytecodeSetSelector);
@@ -6928,7 +6927,7 @@
 				/* begin internalPush: */
 				longAtPointerput((localSP -= BytesPerOop), GIV(trueObj));
 			}
-		l311:	/* end case */;
+		l312:	/* end case */;
 			break;
 		case 179:
 			/* bytecodePrimGreaterThan */
@@ -7078,7 +7077,7 @@
 					localIP = (localIP + (bytecode - 151)) + 1;
 					currentBytecode = (byteAtPointer(localIP)) + GIV(bytecodeSetSelector);
 
-					goto l312;
+					goto l313;
 				}
 				if (bytecode == 172) {
 
@@ -7089,14 +7088,14 @@
 					localIP = (localIP + offset) + 1;
 					currentBytecode = (byteAtPointer(localIP)) + GIV(bytecodeSetSelector);
 
-					goto l312;
+					goto l313;
 				}
 				currentBytecode = bytecode + GIV(bytecodeSetSelector);
 
 				/* begin internalPush: */
 				longAtPointerput((localSP -= BytesPerOop), GIV(falseObj));
 			}
-		l312:	/* end case */;
+		l313:	/* end case */;
 			break;
 		case 180:
 			/* bytecodePrimLessOrEqual */
@@ -9793,7 +9792,7 @@
 						/* begin fetchNextBytecode */
 						currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
-						goto l313;
+						goto l314;
 					}
 					if (bytecode == 244) {
 
@@ -9803,7 +9802,7 @@
 						/* begin fetchNextBytecode */
 						currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
-						goto l313;
+						goto l314;
 					}
 					if (bytecode == 243) {
 
@@ -9814,7 +9813,7 @@
 						localIP = (localIP + offset) + 1;
 						currentBytecode = (byteAtPointer(localIP)) + GIV(bytecodeSetSelector);
 
-						goto l313;
+						goto l314;
 					}
 				}
 				currentBytecode = bytecode + GIV(bytecodeSetSelector);
@@ -9822,7 +9821,7 @@
 				/* begin internalPush: */
 				longAtPointerput((localSP -= BytesPerOop), GIV(trueObj));
 			}
-		l313:	/* end case */;
+		l314:	/* end case */;
 			break;
 		case 339: /*83*/
 			/* bytecodePrimGreaterThanV4 */
@@ -9972,7 +9971,7 @@
 					localIP = (localIP + (bytecode - 207)) + 1;
 					currentBytecode = (byteAtPointer(localIP)) + GIV(bytecodeSetSelector);
 
-					goto l314;
+					goto l315;
 				}
 				if (bytecode == 244) {
 
@@ -9983,14 +9982,14 @@
 					localIP = (localIP + offset) + 1;
 					currentBytecode = (byteAtPointer(localIP)) + GIV(bytecodeSetSelector);
 
-					goto l314;
+					goto l315;
 				}
 				currentBytecode = bytecode + GIV(bytecodeSetSelector);
 
 				/* begin internalPush: */
 				longAtPointerput((localSP -= BytesPerOop), GIV(falseObj));
 			}
-		l314:	/* end case */;
+		l315:	/* end case */;
 			break;
 		case 340: /*84*/
 			/* bytecodePrimLessOrEqualV4 */
@@ -12137,10 +12136,10 @@
 					: (byteAt((theFP + FoxIFrameFlags) + 2)) != 0)) {
 					assert(isContext(frameContext(theFP)));
 					ourContext = longAt(theFP + FoxThisContext);
-					goto l315;
+					goto l316;
 				}
 				ourContext = marryFrameSP(theFP, theSP);
-			l315:	/* end ensureFrameIsMarried:SP: */;
+			l316:	/* end ensureFrameIsMarried:SP: */;
 				localIP -= 1;
 				/* begin internalPush: */
 				longAtPointerput((localSP -= BytesPerOop), ourContext);
@@ -13043,11 +13042,13 @@
 			{
 				sqInt byte1;
 				sqInt byte2;
+				sqInt prim;
 
 				VM_LABEL(0callPrimitiveBytecode);
 				error("callPrimitiveBytecode should not be evaluated. method activation should step beyond this bytecode.");
 
 			}
+		l296:	/* end case */;
 			break;
 		case 509: /*253*/
 			/* extPushClosureBytecode */
@@ -13081,10 +13082,10 @@
 					: (byteAt((theFP + FoxIFrameFlags) + 2)) != 0)) {
 					assert(isContext(frameContext(theFP)));
 					context = longAt(theFP + FoxThisContext);
-					goto l296;
+					goto l297;
 				}
 				context = marryFrameSP(theFP, theSP);
-			l296:	/* end ensureFrameIsMarried:SP: */;
+			l297:	/* end ensureFrameIsMarried:SP: */;
 				/* begin closureIn:numArgs:instructionPointer:numCopiedValues: */
 				VM_LABEL(1closureInnumArgsinstructionPointernumCopiedValues);
 				newClosure1 = eeInstantiateSmallClassnumSlots(longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassBlockClosure << ShiftForWord)), ClosureFirstCopiedValueIndex + numCopied);
@@ -20426,7 +20427,6 @@
 synchronousSignal(sqInt aSemaphore)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt excessSignals;
-    sqInt firstLink;
 
 	if (isEmptyList(aSemaphore)) {
 
@@ -20446,7 +20446,7 @@
 		null;
 		return 0;
 	}
-	
+	/* begin ensureSemaphoreForwardedThroughContext: */
 	return resumepreemptedYieldingIffrom(removeFirstLinkOfList(aSemaphore), GIV(preemptionYields), CSSignal);
 }
 
@@ -36766,15 +36766,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;
 
@@ -36785,7 +36787,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;
@@ -36800,7 +36816,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)) {
 
@@ -36854,18 +36870,18 @@
 	}
 	/* begin safeObjectAfter: */
 	if (((longAt(newFreeChunk)) & TypeMask) == HeaderTypeFree) {
-		sz2 = (longAt(newFreeChunk)) & AllButTypeMask;
+		sz3 = (longAt(newFreeChunk)) & AllButTypeMask;
 	}
 	else {
 		/* begin sizeBitsOf: */
-		header3 = longAt(newFreeChunk);
-		sz2 = ((header3 & TypeMask) == HeaderTypeSizeAndClass
+		header4 = longAt(newFreeChunk);
+		sz3 = ((header4 & TypeMask) == HeaderTypeSizeAndClass
 			? (longAt(newFreeChunk - (BytesPerWord * 2))) & LongSizeMask
-			: header3 & SizeMask);
+			: header4 & SizeMask);
 	}
-	next = ((newFreeChunk + sz2) >= GIV(freeStart)
+	next = ((newFreeChunk + sz3) >= GIV(freeStart)
 		? GIV(freeStart)
-		: (newFreeChunk + sz2) + (headerTypeBytes[(longAt(newFreeChunk + sz2)) & TypeMask]));
+		: (newFreeChunk + sz3) + (headerTypeBytes[(longAt(newFreeChunk + sz3)) & TypeMask]));
 	assert((next == GIV(freeStart))
 	 || (next == (oopFromChunk(GIV(compEnd)))));
 	if (next == GIV(freeStart)) {
@@ -38737,7 +38753,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;
@@ -40850,12 +40866,6 @@
 	return (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 0x3F)) - 1;
 }
 
-static void
-followForwardedObjectFieldstoDepth(sqInt objOop, sqInt depth)
-{
-	error("shouldNotImplement");
-}
-
 static sqInt
 followForwarded(sqInt objOop)
 {

Modified: branches/Cog/nscogsrc/vm/cointerp.h
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.h	2014-09-18 17:12:31 UTC (rev 3081)
+++ branches/Cog/nscogsrc/vm/cointerp.h	2014-09-25 17:53:41 UTC (rev 3082)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.881 uuid: 539d444b-dd24-4254-a007-bd1e298e84f7
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.882 uuid: f22a00ff-acaf-49b0-9f6d-44efec689c0d
  */
 
 

Modified: branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2014-09-18 17:12:31 UTC (rev 3081)
+++ branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2014-09-25 17:53:41 UTC (rev 3082)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.881 uuid: 539d444b-dd24-4254-a007-bd1e298e84f7
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.882 uuid: f22a00ff-acaf-49b0-9f6d-44efec689c0d
    from
-	CoInterpreter VMMaker.oscog-eem.881 uuid: 539d444b-dd24-4254-a007-bd1e298e84f7
+	CoInterpreter VMMaker.oscog-eem.882 uuid: f22a00ff-acaf-49b0-9f6d-44efec689c0d
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.881 uuid: 539d444b-dd24-4254-a007-bd1e298e84f7 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.882 uuid: f22a00ff-acaf-49b0-9f6d-44efec689c0d " __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;
@@ -926,7 +926,6 @@
 void * firstIndexableField(sqInt oop);
 sqInt firstLongFormat(void);
 static sqInt fixedFieldsOfformatlength(sqInt oop, sqInt fmt, sqInt wordLength) NoDbgRegParms;
-static void followForwardedObjectFieldstoDepth(sqInt objOop, sqInt depth) NoDbgRegParms;
 static sqInt followForwarded(sqInt objOop) NoDbgRegParms;
 sqInt formatOfClass(sqInt classPointer);
 static sqInt fwdBlockValid(sqInt addr) NoDbgRegParms;
@@ -2089,7 +2088,7 @@
 	/* 574 */ (void (*)(void))0,
 	/* 575 */ (void (*)(void))0,
  0 };
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.881";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.882";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -4394,7 +4393,7 @@
 						? ((longAt(localFP + FoxMethod)) & MFMethodFlagIsBlockFlag) != 0
 						: (byteAt((localFP + FoxIFrameFlags) + 3)) != 0))) {
 					goto commonCallerReturn;
-					goto l297;
+					goto l298;
 				}
 				closure = longAt(localFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(localFP + FoxMethod)))) < (startOfMemory())
 	? ((mframeCogMethod(localFP))->cmNumArgs)
@@ -4431,11 +4430,11 @@
 					theMethod = longAt((home + BaseHeaderSize) + (MethodIndex << ShiftForWord));
 					if ((primitiveIndexOfMethodheader(theMethod, methodHeaderOf(theMethod))) == 198) {
 						unwindContextOrNilOrZero = home;
-						goto l299;
+						goto l300;
 					}
 				}
 				unwindContextOrNilOrZero = ctxtOrNilOrZero;
-			l299:	/* end internalFindUnwindThroughContext: */;
+			l300:	/* end internalFindUnwindThroughContext: */;
 				if (unwindContextOrNilOrZero == GIV(nilObj)) {
 
 					/* error: can't find home on chain; cannot return */
@@ -4449,10 +4448,10 @@
 						: (byteAt((localFP + FoxIFrameFlags) + 2)) != 0)) {
 						assert(isContext(frameContext(localFP)));
 						ourContext = longAt(localFP + FoxThisContext);
-						goto l301;
+						goto l302;
 					}
 					ourContext = marryFrameSP(localFP, localSP);
-				l301:	/* end ensureFrameIsMarried:SP: */;
+				l302:	/* end ensureFrameIsMarried:SP: */;
 					/* begin internalPush: */
 					longAtPointerput((localSP -= BytesPerOop), ourContext);
 					/* begin internalPush: */
@@ -4461,7 +4460,7 @@
 					GIV(argumentCount) = 1;
 					goto normalSend;
 					/* return self */
-					goto l297;
+					goto l298;
 				}
 				if (unwindContextOrNilOrZero != 0) {
 					/* begin internalAboutToReturn:through: */
@@ -4473,10 +4472,10 @@
 						: (byteAt((localFP + FoxIFrameFlags) + 2)) != 0)) {
 						assert(isContext(frameContext(localFP)));
 						ourContext1 = longAt(localFP + FoxThisContext);
-						goto l298;
+						goto l299;
 					}
 					ourContext1 = marryFrameSP(localFP, localSP);
-				l298:	/* end ensureFrameIsMarried:SP: */;
+				l299:	/* end ensureFrameIsMarried:SP: */;
 					/* begin internalPush: */
 					longAtPointerput((localSP -= BytesPerOop), ourContext1);
 					/* begin internalPush: */
@@ -4487,7 +4486,7 @@
 					GIV(argumentCount) = 2;
 					goto normalSend;
 					/* return self */
-					goto l297;
+					goto l298;
 				}
 				contextToReturnTo = null;
 				if (((longAt((home + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1)) {
@@ -4546,10 +4545,10 @@
 							: (byteAt((localFP + FoxIFrameFlags) + 2)) != 0)) {
 							assert(isContext(frameContext(localFP)));
 							ourContext2 = longAt(localFP + FoxThisContext);
-							goto l300;
+							goto l301;
 						}
 						ourContext2 = marryFrameSP(localFP, localSP);
-					l300:	/* end ensureFrameIsMarried:SP: */;
+					l301:	/* end ensureFrameIsMarried:SP: */;
 						/* begin internalPush: */
 						longAtPointerput((localSP -= BytesPerOop), ourContext2);
 						/* begin internalPush: */
@@ -4558,7 +4557,7 @@
 						GIV(argumentCount) = 1;
 						goto normalSend;
 						/* return self */
-						goto l297;
+						goto l298;
 					}
 				}
 				assert(pageListIsWellFormed());
@@ -4669,7 +4668,7 @@
 						GIV(framePointer) = localFP;
 						
 						ceEnterCogCodePopReceiverReg();
-						goto l297;
+						goto l298;
 					}
 					localIP = pointerForOop(longAt(localFP + FoxIFSavedIP));
 				}
@@ -4687,7 +4686,7 @@
 
 				/* return self */
 			}
-		l297:	/* end case */;
+		l298:	/* end case */;
 			BREAK;
 		CASE(121)
 			/* returnTrue */
@@ -4807,27 +4806,27 @@
 							fp = (thePage->headFP);
 							if (fp == theFP) {
 								frameAbove = 0;
-								goto l304;
+								goto l305;
 							}
 							while (((callerFP = frameCallerFP(fp))) != 0) {
 								if (callerFP == theFP) {
 									frameAbove = fp;
-									goto l304;
+									goto l305;
 								}
 								fp = callerFP;
 							}
 							error("did not find theFP in stack page");
 							frameAbove = 0;
-						l304:	/* end findFrameAbove:inPage: */;
+						l305:	/* end findFrameAbove:inPage: */;
 							/* begin newStackPage */
 							lruOrFree = ((mostRecentlyUsedPage())->nextPage);
 							if (isFree(lruOrFree)) {
 								newPage = lruOrFree;
-								goto l305;
+								goto l306;
 							}
 							divorceFramesIn(lruOrFree);
 							newPage = lruOrFree;
-						l305:	/* end newStackPage */;
+						l306:	/* end newStackPage */;
 							assert(newPage == GIV(stackPage));
 							moveFramesInthroughtoPage(thePage, frameAbove, newPage);
 							markStackPageMostRecentlyUsed(newPage);
@@ -4851,7 +4850,7 @@
 							longAtput((sp2 = GIV(stackPointer) - BytesPerWord), GIV(instructionPointer));
 							GIV(stackPointer) = sp2;
 							ceSendAborttonumArgs(longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SelectorCannotReturn << ShiftForWord)), contextToReturnFrom, 1);
-							goto l303;
+							goto l304;
 						}
 						GIV(instructionPointer) = 0;
 						thePage = makeBaseFrameFor(contextToReturnTo);
@@ -4890,7 +4889,7 @@
 							GIV(framePointer) = localFP;
 							
 							ceEnterCogCodePopReceiverReg();
-							goto l303;
+							goto l304;
 						}
 						localIP = pointerForOop(longAt(localFP + FoxIFSavedIP));
 					}
@@ -4908,8 +4907,8 @@
 					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
 					/* return self */
-				l303:	/* end baseFrameReturn */;
-					goto l302;
+				l304:	/* end baseFrameReturn */;
+					goto l303;
 				}
 				/* begin frameCallerSavedIP: */
 				localIP = pointerForOop(longAt(localFP + FoxCallerSavedIP));
@@ -4938,7 +4937,7 @@
 						GIV(framePointer) = localFP;
 						
 						ceEnterCogCodePopReceiverReg();
-						goto l302;
+						goto l303;
 					}
 					localIP = pointerForOop(longAt(localFP + FoxIFSavedIP));
 				}
@@ -4955,7 +4954,7 @@
 
 				longAtPointerput(localSP, localReturnValue);
 			}
-		l302:	/* end case */;
+		l303:	/* end case */;
 			BREAK;
 		CASE(126)
 			/* dynamicSuperSendBytecode */
@@ -5247,7 +5246,7 @@
 						GIV(newMethod) = GIV(methodCache)[probe + MethodCacheMethod];
 						primitiveFunctionPointer = ((void (*)()) (GIV(methodCache)[probe + MethodCachePrimFunction]));
 						ok = 1;
-						goto l309;
+						goto l310;
 					}
 
 					/* second probe */
@@ -5258,7 +5257,7 @@
 						GIV(newMethod) = GIV(methodCache)[probe + MethodCacheMethod];
 						primitiveFunctionPointer = ((void (*)()) (GIV(methodCache)[probe + MethodCachePrimFunction]));
 						ok = 1;
-						goto l309;
+						goto l310;
 					}
 					probe = (((usqInt) hash) >> 2) & MethodCacheMask;
 					if (((GIV(methodCache)[probe + MethodCacheSelector]) == GIV(messageSelector))
@@ -5266,10 +5265,10 @@
 						GIV(newMethod) = GIV(methodCache)[probe + MethodCacheMethod];
 						primitiveFunctionPointer = ((void (*)()) (GIV(methodCache)[probe + MethodCachePrimFunction]));
 						ok = 1;
-						goto l309;
+						goto l310;
 					}
 					ok = 0;
-				l309:	/* end inlineLookupInMethodCacheSel:classTag: */;
+				l310:	/* end inlineLookupInMethodCacheSel:classTag: */;
 					if (ok) {
 						/* begin ifAppropriateCompileToNativeCode:selector: */
 						methodHeader2 = longAt((GIV(newMethod) + BaseHeaderSize) + (HeaderIndex << ShiftForWord));
@@ -5307,7 +5306,7 @@
 						localFP = pointerForOop(GIV(framePointer));
 						addNewMethodToCache(GIV(lkupClass));
 					}
-				l306:	/* end internalFindNewMethod */;
+				l307:	/* end internalFindNewMethod */;
 					/* begin internalExecuteNewMethod */
 					VM_LABEL(0internalExecuteNewMethod);
 					if (primitiveFunctionPointer != 0) {
@@ -5321,31 +5320,31 @@
 							if (localPrimIndex >= 264) {
 								longAtPointerput(localSP, longAt(((longAtPointer(localSP)) + BaseHeaderSize) + ((localPrimIndex - 264) << ShiftForWord)));
 								1;
-								goto l310;
+								goto l311;
 							}
 							if (localPrimIndex == 256) {
 								1;
-								goto l310;
+								goto l311;
 							}
 							if (localPrimIndex == 257) {
 								longAtPointerput(localSP, GIV(trueObj));
 								1;
-								goto l310;
+								goto l311;
 							}
 							if (localPrimIndex == 258) {
 								longAtPointerput(localSP, GIV(falseObj));
 								1;
-								goto l310;
+								goto l311;
 							}
 							if (localPrimIndex == 259) {
 								longAtPointerput(localSP, GIV(nilObj));
 								1;
-								goto l310;
+								goto l311;
 							}
 							longAtPointerput(localSP, (((localPrimIndex - 261) << 1) | 1));
 							1;
-						l310:	/* end internalQuickPrimitiveResponse */;
-							goto l308;
+						l311:	/* end internalQuickPrimitiveResponse */;
+							goto l309;
 						}
 						/* begin externalizeIPandSP */
 						assert((((usqInt)localIP)) != (ceReturnToInterpreterPC()));
@@ -5403,7 +5402,7 @@
 							returntoExecutive(popStack(), 1);
 							browserPluginReturnIfNeeded();
 							null;
-							goto l308;
+							goto l309;
 						}
 					}
 					if (methodHasCogMethod(GIV(newMethod))) {
@@ -5484,11 +5483,11 @@
 										table = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (PrimErrTableIndex << ShiftForWord));
 										if (GIV(primFailCode) <= ((lastPointerOf(table)) / BytesPerWord)) {
 											errorCode = longAt((table + BaseHeaderSize) + ((GIV(primFailCode) - 1) << ShiftForWord));
-											goto l307;
+											goto l308;
 										}
 									}
 									errorCode = ((GIV(primFailCode) << 1) | 1);
-								l307:	/* end getErrorObjectFromPrimFailCode */;
+								l308:	/* end getErrorObjectFromPrimFailCode */;
 									longAtPointerput(localSP, errorCode);
 								}
 								GIV(primFailCode) = 0;
@@ -5512,7 +5511,7 @@
 							localFP = pointerForOop(GIV(framePointer));
 						}
 					}
-				l308:	/* end internalExecuteNewMethod */;
+				l309:	/* end internalExecuteNewMethod */;
 					/* begin fetchNextBytecode */
 					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
@@ -6908,7 +6907,7 @@
 						/* begin fetchNextBytecode */
 						currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
-						goto l311;
+						goto l312;
 					}
 					if (bytecode == 172) {
 
@@ -6918,7 +6917,7 @@
 						/* begin fetchNextBytecode */
 						currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
-						goto l311;
+						goto l312;
 					}
 					if (bytecode > 167) {
 
@@ -6929,7 +6928,7 @@
 						localIP = (localIP + offset) + 1;
 						currentBytecode = (byteAtPointer(localIP)) + GIV(bytecodeSetSelector);
 
-						goto l311;
+						goto l312;
 					}
 				}
 				currentBytecode = bytecode + GIV(bytecodeSetSelector);
@@ -6937,7 +6936,7 @@
 				/* begin internalPush: */
 				longAtPointerput((localSP -= BytesPerOop), GIV(trueObj));
 			}
-		l311:	/* end case */;
+		l312:	/* end case */;
 			BREAK;
 		CASE(179)
 			/* bytecodePrimGreaterThan */
@@ -7087,7 +7086,7 @@
 					localIP = (localIP + (bytecode - 151)) + 1;
 					currentBytecode = (byteAtPointer(localIP)) + GIV(bytecodeSetSelector);
 
-					goto l312;
+					goto l313;
 				}
 				if (bytecode == 172) {
 
@@ -7098,14 +7097,14 @@
 					localIP = (localIP + offset) + 1;
 					currentBytecode = (byteAtPointer(localIP)) + GIV(bytecodeSetSelector);
 
-					goto l312;
+					goto l313;
 				}
 				currentBytecode = bytecode + GIV(bytecodeSetSelector);
 
 				/* begin internalPush: */
 				longAtPointerput((localSP -= BytesPerOop), GIV(falseObj));
 			}
-		l312:	/* end case */;
+		l313:	/* end case */;
 			BREAK;
 		CASE(180)
 			/* bytecodePrimLessOrEqual */
@@ -9802,7 +9801,7 @@
 						/* begin fetchNextBytecode */
 						currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
-						goto l313;
+						goto l314;
 					}
 					if (bytecode == 244) {
 
@@ -9812,7 +9811,7 @@
 						/* begin fetchNextBytecode */
 						currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
-						goto l313;
+						goto l314;
 					}
 					if (bytecode == 243) {
 
@@ -9823,7 +9822,7 @@
 						localIP = (localIP + offset) + 1;
 						currentBytecode = (byteAtPointer(localIP)) + GIV(bytecodeSetSelector);
 
-						goto l313;
+						goto l314;
 					}
 				}
 				currentBytecode = bytecode + GIV(bytecodeSetSelector);
@@ -9831,7 +9830,7 @@
 				/* begin internalPush: */
 				longAtPointerput((localSP -= BytesPerOop), GIV(trueObj));
 			}
-		l313:	/* end case */;
+		l314:	/* end case */;
 			BREAK;
 		CASE(339) /*83*/
 			/* bytecodePrimGreaterThanV4 */
@@ -9981,7 +9980,7 @@
 					localIP = (localIP + (bytecode - 207)) + 1;
 					currentBytecode = (byteAtPointer(localIP)) + GIV(bytecodeSetSelector);
 
-					goto l314;
+					goto l315;
 				}
 				if (bytecode == 244) {
 
@@ -9992,14 +9991,14 @@
 					localIP = (localIP + offset) + 1;
 					currentBytecode = (byteAtPointer(localIP)) + GIV(bytecodeSetSelector);
 
-					goto l314;
+					goto l315;
 				}
 				currentBytecode = bytecode + GIV(bytecodeSetSelector);
 
 				/* begin internalPush: */
 				longAtPointerput((localSP -= BytesPerOop), GIV(falseObj));
 			}
-		l314:	/* end case */;
+		l315:	/* end case */;
 			BREAK;
 		CASE(340) /*84*/
 			/* bytecodePrimLessOrEqualV4 */
@@ -12146,10 +12145,10 @@
 					: (byteAt((theFP + FoxIFrameFlags) + 2)) != 0)) {
 					assert(isContext(frameContext(theFP)));
 					ourContext = longAt(theFP + FoxThisContext);
-					goto l315;
+					goto l316;
 				}
 				ourContext = marryFrameSP(theFP, theSP);
-			l315:	/* end ensureFrameIsMarried:SP: */;
+			l316:	/* end ensureFrameIsMarried:SP: */;
 				localIP -= 1;
 				/* begin internalPush: */
 				longAtPointerput((localSP -= BytesPerOop), ourContext);
@@ -13052,11 +13051,13 @@
 			{
 				sqInt byte1;
 				sqInt byte2;
+				sqInt prim;
 
 				VM_LABEL(0callPrimitiveBytecode);
 				error("callPrimitiveBytecode should not be evaluated. method activation should step beyond this bytecode.");
 
 			}
+		l296:	/* end case */;
 			BREAK;
 		CASE(509) /*253*/
 			/* extPushClosureBytecode */
@@ -13090,10 +13091,10 @@
 					: (byteAt((theFP + FoxIFrameFlags) + 2)) != 0)) {
 					assert(isContext(frameContext(theFP)));
 					context = longAt(theFP + FoxThisContext);
-					goto l296;
+					goto l297;
 				}
 				context = marryFrameSP(theFP, theSP);
-			l296:	/* end ensureFrameIsMarried:SP: */;
+			l297:	/* end ensureFrameIsMarried:SP: */;
 				/* begin closureIn:numArgs:instructionPointer:numCopiedValues: */
 				VM_LABEL(1closureInnumArgsinstructionPointernumCopiedValues);
 				newClosure1 = eeInstantiateSmallClassnumSlots(longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassBlockClosure << ShiftForWord)), ClosureFirstCopiedValueIndex + numCopied);
@@ -20435,7 +20436,6 @@
 synchronousSignal(sqInt aSemaphore)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt excessSignals;
-    sqInt firstLink;
 
 	if (isEmptyList(aSemaphore)) {
 
@@ -20455,7 +20455,7 @@
 		null;
 		return 0;
 	}
-	
+	/* begin ensureSemaphoreForwardedThroughContext: */
 	return resumepreemptedYieldingIffrom(removeFirstLinkOfList(aSemaphore), GIV(preemptionYields), CSSignal);
 }
 
@@ -36775,15 +36775,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;
 
@@ -36794,7 +36796,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;
@@ -36809,7 +36825,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)) {
 
@@ -36863,18 +36879,18 @@
 	}
 	/* begin safeObjectAfter: */
 	if (((longAt(newFreeChunk)) & TypeMask) == HeaderTypeFree) {
-		sz2 = (longAt(newFreeChunk)) & AllButTypeMask;
+		sz3 = (longAt(newFreeChunk)) & AllButTypeMask;
 	}
 	else {
 		/* begin sizeBitsOf: */
-		header3 = longAt(newFreeChunk);
-		sz2 = ((header3 & TypeMask) == HeaderTypeSizeAndClass
+		header4 = longAt(newFreeChunk);
+		sz3 = ((header4 & TypeMask) == HeaderTypeSizeAndClass
 			? (longAt(newFreeChunk - (BytesPerWord * 2))) & LongSizeMask
-			: header3 & SizeMask);
+			: header4 & SizeMask);
 	}
-	next = ((newFreeChunk + sz2) >= GIV(freeStart)
+	next = ((newFreeChunk + sz3) >= GIV(freeStart)
 		? GIV(freeStart)
-		: (newFreeChunk + sz2) + (headerTypeBytes[(longAt(newFreeChunk + sz2)) & TypeMask]));
+		: (newFreeChunk + sz3) + (headerTypeBytes[(longAt(newFreeChunk + sz3)) & TypeMask]));
 	assert((next == GIV(freeStart))
 	 || (next == (oopFromChunk(GIV(compEnd)))));
 	if (next == GIV(freeStart)) {
@@ -38746,7 +38762,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;
@@ -40859,12 +40875,6 @@
 	return (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 0x3F)) - 1;
 }
 
-static void
-followForwardedObjectFieldstoDepth(sqInt objOop, sqInt depth)
-{
-	error("shouldNotImplement");
-}
-
 static sqInt
 followForwarded(sqInt objOop)
 {

Modified: branches/Cog/nsspursrc/vm/cogit.c
===================================================================
--- branches/Cog/nsspursrc/vm/cogit.c	2014-09-18 17:12:31 UTC (rev 3081)
+++ branches/Cog/nsspursrc/vm/cogit.c	2014-09-25 17:53:41 UTC (rev 3082)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.880 uuid: 4aeaa3e0-8c6b-44b4-a124-128870605261
+	CCodeGenerator VMMaker.oscog-eem.882 uuid: f22a00ff-acaf-49b0-9f6d-44efec689c0d
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.880 uuid: 4aeaa3e0-8c6b-44b4-a124-128870605261
+	StackToRegisterMappingCogit VMMaker.oscog-eem.882 uuid: f22a00ff-acaf-49b0-9f6d-44efec689c0d
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.880 uuid: 4aeaa3e0-8c6b-44b4-a124-128870605261 " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.882 uuid: f22a00ff-acaf-49b0-9f6d-44efec689c0d " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -9367,7 +9367,8 @@
 		voidYoungReferrersPostTenureAll();
 	}
 	assert(allMethodsHaveCorrectHeader());
-	assert(kosherYoungReferrers());
+	assert((gcMode == GCModeBecome)
+	 || (kosherYoungReferrers()));
 }
 
 
@@ -10555,8 +10556,6 @@
 	}
 	if (freedPIC) {
 		unlinkSendsToFree();
-		pruneYoungReferrers();
-		flushICacheFromto(processor, codeBase, ((sqInt)(limitZony())));
 	}
 }
 
@@ -10655,8 +10654,6 @@
 	}
 	if (freedMethod) {
 		unlinkSendsToFree();
-		pruneYoungReferrers();
-		flushICacheFromto(processor, codeBase, ((sqInt)(limitZony())));
 	}
 }
 
@@ -12225,10 +12222,8 @@
 		}
 		cogMethod = ((CogMethod *) (roundUpLength((((sqInt)cogMethod)) + ((cogMethod->blockSize)))));
 	}
-	pruneYoungReferrers();
 	if (freedPIC) {
 		unlinkSendsToFree();
-		codeModified = 1;
 	}
 	if (codeModified) {
 
@@ -14039,6 +14034,7 @@
 
 			if ((((targetMethod1->cmType)) == CMFree)
 			 || (((targetMethod1->selector)) == theSelector)) {
+				/* begin unlinkSendAt:targetMethod:sendTable: */
 				unlinkedRoutine = sendTable1[((((targetMethod1->cmNumArgs)) < (NumSendTrampolines - 1)) ? ((targetMethod1->cmNumArgs)) : (NumSendTrampolines - 1))];
 				rewriteInlineCacheAttagtarget(backEnd, ((sqInt)mcpc), (targetMethod1->selector), unlinkedRoutine);
 				codeModified = 1;
@@ -14090,6 +14086,7 @@
 			}
 
 			if (((targetMethod1->cmType)) == CMFree) {
+				/* begin unlinkSendAt:targetMethod:sendTable: */
 				unlinkedRoutine = sendTable1[((((targetMethod1->cmNumArgs)) < (NumSendTrampolines - 1)) ? ((targetMethod1->cmNumArgs)) : (NumSendTrampolines - 1))];
 				rewriteInlineCacheAttagtarget(backEnd, ((sqInt)mcpc), (targetMethod1->selector), unlinkedRoutine);
 				codeModified = 1;
@@ -14133,8 +14130,10 @@
 				}
 			}
 
+			/* begin unlinkSendAt:targetMethod:sendTable: */
 			unlinkedRoutine = sendTable1[((((targetMethod1->cmNumArgs)) < (NumSendTrampolines - 1)) ? ((targetMethod1->cmNumArgs)) : (NumSendTrampolines - 1))];
 			rewriteInlineCacheAttagtarget(backEnd, ((sqInt)mcpc), (targetMethod1->selector), unlinkedRoutine);
+			codeModified = 1;
 
 		}
 		else {
@@ -14181,6 +14180,7 @@
 			}
 
 			if ((((sqInt)targetMethod1)) == theCogMethod) {
+				/* begin unlinkSendAt:targetMethod:sendTable: */
 				unlinkedRoutine = sendTable1[((((targetMethod1->cmNumArgs)) < (NumSendTrampolines - 1)) ? ((targetMethod1->cmNumArgs)) : (NumSendTrampolines - 1))];
 				rewriteInlineCacheAttagtarget(backEnd, ((sqInt)mcpc), (targetMethod1->selector), unlinkedRoutine);
 				codeModified = 1;
@@ -14472,6 +14472,7 @@
 	cacheAddress = implicitReceiveCacheAt(backEnd, mcpc);
 	unalignedLongAtput(backEnd, cacheAddress, 0);
 	unalignedLongAtput(backEnd, cacheAddress + BytesPerOop, 0);
+	
 }
 
 static AbstractInstruction *
@@ -14740,12 +14741,11 @@
 
 		}
 		/* begin maybeFreeCountersOf: */

@@ Diff output truncated at 50000 characters. @@


More information about the Vm-dev mailing list