[Vm-dev] [commit][2828] CogVM source as per VMMaker.oscog-eem.558.

commits at squeakvm.org commits at squeakvm.org
Wed Dec 11 23:17:12 UTC 2013


Revision: 2828
Author:   eliot
Date:     2013-12-11 15:17:12 -0800 (Wed, 11 Dec 2013)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.558.

Implement Spur snapshot & fix freeChunk swizzlng on load.

Internal refactoring of snapshot preparation.

Modified Paths:
--------------
    branches/Cog/nscogsrc/vm/cointerp.c
    branches/Cog/nscogsrc/vm/cointerp.h
    branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
    branches/Cog/nscogsrc/vm/interp.h
    branches/Cog/nscogsrc/vm/vmCallback.h
    branches/Cog/spursrc/vm/cointerp.c
    branches/Cog/spursrc/vm/cointerp.h
    branches/Cog/spursrc/vm/gcc3x-cointerp.c
    branches/Cog/spursrc/vm/interp.h
    branches/Cog/spursrc/vm/vmCallback.h
    branches/Cog/spurstacksrc/vm/gcc3x-interp.c
    branches/Cog/spurstacksrc/vm/interp.c
    branches/Cog/spurstacksrc/vm/interp.h
    branches/Cog/spurstacksrc/vm/vmCallback.h
    branches/Cog/src/vm/cointerp.c
    branches/Cog/src/vm/cointerp.h
    branches/Cog/src/vm/cointerpmt.c
    branches/Cog/src/vm/cointerpmt.h
    branches/Cog/src/vm/gcc3x-cointerp.c
    branches/Cog/src/vm/gcc3x-cointerpmt.c
    branches/Cog/src/vm/interp.h
    branches/Cog/src/vm/vmCallback.h
    branches/Cog/stacksrc/vm/gcc3x-interp.c
    branches/Cog/stacksrc/vm/interp.c
    branches/Cog/stacksrc/vm/interp.h
    branches/Cog/stacksrc/vm/vmCallback.h

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

Modified: branches/Cog/nscogsrc/vm/cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.c	2013-12-11 23:14:18 UTC (rev 2827)
+++ branches/Cog/nscogsrc/vm/cointerp.c	2013-12-11 23:17:12 UTC (rev 2828)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.555 uuid: 9b99d897-eecb-4b11-97c9-7f7a75c7d8b0
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.558 uuid: ef7afd3b-c404-472c-a05a-9d9c6d905052
    from
-	CoInterpreter VMMaker.oscog-eem.555 uuid: 9b99d897-eecb-4b11-97c9-7f7a75c7d8b0
+	CoInterpreter VMMaker.oscog-eem.558 uuid: ef7afd3b-c404-472c-a05a-9d9c6d905052
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.555 uuid: 9b99d897-eecb-4b11-97c9-7f7a75c7d8b0 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.558 uuid: ef7afd3b-c404-472c-a05a-9d9c6d905052 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -1244,7 +1244,7 @@
 static void verifyCleanHeaders(void);
 sqInt vmEndianness(void);
 static void voidLongRunningPrimitive(char *reason);
-static sqInt voidVMStateForSnapshot(void);
+static sqInt voidVMStateForSnapshotFlushingExternalPrimitivesIf(sqInt flushExtPrims);
 static sqInt wakeHighestPriority(void);
 sqInt weakArrayFormat(void);
 sqInt withoutForwardingOnandsendToCogit(sqInt obj1, sqInt obj2, sqInt (*selector)(sqInt,sqInt));
@@ -1297,11 +1297,11 @@
 _iss sqInt needGCFlag;
 _iss usqInt fwdTableNext;
 _iss sqInt longRunningPrimitiveCheckSemaphore;
+_iss sqInt tempOop;
 _iss sqInt profileProcess;
 _iss sqInt profileSemaphore;
 _iss usqInt compStart;
 _iss sqInt extraRootCount;
-_iss sqInt tempOop;
 _iss sqInt classNameIndex;
 _iss sqInt weakRootCount;
 _iss sqInt longRunningPrimitiveCheckMethod;
@@ -2030,7 +2030,7 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void);
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.555";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.558";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
@@ -39148,7 +39148,7 @@
 		/* begin push: */
 		longAtput((sp = GIV(stackPointer) - BytesPerWord), GIV(instructionPointer));
 		GIV(stackPointer) = sp;
-		activeContext = voidVMStateForSnapshot();
+		activeContext = voidVMStateForSnapshotFlushingExternalPrimitivesIf(0);
 		marryContextInNewStackPageAndInitializeInterpreterRegisters(activeContext);
 		assert((((stackValue(0)) == (nilObject()))
  && (GIV(longRunningPrimitiveCheckSemaphore) == null))
@@ -40919,7 +40919,7 @@
 		/* begin push: */
 		longAtput((sp = GIV(stackPointer) - BytesPerWord), GIV(instructionPointer));
 		GIV(stackPointer) = sp;
-		activeContext = voidVMStateForSnapshot();
+		activeContext = voidVMStateForSnapshotFlushingExternalPrimitivesIf(0);
 		marryContextInNewStackPageAndInitializeInterpreterRegisters(activeContext);
 		assert((((stackValue(0)) == (nilObject()))
  && (GIV(profileSemaphore) == (nilObject())))
@@ -45501,7 +45501,7 @@
 	/* begin push: */
 	longAtput((sp = GIV(stackPointer) - BytesPerWord), GIV(instructionPointer));
 	GIV(stackPointer) = sp;
-	activeContext = voidVMStateForSnapshot();
+	activeContext = voidVMStateForSnapshotFlushingExternalPrimitivesIf(0);
 	marryContextInNewStackPageAndInitializeInterpreterRegisters(activeContext);
 	siglongjmp(reenterInterpreter, ReturnToInterpreter);
 }
@@ -51609,29 +51609,17 @@
     sqInt activateCogMethod;
     sqInt activeContext;
     sqInt activeProc;
-    sqInt chunk;
     CogMethod *cogMethod;
     sqInt errorCode;
-    sqInt fmt;
-    sqInt fwdBlock;
-    sqInt header;
-    sqInt header1;
-    sqInt header2;
     sqInt i;
-    sqInt i1;
-    sqInt iLimiT;
     usqInt initialIP;
     sqInt methodHeader;
     sqInt numArgs;
     sqInt numTemps;
-    sqInt obj;
     sqInt object;
     sqInt oop;
-    sqInt oop1;
-    sqInt oop2;
     sqInt rcvr;
     sqInt rcvr1;
-    sqInt realHeader;
     void *setMacType;
     char *sp;
     char *sp1;
@@ -51647,8 +51635,6 @@
     char *sp8;
     char *sp9;
     sqInt stackIndex;
-    sqInt sz1;
-    sqInt sz2;
     sqInt table;
 
 
@@ -51664,101 +51650,20 @@
 
 	/* update state of active process */
 
-	activeContext = voidVMStateForSnapshot();
+	activeContext = voidVMStateForSnapshotFlushingExternalPrimitivesIf(1);
 	activeProc = longAt(((longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SchedulerAssociation << ShiftForWord))) + BaseHeaderSize) + (ValueIndex << ShiftForWord))) + BaseHeaderSize) + (ActiveProcessIndex << ShiftForWord));
 	/* begin storePointer:ofObject:withValue: */
 	if ((((usqInt) activeProc)) < (((usqInt) GIV(youngStart)))) {
 		possibleRootStoreIntovalue(activeProc, activeContext);
 	}
 	longAtput((activeProc + BaseHeaderSize) + (SuspendedContextIndex << ShiftForWord), activeContext);
-	/* begin pushRemappableOop: */
-	assert(addressCouldBeOop(activeContext));
-	GIV(remapBuffer)[(GIV(remapBufferCount) += 1)] = activeContext;
-	if (!(GIV(remapBufferCount) <= RemapBufferSize)) {
-		error("remapBuffer overflow");
-	}
-	/* begin snapshotCleanUp */
+	GIV(tempOop) = activeContext;
+	/* begin garbageCollectForSnapshot */
 	incrementalGC();
-
 	fullGC();
-	/* begin bereaveAndNormalizeContextsAndFlushExternalPrimitives */
-	/* begin allObjectsDo: */
-	/* begin oopFromChunk: */
-	chunk = startOfMemory();
-	oop2 = chunk + (headerTypeBytes[(longAt(chunk)) & TypeMask]);
-	while (oop2 < GIV(freeStart)) {
-		if (!(((longAt(oop2)) & TypeMask) == HeaderTypeFree)) {
-			header = longAt(oop2);
-
-			/* Clean out context */
-
-			fmt = (((usqInt) header) >> (instFormatFieldLSB())) & 15;
-			if ((fmt == 3)
-			 && (((((usqInt) header) >> 12) & 0x1F) == ClassMethodContextCompactIndex)) {
-
-				/* All contexts have been divorced. Bereave remaining widows. */
-
-				if (((longAt((oop2 + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1)) {
-					/* begin markContextAsDead: */
-					assert(isContext(oop2));
-					longAtput((oop2 + BaseHeaderSize) + (SenderIndex << ShiftForWord), GIV(nilObj));
-					longAtput((oop2 + BaseHeaderSize) + (InstructionPointerIndex << ShiftForWord), GIV(nilObj));
-				}
-				for (i1 = ((fetchStackPointerOf(oop2)) + CtxtTempFrameStart), iLimiT = ((numSlotsOf(oop2)) - 1); i1 <= iLimiT; i1 += 1) {
-					longAtput((oop2 + BaseHeaderSize) + (i1 << ShiftForWord), GIV(nilObj));
-				}
-			}
-			if (fmt >= 12) {
-
-				/* Its primitiveExternalCall */
-
-				if ((primitiveIndexOfMethodheader(oop2, headerOf(oop2))) == PrimitiveExternalCallIndex) {
-					flushExternalPrimitiveOf(oop2);
-				}
-			}
-
-		}
-		/* begin objectAfterWhileForwarding: */
-		header1 = longAt(oop2);
-		if ((header1 & MarkBit) == 0) {
-			/* begin objectAfter: */
-			if (!(asserta(oopisLessThan(oop2, GIV(freeStart))))) {
-				error("no objects after the end of memory");
-			}
-			if (((longAt(oop2)) & TypeMask) == HeaderTypeFree) {
-				sz2 = (longAt(oop2)) & AllButTypeMask;
-			}
-			else {
-				/* begin sizeBitsOf: */
-				header2 = longAt(oop2);
-				sz2 = ((header2 & TypeMask) == HeaderTypeSizeAndClass
-					? (longAt(oop2 - (BytesPerWord * 2))) & LongSizeMask
-					: header2 & SizeMask);
-			}
-			oop2 = (oop2 + sz2) + (headerTypeBytes[(longAt(oop2 + sz2)) & TypeMask]);
-			goto l2;
-		}
-		fwdBlock = (header1 & AllButMarkBitAndTypeMask) << 1;
-		assert(fwdBlockValid(fwdBlock));
-
-		/* following code is like sizeBitsOf: */
-
-		realHeader = longAt(fwdBlock + BytesPerWord);
-		if ((realHeader & TypeMask) == HeaderTypeSizeAndClass) {
-			sz1 = (longAt(oop2 - (BytesPerWord * 2))) & LongSizeMask;
-		}
-		else {
-			sz1 = realHeader & SizeMask;
-		}
-		oop2 = (oop2 + sz1) + (headerTypeBytes[(longAt(oop2 + sz1)) & TypeMask]);
-	l2:	/* end objectAfterWhileForwarding: */;
-	}
 	clearRootsTable();
-
-	/* begin popRemappableOop */
-	oop1 = GIV(remapBuffer)[GIV(remapBufferCount)];
-	GIV(remapBufferCount) -= 1;
-	activeContext = oop1;
+	activeContext = GIV(tempOop);
+	GIV(tempOop) = 0;
 	if (!GIV(primFailCode)) {
 
 		/* Without contexts or stacks simulate
@@ -54489,22 +54394,31 @@
 
 
 /*	Make sure that all VM state that affects the heap contents is voided so
-	that the heap is ready
-	to be snapshotted. Answer the activeContext object that should be stored
-	in the snapshot.
- */
+	that the heap is
+	ready to be snapshotted. If flushExtPrims is true, flush references to
+	external primitives in methods. Answer the activeContext that should be
+	stored in the snapshot. */
+/*	Make sure that all VM state that affects the heap contents is voided so
+	that the heap is
+	ready to be snapshotted. If flushExtPrims is true, flush references to
+	external primitives in methods. Answer the activeContext that should be
+	stored in the snapshot. */
 
 static sqInt
-voidVMStateForSnapshot(void)
+voidVMStateForSnapshotFlushingExternalPrimitivesIf(sqInt flushExtPrims)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt activeContext;
+    sqInt activeContext1;
     sqInt chunk;
     sqInt decodedIP;
+    sqInt fmt;
     sqInt fwdBlock;
     sqInt header;
     sqInt header1;
+    sqInt i;
+    sqInt iLimiT;
+    sqInt obj;
     sqInt oop;
-    sqInt oop1;
     sqInt realHeader;
     sqInt sz;
     sqInt sz1;
@@ -54513,53 +54427,67 @@
 	/* in case of code compactions. */
 
 	GIV(instructionPointer) = 0;
-	activeContext = divorceAllFrames();
-	/* begin ensureAllContextsHaveBytecodePCsOrAreBereaved */
+	activeContext1 = divorceAllFrames();
+	/* begin bereaveAllMarriedContextsForSnapshotFlushingExternalPrimitivesIf: */
 	/* begin allObjectsDo: */
 	/* begin oopFromChunk: */
 	chunk = startOfMemory();
-	oop1 = chunk + (headerTypeBytes[(longAt(chunk)) & TypeMask]);
-	while (oop1 < GIV(freeStart)) {
-		if (!(((longAt(oop1)) & TypeMask) == HeaderTypeFree)) {
-			if (((((usqInt) (longAt(oop1))) >> 12) & 0x1F) == ClassMethodContextCompactIndex) {
-				if (((longAt((oop1 + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1)) {
+	oop = chunk + (headerTypeBytes[(longAt(chunk)) & TypeMask]);
+	while (oop < GIV(freeStart)) {
+		if (!(((longAt(oop)) & TypeMask) == HeaderTypeFree)) {
+			fmt = (((usqInt) (longAt(oop))) >> (instFormatFieldLSB())) & 15;
+			if ((fmt == 3)
+			 && (((((usqInt) (longAt(oop))) >> 12) & 0x1F) == ClassMethodContextCompactIndex)) {
+				if (((longAt((oop + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1)) {
 
 					/* The stack pages have already been discarded.  Any remaining married contexts are actually widows. */
 
 					/* begin markContextAsDead: */
-					assert(isContext(oop1));
-					longAtput((oop1 + BaseHeaderSize) + (SenderIndex << ShiftForWord), GIV(nilObj));
-					longAtput((oop1 + BaseHeaderSize) + (InstructionPointerIndex << ShiftForWord), GIV(nilObj));
+					assert(isContext(oop));
+					longAtput((oop + BaseHeaderSize) + (SenderIndex << ShiftForWord), GIV(nilObj));
+					longAtput((oop + BaseHeaderSize) + (InstructionPointerIndex << ShiftForWord), GIV(nilObj));
 				}
 				else {
-					decodedIP = longAt((oop1 + BaseHeaderSize) + (InstructionPointerIndex << ShiftForWord));
+					decodedIP = longAt((oop + BaseHeaderSize) + (InstructionPointerIndex << ShiftForWord));
 					if (((decodedIP & 1))
 					 && ((((sqInt) decodedIP)) < 0)) {
-						decodedIP = mustMapMachineCodePCcontext((decodedIP >> 1), oop1);
-						longAtput((oop1 + BaseHeaderSize) + (InstructionPointerIndex << ShiftForWord), decodedIP);
+						decodedIP = mustMapMachineCodePCcontext((decodedIP >> 1), oop);
+						longAtput((oop + BaseHeaderSize) + (InstructionPointerIndex << ShiftForWord), decodedIP);
 					}
 				}
+				for (i = ((fetchStackPointerOf(oop)) + CtxtTempFrameStart), iLimiT = ((numSlotsOf(oop)) - 1); i <= iLimiT; i += 1) {
+					longAtput((oop + BaseHeaderSize) + (i << ShiftForWord), GIV(nilObj));
+				}
 			}
+			if (flushExtPrims
+			 && (fmt >= 12)) {
 
+				/* Its primitiveExternalCall */
+
+				if ((primitiveIndexOfMethodheader(oop, headerOf(oop))) == PrimitiveExternalCallIndex) {
+					flushExternalPrimitiveOf(oop);
+				}
+			}
+
 		}
 		/* begin objectAfterWhileForwarding: */
-		header = longAt(oop1);
+		header = longAt(oop);
 		if ((header & MarkBit) == 0) {
 			/* begin objectAfter: */
-			if (!(asserta(oopisLessThan(oop1, GIV(freeStart))))) {
+			if (!(asserta(oopisLessThan(oop, GIV(freeStart))))) {
 				error("no objects after the end of memory");
 			}
-			if (((longAt(oop1)) & TypeMask) == HeaderTypeFree) {
-				sz1 = (longAt(oop1)) & AllButTypeMask;
+			if (((longAt(oop)) & TypeMask) == HeaderTypeFree) {
+				sz1 = (longAt(oop)) & AllButTypeMask;
 			}
 			else {
 				/* begin sizeBitsOf: */
-				header1 = longAt(oop1);
+				header1 = longAt(oop);
 				sz1 = ((header1 & TypeMask) == HeaderTypeSizeAndClass
-					? (longAt(oop1 - (BytesPerWord * 2))) & LongSizeMask
+					? (longAt(oop - (BytesPerWord * 2))) & LongSizeMask
 					: header1 & SizeMask);
 			}
-			oop1 = (oop1 + sz1) + (headerTypeBytes[(longAt(oop1 + sz1)) & TypeMask]);
+			oop = (oop + sz1) + (headerTypeBytes[(longAt(oop + sz1)) & TypeMask]);
 			goto l1;
 		}
 		fwdBlock = (header & AllButMarkBitAndTypeMask) << 1;
@@ -54569,14 +54497,15 @@
 
 		realHeader = longAt(fwdBlock + BytesPerWord);
 		if ((realHeader & TypeMask) == HeaderTypeSizeAndClass) {
-			sz = (longAt(oop1 - (BytesPerWord * 2))) & LongSizeMask;
+			sz = (longAt(oop - (BytesPerWord * 2))) & LongSizeMask;
 		}
 		else {
 			sz = realHeader & SizeMask;
 		}
-		oop1 = (oop1 + sz) + (headerTypeBytes[(longAt(oop1 + sz)) & TypeMask]);
+		oop = (oop + sz) + (headerTypeBytes[(longAt(oop + sz)) & TypeMask]);
 	l1:	/* end objectAfterWhileForwarding: */;
 	}
+	activeContext = activeContext1;
 	voidCogCompiledCode();
 	return activeContext;
 }

Modified: branches/Cog/nscogsrc/vm/cointerp.h
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.h	2013-12-11 23:14:18 UTC (rev 2827)
+++ branches/Cog/nscogsrc/vm/cointerp.h	2013-12-11 23:17:12 UTC (rev 2828)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.555 uuid: 9b99d897-eecb-4b11-97c9-7f7a75c7d8b0
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.558 uuid: ef7afd3b-c404-472c-a05a-9d9c6d905052
  */
 
 

Modified: branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2013-12-11 23:14:18 UTC (rev 2827)
+++ branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2013-12-11 23:17:12 UTC (rev 2828)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.555 uuid: 9b99d897-eecb-4b11-97c9-7f7a75c7d8b0
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.558 uuid: ef7afd3b-c404-472c-a05a-9d9c6d905052
    from
-	CoInterpreter VMMaker.oscog-eem.555 uuid: 9b99d897-eecb-4b11-97c9-7f7a75c7d8b0
+	CoInterpreter VMMaker.oscog-eem.558 uuid: ef7afd3b-c404-472c-a05a-9d9c6d905052
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.555 uuid: 9b99d897-eecb-4b11-97c9-7f7a75c7d8b0 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.558 uuid: ef7afd3b-c404-472c-a05a-9d9c6d905052 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -1247,7 +1247,7 @@
 static void verifyCleanHeaders(void);
 sqInt vmEndianness(void);
 static void voidLongRunningPrimitive(char *reason);
-static sqInt voidVMStateForSnapshot(void);
+static sqInt voidVMStateForSnapshotFlushingExternalPrimitivesIf(sqInt flushExtPrims);
 static sqInt wakeHighestPriority(void);
 sqInt weakArrayFormat(void);
 sqInt withoutForwardingOnandsendToCogit(sqInt obj1, sqInt obj2, sqInt (*selector)(sqInt,sqInt));
@@ -1300,11 +1300,11 @@
 _iss sqInt needGCFlag;
 _iss usqInt fwdTableNext;
 _iss sqInt longRunningPrimitiveCheckSemaphore;
+_iss sqInt tempOop;
 _iss sqInt profileProcess;
 _iss sqInt profileSemaphore;
 _iss usqInt compStart;
 _iss sqInt extraRootCount;
-_iss sqInt tempOop;
 _iss sqInt classNameIndex;
 _iss sqInt weakRootCount;
 _iss sqInt longRunningPrimitiveCheckMethod;
@@ -2033,7 +2033,7 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void);
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.555";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.558";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
@@ -39157,7 +39157,7 @@
 		/* begin push: */
 		longAtput((sp = GIV(stackPointer) - BytesPerWord), GIV(instructionPointer));
 		GIV(stackPointer) = sp;
-		activeContext = voidVMStateForSnapshot();
+		activeContext = voidVMStateForSnapshotFlushingExternalPrimitivesIf(0);
 		marryContextInNewStackPageAndInitializeInterpreterRegisters(activeContext);
 		assert((((stackValue(0)) == (nilObject()))
  && (GIV(longRunningPrimitiveCheckSemaphore) == null))
@@ -40928,7 +40928,7 @@
 		/* begin push: */
 		longAtput((sp = GIV(stackPointer) - BytesPerWord), GIV(instructionPointer));
 		GIV(stackPointer) = sp;
-		activeContext = voidVMStateForSnapshot();
+		activeContext = voidVMStateForSnapshotFlushingExternalPrimitivesIf(0);
 		marryContextInNewStackPageAndInitializeInterpreterRegisters(activeContext);
 		assert((((stackValue(0)) == (nilObject()))
  && (GIV(profileSemaphore) == (nilObject())))
@@ -45510,7 +45510,7 @@
 	/* begin push: */
 	longAtput((sp = GIV(stackPointer) - BytesPerWord), GIV(instructionPointer));
 	GIV(stackPointer) = sp;
-	activeContext = voidVMStateForSnapshot();
+	activeContext = voidVMStateForSnapshotFlushingExternalPrimitivesIf(0);
 	marryContextInNewStackPageAndInitializeInterpreterRegisters(activeContext);
 	siglongjmp(reenterInterpreter, ReturnToInterpreter);
 }
@@ -51618,29 +51618,17 @@
     sqInt activateCogMethod;
     sqInt activeContext;
     sqInt activeProc;
-    sqInt chunk;
     CogMethod *cogMethod;
     sqInt errorCode;
-    sqInt fmt;
-    sqInt fwdBlock;
-    sqInt header;
-    sqInt header1;
-    sqInt header2;
     sqInt i;
-    sqInt i1;
-    sqInt iLimiT;
     usqInt initialIP;
     sqInt methodHeader;
     sqInt numArgs;
     sqInt numTemps;
-    sqInt obj;
     sqInt object;
     sqInt oop;
-    sqInt oop1;
-    sqInt oop2;
     sqInt rcvr;
     sqInt rcvr1;
-    sqInt realHeader;
     void *setMacType;
     char *sp;
     char *sp1;
@@ -51656,8 +51644,6 @@
     char *sp8;
     char *sp9;
     sqInt stackIndex;
-    sqInt sz1;
-    sqInt sz2;
     sqInt table;
 
 
@@ -51673,101 +51659,20 @@
 
 	/* update state of active process */
 
-	activeContext = voidVMStateForSnapshot();
+	activeContext = voidVMStateForSnapshotFlushingExternalPrimitivesIf(1);
 	activeProc = longAt(((longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SchedulerAssociation << ShiftForWord))) + BaseHeaderSize) + (ValueIndex << ShiftForWord))) + BaseHeaderSize) + (ActiveProcessIndex << ShiftForWord));
 	/* begin storePointer:ofObject:withValue: */
 	if ((((usqInt) activeProc)) < (((usqInt) GIV(youngStart)))) {
 		possibleRootStoreIntovalue(activeProc, activeContext);
 	}
 	longAtput((activeProc + BaseHeaderSize) + (SuspendedContextIndex << ShiftForWord), activeContext);
-	/* begin pushRemappableOop: */
-	assert(addressCouldBeOop(activeContext));
-	GIV(remapBuffer)[(GIV(remapBufferCount) += 1)] = activeContext;
-	if (!(GIV(remapBufferCount) <= RemapBufferSize)) {
-		error("remapBuffer overflow");
-	}
-	/* begin snapshotCleanUp */
+	GIV(tempOop) = activeContext;
+	/* begin garbageCollectForSnapshot */
 	incrementalGC();
-
 	fullGC();
-	/* begin bereaveAndNormalizeContextsAndFlushExternalPrimitives */
-	/* begin allObjectsDo: */
-	/* begin oopFromChunk: */
-	chunk = startOfMemory();
-	oop2 = chunk + (headerTypeBytes[(longAt(chunk)) & TypeMask]);
-	while (oop2 < GIV(freeStart)) {
-		if (!(((longAt(oop2)) & TypeMask) == HeaderTypeFree)) {
-			header = longAt(oop2);
-
-			/* Clean out context */
-
-			fmt = (((usqInt) header) >> (instFormatFieldLSB())) & 15;
-			if ((fmt == 3)
-			 && (((((usqInt) header) >> 12) & 0x1F) == ClassMethodContextCompactIndex)) {
-
-				/* All contexts have been divorced. Bereave remaining widows. */
-
-				if (((longAt((oop2 + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1)) {
-					/* begin markContextAsDead: */
-					assert(isContext(oop2));
-					longAtput((oop2 + BaseHeaderSize) + (SenderIndex << ShiftForWord), GIV(nilObj));
-					longAtput((oop2 + BaseHeaderSize) + (InstructionPointerIndex << ShiftForWord), GIV(nilObj));
-				}
-				for (i1 = ((fetchStackPointerOf(oop2)) + CtxtTempFrameStart), iLimiT = ((numSlotsOf(oop2)) - 1); i1 <= iLimiT; i1 += 1) {
-					longAtput((oop2 + BaseHeaderSize) + (i1 << ShiftForWord), GIV(nilObj));
-				}
-			}
-			if (fmt >= 12) {
-
-				/* Its primitiveExternalCall */
-
-				if ((primitiveIndexOfMethodheader(oop2, headerOf(oop2))) == PrimitiveExternalCallIndex) {
-					flushExternalPrimitiveOf(oop2);
-				}
-			}
-
-		}
-		/* begin objectAfterWhileForwarding: */
-		header1 = longAt(oop2);
-		if ((header1 & MarkBit) == 0) {
-			/* begin objectAfter: */
-			if (!(asserta(oopisLessThan(oop2, GIV(freeStart))))) {
-				error("no objects after the end of memory");
-			}
-			if (((longAt(oop2)) & TypeMask) == HeaderTypeFree) {
-				sz2 = (longAt(oop2)) & AllButTypeMask;
-			}
-			else {
-				/* begin sizeBitsOf: */
-				header2 = longAt(oop2);
-				sz2 = ((header2 & TypeMask) == HeaderTypeSizeAndClass
-					? (longAt(oop2 - (BytesPerWord * 2))) & LongSizeMask
-					: header2 & SizeMask);
-			}
-			oop2 = (oop2 + sz2) + (headerTypeBytes[(longAt(oop2 + sz2)) & TypeMask]);
-			goto l2;
-		}
-		fwdBlock = (header1 & AllButMarkBitAndTypeMask) << 1;
-		assert(fwdBlockValid(fwdBlock));
-
-		/* following code is like sizeBitsOf: */
-
-		realHeader = longAt(fwdBlock + BytesPerWord);
-		if ((realHeader & TypeMask) == HeaderTypeSizeAndClass) {
-			sz1 = (longAt(oop2 - (BytesPerWord * 2))) & LongSizeMask;
-		}
-		else {
-			sz1 = realHeader & SizeMask;
-		}
-		oop2 = (oop2 + sz1) + (headerTypeBytes[(longAt(oop2 + sz1)) & TypeMask]);
-	l2:	/* end objectAfterWhileForwarding: */;
-	}
 	clearRootsTable();
-
-	/* begin popRemappableOop */
-	oop1 = GIV(remapBuffer)[GIV(remapBufferCount)];
-	GIV(remapBufferCount) -= 1;
-	activeContext = oop1;
+	activeContext = GIV(tempOop);
+	GIV(tempOop) = 0;
 	if (!GIV(primFailCode)) {
 
 		/* Without contexts or stacks simulate
@@ -54498,22 +54403,31 @@
 
 
 /*	Make sure that all VM state that affects the heap contents is voided so
-	that the heap is ready
-	to be snapshotted. Answer the activeContext object that should be stored
-	in the snapshot.
- */
+	that the heap is
+	ready to be snapshotted. If flushExtPrims is true, flush references to
+	external primitives in methods. Answer the activeContext that should be
+	stored in the snapshot. */
+/*	Make sure that all VM state that affects the heap contents is voided so
+	that the heap is
+	ready to be snapshotted. If flushExtPrims is true, flush references to
+	external primitives in methods. Answer the activeContext that should be
+	stored in the snapshot. */
 
 static sqInt
-voidVMStateForSnapshot(void)
+voidVMStateForSnapshotFlushingExternalPrimitivesIf(sqInt flushExtPrims)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt activeContext;
+    sqInt activeContext1;
     sqInt chunk;
     sqInt decodedIP;
+    sqInt fmt;
     sqInt fwdBlock;
     sqInt header;
     sqInt header1;
+    sqInt i;
+    sqInt iLimiT;
+    sqInt obj;
     sqInt oop;
-    sqInt oop1;
     sqInt realHeader;
     sqInt sz;
     sqInt sz1;
@@ -54522,53 +54436,67 @@
 	/* in case of code compactions. */
 
 	GIV(instructionPointer) = 0;
-	activeContext = divorceAllFrames();
-	/* begin ensureAllContextsHaveBytecodePCsOrAreBereaved */
+	activeContext1 = divorceAllFrames();
+	/* begin bereaveAllMarriedContextsForSnapshotFlushingExternalPrimitivesIf: */
 	/* begin allObjectsDo: */
 	/* begin oopFromChunk: */
 	chunk = startOfMemory();
-	oop1 = chunk + (headerTypeBytes[(longAt(chunk)) & TypeMask]);
-	while (oop1 < GIV(freeStart)) {
-		if (!(((longAt(oop1)) & TypeMask) == HeaderTypeFree)) {
-			if (((((usqInt) (longAt(oop1))) >> 12) & 0x1F) == ClassMethodContextCompactIndex) {
-				if (((longAt((oop1 + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1)) {
+	oop = chunk + (headerTypeBytes[(longAt(chunk)) & TypeMask]);
+	while (oop < GIV(freeStart)) {
+		if (!(((longAt(oop)) & TypeMask) == HeaderTypeFree)) {
+			fmt = (((usqInt) (longAt(oop))) >> (instFormatFieldLSB())) & 15;
+			if ((fmt == 3)
+			 && (((((usqInt) (longAt(oop))) >> 12) & 0x1F) == ClassMethodContextCompactIndex)) {
+				if (((longAt((oop + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1)) {
 
 					/* The stack pages have already been discarded.  Any remaining married contexts are actually widows. */
 
 					/* begin markContextAsDead: */
-					assert(isContext(oop1));
-					longAtput((oop1 + BaseHeaderSize) + (SenderIndex << ShiftForWord), GIV(nilObj));
-					longAtput((oop1 + BaseHeaderSize) + (InstructionPointerIndex << ShiftForWord), GIV(nilObj));
+					assert(isContext(oop));
+					longAtput((oop + BaseHeaderSize) + (SenderIndex << ShiftForWord), GIV(nilObj));
+					longAtput((oop + BaseHeaderSize) + (InstructionPointerIndex << ShiftForWord), GIV(nilObj));
 				}
 				else {
-					decodedIP = longAt((oop1 + BaseHeaderSize) + (InstructionPointerIndex << ShiftForWord));
+					decodedIP = longAt((oop + BaseHeaderSize) + (InstructionPointerIndex << ShiftForWord));
 					if (((decodedIP & 1))
 					 && ((((sqInt) decodedIP)) < 0)) {
-						decodedIP = mustMapMachineCodePCcontext((decodedIP >> 1), oop1);
-						longAtput((oop1 + BaseHeaderSize) + (InstructionPointerIndex << ShiftForWord), decodedIP);
+						decodedIP = mustMapMachineCodePCcontext((decodedIP >> 1), oop);
+						longAtput((oop + BaseHeaderSize) + (InstructionPointerIndex << ShiftForWord), decodedIP);
 					}
 				}
+				for (i = ((fetchStackPointerOf(oop)) + CtxtTempFrameStart), iLimiT = ((numSlotsOf(oop)) - 1); i <= iLimiT; i += 1) {
+					longAtput((oop + BaseHeaderSize) + (i << ShiftForWord), GIV(nilObj));
+				}
 			}
+			if (flushExtPrims
+			 && (fmt >= 12)) {
 
+				/* Its primitiveExternalCall */
+
+				if ((primitiveIndexOfMethodheader(oop, headerOf(oop))) == PrimitiveExternalCallIndex) {
+					flushExternalPrimitiveOf(oop);
+				}
+			}
+
 		}
 		/* begin objectAfterWhileForwarding: */
-		header = longAt(oop1);
+		header = longAt(oop);
 		if ((header & MarkBit) == 0) {
 			/* begin objectAfter: */
-			if (!(asserta(oopisLessThan(oop1, GIV(freeStart))))) {
+			if (!(asserta(oopisLessThan(oop, GIV(freeStart))))) {
 				error("no objects after the end of memory");
 			}
-			if (((longAt(oop1)) & TypeMask) == HeaderTypeFree) {
-				sz1 = (longAt(oop1)) & AllButTypeMask;
+			if (((longAt(oop)) & TypeMask) == HeaderTypeFree) {
+				sz1 = (longAt(oop)) & AllButTypeMask;
 			}
 			else {
 				/* begin sizeBitsOf: */
-				header1 = longAt(oop1);
+				header1 = longAt(oop);
 				sz1 = ((header1 & TypeMask) == HeaderTypeSizeAndClass
-					? (longAt(oop1 - (BytesPerWord * 2))) & LongSizeMask
+					? (longAt(oop - (BytesPerWord * 2))) & LongSizeMask
 					: header1 & SizeMask);
 			}
-			oop1 = (oop1 + sz1) + (headerTypeBytes[(longAt(oop1 + sz1)) & TypeMask]);
+			oop = (oop + sz1) + (headerTypeBytes[(longAt(oop + sz1)) & TypeMask]);
 			goto l1;
 		}
 		fwdBlock = (header & AllButMarkBitAndTypeMask) << 1;
@@ -54578,14 +54506,15 @@
 
 		realHeader = longAt(fwdBlock + BytesPerWord);
 		if ((realHeader & TypeMask) == HeaderTypeSizeAndClass) {
-			sz = (longAt(oop1 - (BytesPerWord * 2))) & LongSizeMask;
+			sz = (longAt(oop - (BytesPerWord * 2))) & LongSizeMask;
 		}
 		else {
 			sz = realHeader & SizeMask;
 		}
-		oop1 = (oop1 + sz) + (headerTypeBytes[(longAt(oop1 + sz)) & TypeMask]);
+		oop = (oop + sz) + (headerTypeBytes[(longAt(oop + sz)) & TypeMask]);
 	l1:	/* end objectAfterWhileForwarding: */;
 	}
+	activeContext = activeContext1;
 	voidCogCompiledCode();
 	return activeContext;
 }

Modified: branches/Cog/nscogsrc/vm/interp.h
===================================================================
--- branches/Cog/nscogsrc/vm/interp.h	2013-12-11 23:14:18 UTC (rev 2827)
+++ branches/Cog/nscogsrc/vm/interp.h	2013-12-11 23:17:12 UTC (rev 2828)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.555 uuid: 9b99d897-eecb-4b11-97c9-7f7a75c7d8b0
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.558 uuid: ef7afd3b-c404-472c-a05a-9d9c6d905052
  */
 
 #define VM_PROXY_MAJOR 1

Modified: branches/Cog/nscogsrc/vm/vmCallback.h
===================================================================
--- branches/Cog/nscogsrc/vm/vmCallback.h	2013-12-11 23:14:18 UTC (rev 2827)
+++ branches/Cog/nscogsrc/vm/vmCallback.h	2013-12-11 23:17:12 UTC (rev 2828)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.555 uuid: 9b99d897-eecb-4b11-97c9-7f7a75c7d8b0
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.558 uuid: ef7afd3b-c404-472c-a05a-9d9c6d905052
  */
 
 #define VM_CALLBACK_INC 1


Property changes on: branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
___________________________________________________________________
Modified: checkindate
   - Tue Dec 10 17:30:58 PST 2013
   + Wed Dec 11 15:15:14 PST 2013

Modified: branches/Cog/spursrc/vm/cointerp.c
===================================================================
--- branches/Cog/spursrc/vm/cointerp.c	2013-12-11 23:14:18 UTC (rev 2827)
+++ branches/Cog/spursrc/vm/cointerp.c	2013-12-11 23:17:12 UTC (rev 2828)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.555 uuid: 9b99d897-eecb-4b11-97c9-7f7a75c7d8b0
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.558 uuid: ef7afd3b-c404-472c-a05a-9d9c6d905052
    from
-	CoInterpreter VMMaker.oscog-eem.555 uuid: 9b99d897-eecb-4b11-97c9-7f7a75c7d8b0
+	CoInterpreter VMMaker.oscog-eem.558 uuid: ef7afd3b-c404-472c-a05a-9d9c6d905052
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.555 uuid: 9b99d897-eecb-4b11-97c9-7f7a75c7d8b0 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.558 uuid: ef7afd3b-c404-472c-a05a-9d9c6d905052 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -399,6 +399,7 @@
 void beRootIfOld(sqInt oop);
 static sqInt bitsSetInFreeSpaceMaskForAllFreeLists(void);
 sqInt booleanValueOf(sqInt obj);
+static sqInt bootstrapping(void);
 static sqInt bridgeAt(sqInt segIndex);
 static sqInt bridgeFor(SpurSegmentInfo *aSegment);
 static void bridgeFromto(SpurSegmentInfo *aSegment, SpurSegmentInfo *nextSegmentOrNil);
@@ -521,6 +522,7 @@
 char * cStringOrNullFor(sqInt oop);
 static double dbgFloatValueOf(sqInt oop);
 static sqInt defaultCogCodeSize(void);
+static sqInt defaultEdenBytes(void);
 static sqInt defaultNumStackPages(void);
 static sqInt deferStackLimitSmashAroundwith(void (*functionSymbol)(sqInt), sqInt arg);
 static void detachFreeObject(sqInt freeChunk);
@@ -1174,6 +1176,7 @@
 sqInt printFrame(char *theFP);
 void printFrameWithSP(char *theFP, char *theSP);
 void printFreeChunk(sqInt freeChunk);
+void printFreeList(sqInt chunkOrIndex);
 void printHex(sqInt n);
 void printInstancesOf(sqInt aClassOop);
 void printInstancesWithClassIndex(sqInt classIndex);
@@ -1360,7 +1363,7 @@
 static sqInt validStackPageBaseFrame(StackPage *aPage);
 sqInt vmEndianness(void);
 static void voidLongRunningPrimitive(char *reason);
-static sqInt voidVMStateForSnapshot(void);
+static sqInt voidVMStateForSnapshotFlushingExternalPrimitivesIf(sqInt flushExtPrims);
 static sqInt wakeHighestPriority(void);
 sqInt weakArrayFormat(void);
 sqInt withoutForwardingOnandsendToCogit(sqInt obj1, sqInt obj2, sqInt (*selector)(sqInt,sqInt));
@@ -1395,8 +1398,8 @@
 _iss usqInt freeStart;
 _iss SpurCircularBuffer highestObjects;
 _iss usqInt endOfMemory;
-_iss sqInt remapBufferCount;
 _iss sqInt totalFreeOldSpace;
+_iss sqInt remapBufferCount;
 _iss sqInt trueObj;
 _iss sqInt falseObj;
 _iss sqInt traceLogIndex;
@@ -1411,9 +1414,9 @@
 _iss sqInt weaklingStack;
 _iss SpurContiguousObjStack unscannedEphemerons;
 _iss SpurNewSpaceSpace futureSpace;
+_iss sqInt numSegments;
 _iss StackPage * mostRecentlyUsedPage;
 _iss usqInt newSpaceStart;
-_iss sqInt numSegments;
 _iss unsigned char primTraceLogIndex;
 _iss sqInt numStackPages;
 _iss sqInt classTableFirstPage;
@@ -1427,19 +1430,19 @@
 _iss sqInt markStack;
 _iss sqInt numClassTablePages;
 _iss sqInt longRunningPrimitiveCheckSemaphore;
+_iss sqInt tempOop;
 _iss SpurNewSpaceSpace eden;
 _iss sqInt profileProcess;
 _iss sqInt profileSemaphore;
 _iss sqInt tenureThreshold;
 _iss sqInt ephemeronList;
 _iss sqInt needGCFlag;
-_iss sqInt tempOop;
+_iss sqInt extraRootCount;
 _iss char * objStackInvalidBecause;
 _iss sqInt previousRememberedSetSize;
 _iss unsigned char * classTableBitmap;
 _iss sqInt longRunningPrimitiveCheckMethod;
 _iss sqInt ephemeronQueue;
-_iss sqInt extraRootCount;
 _iss sqInt lastMethodCacheProbeWrite;
 _iss sqInt lkupClass;
 _iss sqInt profileMethod;
@@ -1469,6 +1472,7 @@
 _iss sqInt statIOProcessEvents;
 _iss sqInt weakList;
 _iss sqInt backwardJumpCount;
+_iss sqInt firstSegmentSize;
 _iss usqLong gcStartUsecs;
 _iss usqInt memory;
 _iss sqInt noThreadingOfGUIThread;
@@ -1477,7 +1481,6 @@
 _iss sqInt statCompactPassCount;
 _iss sqInt thisClassIndex;
 _iss sqInt externalPrimitiveTableFirstFreeIndex;
-_iss sqInt firstSegmentSize;
 _iss sqInt fullScreenFlag;
 _iss sqInt interruptPending;
 _iss sqInt lastHash;
@@ -1525,8 +1528,8 @@
 _iss sqInt the2ndUnknownShort;
 _iss long methodCache[MethodCacheSize + 1 /* 4097 */];
 _iss sqInt traceLog[TraceBufferSize /* 768 */];
-_iss sqInt remapBuffer[RemapBufferSize + 1 /* 26 */];
 _iss sqInt atCache[AtCacheTotalSize + 1 /* 65 */];
+_iss sqInt remapBuffer[RemapBufferSize + 1 /* 26 */];
 _iss sqInt rememberedSet[RememberedSetLimit + 1 /* 65537 */];
 _iss sqInt primTraceLog[256];
 _iss sqInt *extraRoots[ExtraRootsSize + 1 /* 2049 */];
@@ -2159,7 +2162,7 @@
  0 };
 static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void);
 usqInt heapBase;
-const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.555]";
+const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.558]";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
@@ -11053,7 +11056,8 @@
 	   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 	prevPrevObj = (prevObj = null);
-	assert((((pastSpace()).start)) < (((eden()).start)));
+	assert((bootstrapping())
+	 || ((((pastSpace()).start)) < (((eden()).start))));
 	/* begin objectStartingAt: */
 	address = ((pastSpace()).start);
 	/* begin rawNumSlotsOf: */
@@ -12776,6 +12780,12 @@
 }
 
 static sqInt
+bootstrapping(void)
+{
+	return 0;
+}
+
+static sqInt
 bridgeAt(sqInt segIndex)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt address;
@@ -14666,7 +14676,8 @@
 	   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 	prevPrevObj = (prevObj = null);
-	assert((((pastSpace()).start)) < (((eden()).start)));
+	assert((bootstrapping())
+	 || ((((pastSpace()).start)) < (((eden()).start))));
 	/* begin objectStartingAt: */
 	address = ((pastSpace()).start);
 	/* begin rawNumSlotsOf: */
@@ -14990,7 +15001,8 @@
 	   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 	prevPrevObj = (prevObj = null);
-	assert((((pastSpace()).start)) < (((eden()).start)));
+	assert((bootstrapping())
+	 || ((((pastSpace()).start)) < (((eden()).start))));
 	/* begin objectStartingAt: */
 	address = ((pastSpace()).start);
 	/* begin rawNumSlotsOf: */
@@ -16553,7 +16565,8 @@
 	   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 	prevPrevObj = (prevObj = null);
-	assert((((pastSpace()).start)) < (((eden()).start)));
+	assert((bootstrapping())
+	 || ((((pastSpace()).start)) < (((eden()).start))));
 	/* begin objectStartingAt: */
 	address = ((pastSpace()).start);
 	/* begin rawNumSlotsOf: */
@@ -17237,7 +17250,8 @@
 	   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 	prevPrevObj = (prevObj = null);
-	assert((((pastSpace()).start)) < (((eden()).start)));
+	assert((bootstrapping())
+	 || ((((pastSpace()).start)) < (((eden()).start))));
 	/* begin objectStartingAt: */
 	address = ((pastSpace()).start);
 	/* begin rawNumSlotsOf: */
@@ -17569,6 +17583,17 @@
 }
 
 
+/*	Return the default amount of memory to allocate for the eden space.
+	The actual value can be set via vmParameterAt: and/or a preference in the
+	ini file. */
+
+static sqInt
+defaultEdenBytes(void)
+{
+	return (2 * 1024) * 1024;
+}
+
+
 /*	Return the default number of stack pages allocate at startup.
 	This default suits Qwaq Forums (specifically general rendering).
 	It is probably a bit high for normal use but QF is profligate with
@@ -18739,7 +18764,8 @@
 		   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 		prevPrevObj = (prevObj = null);
-		assert((((pastSpace()).start)) < (((eden()).start)));
+		assert((bootstrapping())
+		 || ((((pastSpace()).start)) < (((eden()).start))));
 		/* begin objectStartingAt: */
 		address = ((pastSpace()).start);
 		/* begin rawNumSlotsOf: */
@@ -18915,7 +18941,8 @@
 		   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 		prevPrevObj2 = (prevObj2 = null);
-		assert((((pastSpace()).start)) < (((eden()).start)));
+		assert((bootstrapping())
+		 || ((((pastSpace()).start)) < (((eden()).start))));
 		/* begin objectStartingAt: */
 		address2 = ((pastSpace()).start);
 		/* begin rawNumSlotsOf: */
@@ -20219,7 +20246,8 @@
 	   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 	prevPrevObj = (prevObj = null);
-	assert((((pastSpace()).start)) < (((eden()).start)));
+	assert((bootstrapping())
+	 || ((((pastSpace()).start)) < (((eden()).start))));
 	/* begin objectStartingAt: */
 	address = ((pastSpace()).start);
 	/* begin rawNumSlotsOf: */
@@ -21685,7 +21713,8 @@
 	   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 	prevPrevObj = (prevObj = null);
-	assert((((pastSpace()).start)) < (((eden()).start)));
+	assert((bootstrapping())
+	 || ((((pastSpace()).start)) < (((eden()).start))));
 	/* begin objectStartingAt: */
 	address = ((pastSpace()).start);
 	/* begin rawNumSlotsOf: */
@@ -21820,7 +21849,8 @@
 	   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 	prevPrevObj = (prevObj = null);
-	assert((((pastSpace()).start)) < (((eden()).start)));
+	assert((bootstrapping())
+	 || ((((pastSpace()).start)) < (((eden()).start))));
 	/* begin objectStartingAt: */
 	address = ((pastSpace()).start);
 	/* begin rawNumSlotsOf: */
@@ -23643,6 +23673,7 @@
     sqInt i21;
     sqInt i3;
     sqInt i4;
+    sqInt i5;
     sqInt iLimiT;
     sqInt iLimiT1;
     sqInt iLimiT2;
@@ -23661,6 +23692,7 @@
     sqInt obj2slots;
     sqInt objOop;
     sqInt oop;
+    sqInt oop1;
     sqInt prev;
     sqInt prevObj;
     sqInt prevPrevObj;
@@ -23791,9 +23823,9 @@
 		(GIV(stackPage)->headSP = GIV(stackPointer));
 		assert(pageListIsWellFormed());
 	}
-	for (i11 = 0; i11 < GIV(numStackPages); i11 += 1) {
+	for (i2 = 0; i2 < GIV(numStackPages); i2 += 1) {
 		/* begin stackPageAt: */
-		thePage = stackPageAtpages(i11, GIV(pages));
+		thePage = stackPageAtpages(i2, GIV(pages));
 		(thePage->trace = StackPageUnreached);
 	}
 	/* begin markAndTraceHiddenRoots */
@@ -23807,10 +23839,19 @@
 	}
 	setIsMarkedOfto(GIV(hiddenRootsObj), 1);
 	markAndTrace(GIV(classTableFirstPage));
-	for (i3 = 1; i3 < GIV(numClassTablePages); i3 += 1) {
-		setIsMarkedOfto(longAt((GIV(hiddenRootsObj) + (BaseHeaderSize)) + (i3 << 2)), 1);
+	for (i4 = 1; i4 < GIV(numClassTablePages); i4 += 1) {
+		setIsMarkedOfto(longAt((GIV(hiddenRootsObj) + (BaseHeaderSize)) + (i4 << 2)), 1);
 	}
 l1:	/* end markAndTraceHiddenRoots */;
+	/* begin markAndTraceExtraRoots */
+	assert(GIV(remapBufferCount) == 0);
+	for (i11 = 1; i11 <= GIV(extraRootCount); i11 += 1) {
+		oop = (GIV(extraRoots)[i11])[0];
+		if (!(((oop & 3) != 0)
+			 || (((longAt(oop)) & 0x3FFFFF) == 0))) {
+			markAndTrace(oop);
+		}
+	}
 	assert(validClassTableRootPages());
 	/* begin markAndTraceInterpreterOops: */
 	markAndTraceStackPages(1);
@@ -23835,20 +23876,20 @@
 	if (!(GIV(tempOop) == 0)) {
 		markAndTrace(GIV(tempOop));
 	}
-	for (i2 = 1, iLimiT = GIV(remapBufferCount); i2 <= iLimiT; i2 += 1) {
-		oop = GIV(remapBuffer)[i2];
-		if (!((oop & 1))) {
-			markAndTrace(oop);
+	for (i3 = 1, iLimiT = GIV(remapBufferCount); i3 <= iLimiT; i3 += 1) {
+		oop1 = GIV(remapBuffer)[i3];
+		if (!((oop1 & 1))) {
+			markAndTrace(oop1);
 		}
 	}
-	for (i2 = 1; i2 <= GIV(jmpDepth); i2 += 1) {
-		oop = GIV(suspendedCallbacks)[i2];
-		if (!((oop & 1))) {
-			markAndTrace(oop);
+	for (i3 = 1; i3 <= GIV(jmpDepth); i3 += 1) {
+		oop1 = GIV(suspendedCallbacks)[i3];
+		if (!((oop1 & 1))) {
+			markAndTrace(oop1);
 		}
-		oop = GIV(suspendedMethods)[i2];
-		if (!((oop & 1))) {
-			markAndTrace(oop);
+		oop1 = GIV(suspendedMethods)[i3];
+		if (!((oop1 & 1))) {
+			markAndTrace(oop1);
 		}
 	}
 	assert(validObjStacks());
@@ -23882,8 +23923,8 @@
 	assert(GIV(rememberedSetSize) >= 0);
 	/* begin prepareForGlobalSweep */
 	sweepIndex = 0;
-	for (i4 = 0; i4 < GIV(numSegments); i4 += 1) {
-		((GIV(segments)[i4]).containsPinned = 0);
+	for (i5 = 0; i5 < GIV(numSegments); i5 += 1) {
+		((GIV(segments)[i5]).containsPinned = 0);
 	}
 	/* begin resetFreeListHeads */
 	for (i12 = 0, iLimiT2 = (32 - 1); i12 <= iLimiT2; i12 += 1) {
@@ -25139,7 +25180,8 @@
 	   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 	prevPrevObj = (prevObj = null);
-	assert((((pastSpace()).start)) < (((eden()).start)));
+	assert((bootstrapping())
+	 || ((((pastSpace()).start)) < (((eden()).start))));
 	/* begin objectStartingAt: */
 	address = ((pastSpace()).start);
 	/* begin rawNumSlotsOf: */
@@ -25254,6 +25296,7 @@
     sqInt obj;
     sqInt p;
     sqInt valuePointer;
+    sqInt valuePointer1;
 
 	assert(BaseHeaderSize == (BaseHeaderSize));
 	initSegmentBridgeWithBytesat(2 * (BaseHeaderSize), GIV(endOfMemory) - (2 * (BaseHeaderSize)));
@@ -25303,14 +25346,20 @@
 		while ((((usqInt) obj)) < (((usqInt) GIV(endOfMemory)))) {
 			if (((longAt(obj)) & 0x3FFFFF) == 0) {
 				/* begin swizzleFieldsOfFreeChunk: */
-				for (index = 0, indexLimiT = (((((sqInt) (bytesInObject(obj)) >> 3)) > 32
-	? 4
-	: 0)); index <= indexLimiT; index += 1) {
-					field = longAt((obj + (BaseHeaderSize)) + (index << 2));
-					if (field != 0) {
-						/* begin storePointerNoAssert:ofFreeChunk:withValue: */
-						valuePointer = swizzleObj(field);
-						longAtput((obj + (BaseHeaderSize)) + (index << 2), valuePointer);
+				field = longAt((obj + (BaseHeaderSize)) + (0 << 2));
+				if (field != 0) {
+					/* begin storePointerNoAssert:ofFreeChunk:withValue: */
+					valuePointer = swizzleObj(field);
+					longAtput((obj + (BaseHeaderSize)) + (0 << 2), valuePointer);
+				}
+				if ((((sqInt) (bytesInObject(obj)) >> 3)) >= 32) {
+					for (index = 2, indexLimiT = 4; index <= indexLimiT; index += 1) {
+						field = longAt((obj + (BaseHeaderSize)) + (index << 2));
+						if (field != 0) {
+							/* begin storePointerNoAssert:ofFreeChunk:withValue: */
+							valuePointer1 = swizzleObj(field);
+							longAtput((obj + (BaseHeaderSize)) + (index << 2), valuePointer1);
+						}
 					}
 				}
 			}
@@ -27600,7 +27649,8 @@
 	   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 	prevPrevObj = (prevObj = null);
-	assert((((pastSpace()).start)) < (((eden()).start)));
+	assert((bootstrapping())
+	 || ((((pastSpace()).start)) < (((eden()).start))));
 	/* begin objectStartingAt: */
 	address = ((pastSpace()).start);
 	/* begin rawNumSlotsOf: */
@@ -31169,7 +31219,8 @@
 		   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 		prevPrevObj = (prevObj = null);
-		assert((((pastSpace()).start)) < (((eden()).start)));
+		assert((bootstrapping())
+		 || ((((pastSpace()).start)) < (((eden()).start))));
 		/* begin objectStartingAt: */
 		address = ((pastSpace()).start);
 		/* begin rawNumSlotsOf: */
@@ -38664,7 +38715,8 @@
 	   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 	prevPrevObj = (prevObj = null);
-	assert((((pastSpace()).start)) < (((eden()).start)));
+	assert((bootstrapping())
+	 || ((((pastSpace()).start)) < (((eden()).start))));
 	/* begin objectStartingAt: */
 	address = ((pastSpace()).start);
 	/* begin rawNumSlotsOf: */
@@ -41225,7 +41277,7 @@
 		/* begin push: */
 		longAtput((sp = GIV(stackPointer) - BytesPerWord), GIV(instructionPointer));
 		GIV(stackPointer) = sp;
-		activeContext = voidVMStateForSnapshot();
+		activeContext = voidVMStateForSnapshotFlushingExternalPrimitivesIf(0);
 		marryContextInNewStackPageAndInitializeInterpreterRegisters(activeContext);
 		assert((((stackValue(0)) == (nilObject()))
  && (GIV(longRunningPrimitiveCheckSemaphore) == null))
@@ -42984,7 +43036,7 @@
 		/* begin push: */
 		longAtput((sp = GIV(stackPointer) - BytesPerWord), GIV(instructionPointer));
 		GIV(stackPointer) = sp;
-		activeContext = voidVMStateForSnapshot();
+		activeContext = voidVMStateForSnapshotFlushingExternalPrimitivesIf(0);
 		marryContextInNewStackPageAndInitializeInterpreterRegisters(activeContext);
 		assert((((stackValue(0)) == (nilObject()))
  && (GIV(profileSemaphore) == (nilObject())))
@@ -46933,7 +46985,8 @@
 	   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 	prevPrevObj = (prevObj = null);
-	assert((((pastSpace()).start)) < (((eden()).start)));
+	assert((bootstrapping())
+	 || ((((pastSpace()).start)) < (((eden()).start))));
 	/* begin objectStartingAt: */
 	address = ((pastSpace()).start);
 	/* begin rawNumSlotsOf: */
@@ -47978,7 +48031,7 @@
 	/* begin push: */
 	longAtput((sp = GIV(stackPointer) - BytesPerWord), GIV(instructionPointer));
 	GIV(stackPointer) = sp;
-	activeContext = voidVMStateForSnapshot();
+	activeContext = voidVMStateForSnapshotFlushingExternalPrimitivesIf(0);
 	marryContextInNewStackPageAndInitializeInterpreterRegisters(activeContext);
 	siglongjmp(reenterInterpreter, ReturnToInterpreter);
 }
@@ -48130,7 +48183,8 @@
 		   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 		prevPrevObj = (prevObj = null);
-		assert((((pastSpace()).start)) < (((eden()).start)));
+		assert((bootstrapping())
+		 || ((((pastSpace()).start)) < (((eden()).start))));
 		/* begin objectStartingAt: */
 		address = ((pastSpace()).start);
 		/* begin rawNumSlotsOf: */
@@ -48677,7 +48731,8 @@
 	   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 	prevPrevObj = (prevObj = null);
-	assert((((pastSpace()).start)) < (((eden()).start)));
+	assert((bootstrapping())
+	 || ((((pastSpace()).start)) < (((eden()).start))));
 	/* begin objectStartingAt: */
 	address = ((pastSpace()).start);
 	/* begin rawNumSlotsOf: */
@@ -49632,7 +49687,7 @@
 	/* begin printHexPtrnp: */
 	/* begin printHexnp: */
 	printf("0x%x", oopForPointer(longAt((freeChunk + (BaseHeaderSize)) + (0 << 2))));
-	if ((((sqInt) numBytes >> 3)) > 32) {
+	if ((((sqInt) numBytes >> 3)) >= 32) {
 		print(" ^ ");
 		/* begin printHexPtrnp: */
 		/* begin printHexnp: */
@@ -49650,7 +49705,52 @@
 	printf("\n");
 }
 
+void
+printFreeList(sqInt chunkOrIndex)
+{   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt freeChunk;
+    usqLong numBytes;
 
+	if ((chunkOrIndex >= 0)
+	 && (chunkOrIndex < 32)) {
+		printFreeList(GIV(freeLists)[chunkOrIndex]);
+		return;
+	}
+	freeChunk = chunkOrIndex;
+	while (freeChunk != 0) {
+		/* begin printFreeChunk: */
+		numBytes = bytesInObject(freeChunk);
+		print("freeChunk ");
+		/* begin printHexPtrnp: */
+		/* begin printHexnp: */
+		printf("0x%x", oopForPointer(freeChunk));
+		print(" bytes ");
+		printNum(numBytes);
+		print(" next ");
+		/* begin printHexPtrnp: */
+		/* begin printHexnp: */
+		printf("0x%x", oopForPointer(longAt((freeChunk + (BaseHeaderSize)) + (0 << 2))));
+		if ((((sqInt) numBytes >> 3)) >= 32) {
+			print(" ^ ");
+			/* begin printHexPtrnp: */
+			/* begin printHexnp: */
+			printf("0x%x", oopForPointer(longAt((freeChunk + (BaseHeaderSize)) + (2 << 2))));
+			print(" < ");
+			/* begin printHexPtrnp: */
+			/* begin printHexnp: */
+			printf("0x%x", oopForPointer(longAt((freeChunk + (BaseHeaderSize)) + (3 << 2))));
+			print(" > ");
+			/* begin printHexPtrnp: */
+			/* begin printHexnp: */
+			printf("0x%x", oopForPointer(longAt((freeChunk + (BaseHeaderSize)) + (4 << 2))));
+		}
+		/* begin cr */
+		printf("\n");
+		freeChunk = longAt((freeChunk + (BaseHeaderSize)) + (0 << 2));
+	}
+}
+
+
 /*	Print n in hex, in the form ' 0x1234', padded to a width of 10 characters
 	in 32-bits ('0x' + 8 nibbles) or 18 characters in 64-bits ('0x' + 16
 	nibbles)  */
@@ -49709,7 +49809,8 @@
 	   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 	prevPrevObj = (prevObj = null);
-	assert((((pastSpace()).start)) < (((eden()).start)));
+	assert((bootstrapping())
+	 || ((((pastSpace()).start)) < (((eden()).start))));
 	/* begin objectStartingAt: */
 	address = ((pastSpace()).start);
 	/* begin rawNumSlotsOf: */
@@ -50013,7 +50114,8 @@
 	   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 	prevPrevObj = (prevObj = null);
-	assert((((pastSpace()).start)) < (((eden()).start)));
+	assert((bootstrapping())
+	 || ((((pastSpace()).start)) < (((eden()).start))));
 	/* begin objectStartingAt: */
 	address = ((pastSpace()).start);
 	/* begin rawNumSlotsOf: */
@@ -50756,7 +50858,8 @@
 	   in pastSpace.  Objects are allocated in eden.  So enumerate only pastSpace and eden. */
 
 	prevPrevObj = (prevObj = null);
-	assert((((pastSpace()).start)) < (((eden()).start)));
+	assert((bootstrapping())
+	 || ((((pastSpace()).start)) < (((eden()).start))));
 	/* begin objectStartingAt: */
 	address = ((pastSpace()).start);
 	/* begin rawNumSlotsOf: */
@@ -51974,6 +52077,7 @@
 	assert((newBase - (oldSpaceStart())) == (totalBytesRead - (GIV(numSegments) * (bridgeSize()))));
 	/* begin setFreeOldSpaceStart: */
 	GIV(freeOldSpaceStart) = newBase;
+	GIV(firstSegmentSize) = null;
 	return totalBytesRead;
 }
 
@@ -52115,7 +52219,7 @@
 	bytes = (desiredEdenBytes != 0
 		? desiredEdenBytes
 		: (hdrEdenBytes == 0
-				? ((2 * 1024) * 1024) + ((((interpreterAllocationReserveBytes()) * 7) + 2) / 7)
+				? defaultEdenBytes()
 				: hdrEdenBytes));
 	edenBytes = bytes;
 	desiredEdenBytes = hdrEdenBytes;
@@ -52417,11 +52521,11 @@
 	cameFrom = -1;
 	do {
 		smallChild = longAt((treeNode1 + (BaseHeaderSize)) + (3 << 2));
-
-		/* apply if the node has no children, or it has no large children and we're
-		   returning from the small child, or we're returning from the large child. */
-
 		largeChild = longAt((treeNode1 + (BaseHeaderSize)) + (4 << 2));

@@ Diff output truncated at 50000 characters. @@


More information about the Vm-dev mailing list