[Vm-dev] [commit][2938] CogVM source as per VMMaker.oscog-eem.746

commits at squeakvm.org commits at squeakvm.org
Mon Jun 2 01:11:52 UTC 2014


Revision: 2938
Author:   eliot
Date:     2014-06-01 18:11:49 -0700 (Sun, 01 Jun 2014)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.746

Implement a peephole in the Spur Cogit for an indirection
vector initialized with a single value  Avoid initializing the
slot in the array to nil and instead initialize it with the value.

Refactor setting byte1, byte2 & byte3 into loadSubsequentBytesForDescriptor:at:
for the peephole tryCollapseTempVectorInitializationOfSize:.

No longer inline CoInterpreter>>pre/postGCAction: for VM profiling.

Increase the number of trampoline table slots.

Modified Paths:
--------------
    branches/Cog/nscogsrc/vm/cogit.c
    branches/Cog/nscogsrc/vm/cogit.h
    branches/Cog/nscogsrc/vm/cogmethod.h
    branches/Cog/nscogsrc/vm/cointerp.c
    branches/Cog/nscogsrc/vm/cointerp.h
    branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
    branches/Cog/nscogsrc/vm/interp.h
    branches/Cog/nscogsrc/vm/vmCallback.h
    branches/Cog/nsspursrc/vm/cogit.c
    branches/Cog/nsspursrc/vm/cogit.h
    branches/Cog/nsspursrc/vm/cogmethod.h
    branches/Cog/nsspursrc/vm/cointerp.c
    branches/Cog/nsspursrc/vm/cointerp.h
    branches/Cog/nsspursrc/vm/gcc3x-cointerp.c
    branches/Cog/nsspursrc/vm/interp.h
    branches/Cog/nsspursrc/vm/vmCallback.h
    branches/Cog/sistasrc/vm/cogit.c
    branches/Cog/sistasrc/vm/cogit.h
    branches/Cog/sistasrc/vm/cogmethod.h
    branches/Cog/sistasrc/vm/cointerp.c
    branches/Cog/sistasrc/vm/cointerp.h
    branches/Cog/sistasrc/vm/gcc3x-cointerp.c
    branches/Cog/sistasrc/vm/interp.h
    branches/Cog/sistasrc/vm/vmCallback.h
    branches/Cog/spursistasrc/vm/cogit.c
    branches/Cog/spursistasrc/vm/cogit.h
    branches/Cog/spursistasrc/vm/cogmethod.h
    branches/Cog/spursistasrc/vm/cointerp.c
    branches/Cog/spursistasrc/vm/cointerp.h
    branches/Cog/spursistasrc/vm/gcc3x-cointerp.c
    branches/Cog/spursistasrc/vm/interp.h
    branches/Cog/spursistasrc/vm/vmCallback.h
    branches/Cog/spursrc/vm/cogit.c
    branches/Cog/spursrc/vm/cogit.h
    branches/Cog/spursrc/vm/cogmethod.h
    branches/Cog/spursrc/vm/cointerp.c
    branches/Cog/spursrc/vm/cointerp.h
    branches/Cog/spursrc/vm/gcc3x-cointerp.c
    branches/Cog/spursrc/vm/interp.h
    branches/Cog/spursrc/vm/vmCallback.h
    branches/Cog/src/vm/cogit.c
    branches/Cog/src/vm/cogit.h
    branches/Cog/src/vm/cogmethod.h
    branches/Cog/src/vm/cointerp.c
    branches/Cog/src/vm/cointerp.h
    branches/Cog/src/vm/cointerpmt.c
    branches/Cog/src/vm/cointerpmt.h
    branches/Cog/src/vm/gcc3x-cointerp.c
    branches/Cog/src/vm/gcc3x-cointerpmt.c
    branches/Cog/src/vm/interp.h
    branches/Cog/src/vm/vmCallback.h

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

Modified: branches/Cog/nscogsrc/vm/cogit.c
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.c	2014-06-01 19:43:14 UTC (rev 2937)
+++ branches/Cog/nscogsrc/vm/cogit.c	2014-06-02 01:11:49 UTC (rev 2938)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.745 uuid: 9ae88e74-1041-4ad2-be42-c2277e958b92
+	CCodeGenerator VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.745 uuid: 9ae88e74-1041-4ad2-be42-c2277e958b92
+	StackToRegisterMappingCogit VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.745 uuid: 9ae88e74-1041-4ad2-be42-c2277e958b92 " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -297,7 +297,7 @@
 #define NSSendIsPCAnnotated 1
 #define NumObjRefsInRuntime 2
 #define NumSendTrampolines 4
-#define NumTrampolines 58
+#define NumTrampolines 60
 #define OrCqR 93
 #define OrCwR 100
 #define OrRR 86
@@ -565,6 +565,7 @@
 void enterCogCodePopReceiverAndClassRegs(void);
 void enterCogCodePopReceiverArg0Regs(void);
 void enterCogCodePopReceiverArg1Arg0Regs(void);
+static void evaluateat(BytecodeDescriptor *descriptor, sqInt pc) NoDbgRegParms;
 static sqInt extABytecode(void);
 static sqInt extBBytecode(void);
 static sqInt extendedPushBytecode(void);
@@ -917,6 +918,7 @@
 static sqInt literalBeforeFollowingAddress(AbstractInstruction * self_in_literalBeforeFollowingAddress, sqInt followingAddress) NoDbgRegParms;
 static sqInt liveRegisters(void);
 static sqInt loadLiteralByteSize(AbstractInstruction * self_in_loadLiteralByteSize) NoDbgRegParms;
+static void loadSubsequentBytesForDescriptorat(BytecodeDescriptor *descriptor, sqInt pc) NoDbgRegParms;
 static AbstractInstruction * longJumpTargetAddress(AbstractInstruction * self_in_longJumpTargetAddress) NoDbgRegParms;
 static AbstractInstruction * gMoveAwR(sqInt address, sqInt reg) NoDbgRegParms;
 static AbstractInstruction * gMoveCwR(sqInt wordConstant, sqInt reg) NoDbgRegParms;
@@ -1086,6 +1088,7 @@
 static sqInt sib(AbstractInstruction * self_in_sib, sqInt scale, sqInt indexReg, sqInt baseReg) NoDbgRegParms;
 sqInt traceLinkedSendOffset(void);
 static char * trampolineNamenumArgs(char *routinePrefix, sqInt numArgs) NoDbgRegParms;
+static sqInt tryCollapseTempVectorInitializationOfSize(sqInt slots) NoDbgRegParms;
 static sqInt twoByteInstructionSizeAt(AbstractInstruction * self_in_twoByteInstructionSizeAt, sqInt pc) NoDbgRegParms;
 static sqInt unimplementedPrimitive(void);
 static sqInt unknownBytecode(void);
@@ -4170,18 +4173,7 @@
 		
 		byte0 = (fetchByteofObject(bytecodePC, methodObj)) + bytecodeSetOffset;
 		descriptor = generatorAt(byte0);
-		if (((descriptor->numBytes)) > 1) {
-			byte1 = fetchByteofObject(bytecodePC + 1, methodObj);
-			if (((descriptor->numBytes)) > 2) {
-				byte2 = fetchByteofObject(bytecodePC + 2, methodObj);
-				if (((descriptor->numBytes)) > 3) {
-					byte3 = fetchByteofObject(bytecodePC + 3, methodObj);
-					if (((descriptor->numBytes)) > 4) {
-						notYetImplemented();
-					}
-				}
-			}
-		}
+		loadSubsequentBytesForDescriptorat(descriptor, bytecodePC);
 		nextOpcodeIndex = opcodeIndex;
 		result = (deadCode
 			? ((((descriptor->isMapped))
@@ -10397,7 +10389,16 @@
 	realCEEnterCogCodePopReceiverArg1Arg0Regs();
 }
 
+static void
+evaluateat(BytecodeDescriptor *descriptor, sqInt pc)
+{
+	byte0 = fetchByteofObject(pc, methodObj);
+	assert(descriptor == (generatorAt(bytecodeSetOffset + byte0)));
+	loadSubsequentBytesForDescriptorat(descriptor, pc);
+	((descriptor->generator))();
+}
 
+
 /*	224		11100000	aaaaaaaa	Extend A (Ext A = Ext A prev * 256 + Ext A) */
 
 static sqInt
@@ -15058,6 +15059,11 @@
 		ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg);
 	}
 	size = byte1 & 0x7F;
+	if (!popValues) {
+		if (tryCollapseTempVectorInitializationOfSize(size)) {
+			return 0;
+		}
+	}
 	genNewArrayOfSizeinitialized(size, !popValues);
 	if (popValues) {
 		for (i = (size - 1); i >= 0; i += -1) {
@@ -17703,7 +17709,24 @@
 	return 5;
 }
 
+static void
+loadSubsequentBytesForDescriptorat(BytecodeDescriptor *descriptor, sqInt pc)
+{
+	if (((descriptor->numBytes)) > 1) {
+		byte1 = fetchByteofObject(pc + 1, methodObj);
+		if (((descriptor->numBytes)) > 2) {
+			byte2 = fetchByteofObject(pc + 2, methodObj);
+			if (((descriptor->numBytes)) > 3) {
+				byte3 = fetchByteofObject(pc + 3, methodObj);
+				if (((descriptor->numBytes)) > 4) {
+					notYetImplemented();
+				}
+			}
+		}
+	}
+}
 
+
 /*	Since it's an extraction from other methods. */
 /*	This needs to be digfferent from jumpTargetAddress because long jumps can
 	be to absolute addresses and hence we can't assert that the jump target is
@@ -21569,7 +21592,59 @@
 	return theString;
 }
 
+
+/*	Try and collapse
+	push: (Array new: 1)
+	popIntoTemp: tempIndex
+	pushConstant: const or pushTemp: n
+	popIntoTemp: 0 inVectorAt: tempIndex
+	into
+	tempAt: tempIndex put: {const}.
+	One might think that we should look for a sequence of more than
+	one pushes and pops but this is extremely rare. */
+
 static sqInt
+tryCollapseTempVectorInitializationOfSize(sqInt slots)
+{
+    BytecodeDescriptor *pushArrayDesc;
+    BytecodeDescriptor *pushValueDesc;
+    sqInt reg;
+    BytecodeDescriptor *storeArrayDesc;
+    BytecodeDescriptor *storeValueDesc;
+
+	if (slots != 1) {
+		return 0;
+	}
+	pushArrayDesc = generatorAt(bytecodeSetOffset + (fetchByteofObject(bytecodePC, methodObj)));
+	assert(((pushArrayDesc->generator)) == genPushNewArrayBytecode);
+	storeArrayDesc = generatorAt(bytecodeSetOffset + (fetchByteofObject(bytecodePC + ((pushArrayDesc->numBytes)), methodObj)));
+	if (((storeArrayDesc->generator)) != genStoreAndPopTemporaryVariableBytecode) {
+		return 0;
+	}
+	pushValueDesc = generatorAt(bytecodeSetOffset + (fetchByteofObject((bytecodePC + ((pushArrayDesc->numBytes))) + ((storeArrayDesc->numBytes)), methodObj)));
+	if ((((pushValueDesc->generator)) != genPushLiteralConstantBytecode)
+	 && ((((pushValueDesc->generator)) != genPushQuickIntegerConstantBytecode)
+	 && (((pushValueDesc->generator)) != genPushTemporaryVariableBytecode))) {
+		return 0;
+	}
+	storeValueDesc = generatorAt(bytecodeSetOffset + (fetchByteofObject(((bytecodePC + ((pushArrayDesc->numBytes))) + ((storeArrayDesc->numBytes))) + ((pushValueDesc->numBytes)), methodObj)));
+	if (((storeValueDesc->generator)) != genStoreAndPopRemoteTempLongBytecode) {
+		return 0;
+	}
+	genNewArrayOfSizeinitialized(1, 0);
+	evaluateat(pushValueDesc, (bytecodePC + ((pushArrayDesc->numBytes))) + ((storeArrayDesc->numBytes)));
+	reg = ssStorePoptoPreferredReg(1, TempReg);
+	genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, 0, ReceiverResultReg);
+	ssPushRegister(ReceiverResultReg);
+	evaluateat(storeArrayDesc, bytecodePC + ((pushArrayDesc->numBytes)));
+
+	/* + pushArrayDesc numBytes this gets added by nextBytecodePCFor:at:exts:in: */
+
+	bytecodePC = ((bytecodePC + ((storeArrayDesc->numBytes))) + ((pushValueDesc->numBytes))) + ((storeValueDesc->numBytes));
+	return 1;
+}
+
+static sqInt
 twoByteInstructionSizeAt(AbstractInstruction * self_in_twoByteInstructionSizeAt, sqInt pc)
 {
     sqInt op;

Modified: branches/Cog/nscogsrc/vm/cogit.h
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.h	2014-06-01 19:43:14 UTC (rev 2937)
+++ branches/Cog/nscogsrc/vm/cogit.h	2014-06-02 01:11:49 UTC (rev 2938)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.745 uuid: 9ae88e74-1041-4ad2-be42-c2277e958b92
+	CCodeGenerator VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
  */
 
 

Modified: branches/Cog/nscogsrc/vm/cogmethod.h
===================================================================
--- branches/Cog/nscogsrc/vm/cogmethod.h	2014-06-01 19:43:14 UTC (rev 2937)
+++ branches/Cog/nscogsrc/vm/cogmethod.h	2014-06-02 01:11:49 UTC (rev 2938)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.745 uuid: 9ae88e74-1041-4ad2-be42-c2277e958b92
+	CCodeGenerator VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
  */
 
 typedef struct {

Modified: branches/Cog/nscogsrc/vm/cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.c	2014-06-01 19:43:14 UTC (rev 2937)
+++ branches/Cog/nscogsrc/vm/cointerp.c	2014-06-02 01:11:49 UTC (rev 2938)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.741 uuid: f73b1214-56e1-4dde-a466-bad10d979d17
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
    from
-	CoInterpreter VMMaker.oscog-eem.741 uuid: f73b1214-56e1-4dde-a466-bad10d979d17
+	CoInterpreter VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.741 uuid: f73b1214-56e1-4dde-a466-bad10d979d17 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -839,6 +839,7 @@
 unsigned long positiveMachineIntegerValueOf(sqInt oop);
 static void possibleRootStoreIntovalue(sqInt oop, sqInt valueObj) NoDbgRegParms;
 static void postGCAction(sqInt gcModeArg) NoDbgRegParms;
+static void preGCAction(sqInt gcModeArg) NoDbgRegParms;
 static sqInt prepareForwardingTableForBecomingwithtwoWay(sqInt array1, sqInt array2, sqInt twoWayFlag) NoDbgRegParms;
 sqInt primErrTable(void);
 usqInt primFailCodeAddress(void);
@@ -1311,8 +1312,8 @@
 _iss sqInt trueObj;
 _iss sqInt falseObj;
 _iss sqInt remapBufferCount;
-_iss sqInt traceLogIndex;
 _iss sqInt bytesPerPage;
+_iss sqInt traceLogIndex;
 _iss usqInt reserveStart;
 _iss char * stackLimit;
 _iss sqInt rootTableCount;
@@ -1338,18 +1339,18 @@
 _iss sqInt growHeadroom;
 _iss sqInt longRunningPrimitiveCheckMethod;
 _iss sqInt profileMethod;
-_iss sqInt lastMethodCacheProbeWrite;
 _iss sqInt backwardJumpCount;
+_iss sqInt lastMethodCacheProbeWrite;
 _iss sqInt lkupClass;
 _iss usqLong nextWakeupUsecs;
 _iss sqInt preemptionYields;
 _iss sqInt cogCompiledCodeCompactionCalledFor;
-_iss sqInt gcMode;
 _iss sqInt highestRunnableProcessPriority;
 _iss usqLong longRunningPrimitiveStartUsecs;
 _iss usqLong longRunningPrimitiveStopUsecs;
 _iss usqLong statCheckForEvents;
 _iss sqInt statMarkCount;
+_iss sqInt gcMode;
 _iss sqInt lastCoggableInterpretedBlockMethod;
 _iss sqInt lastUncoggableInterpretedBlockMethod;
 _iss sqInt lowSpaceThreshold;
@@ -2059,7 +2060,7 @@
 	/* 574 */ (void (*)(void))0,
 	/* 575 */ (void (*)(void))0,
  0 };
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.741";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.746";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
@@ -4852,7 +4853,6 @@
 							GIV(framePointer) = localFP;
 							
 							ceEnterCogCodePopReceiverReg();
-							null;
 							goto l309;
 						}
 						localIP = pointerForOop(longAt(localFP + FoxIFSavedIP));
@@ -4870,7 +4870,7 @@
 					/* begin fetchNextBytecode */
 					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
-					null;
+					/* return self */
 				l309:	/* end baseFrameReturn */;
 					goto l306;
 				}
@@ -22847,52 +22847,15 @@
 void
 fullGC(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
-    sqInt i;
-    sqInt i1;
     sqInt limit;
     sqInt sz;
-    sqInt traceType;
 
 	if (GIV(fullGCLock) > 0) {
 		warning("aborting fullGC because fullGCLock > 0");
 		return;
 	}
 	runLeakCheckerForFullGC(1);
-	/* begin preGCAction: */
-	if (GIV(stackPage) != 0) {
-		/* begin externalWriteBackHeadFramePointers */
-		assert((GIV(framePointer) - GIV(stackPointer)) < LargeContextSize);
-		assert(GIV(stackPage) == (mostRecentlyUsedPage()));
-		/* begin setHeadFP:andSP:inPage: */
-		assert(GIV(stackPointer) < GIV(framePointer));
-		assert((GIV(stackPointer) < ((GIV(stackPage)->baseAddress)))
-		 && (GIV(stackPointer) > (((GIV(stackPage)->realStackLimit)) - LargeContextSize)));
-		assert((GIV(framePointer) < ((GIV(stackPage)->baseAddress)))
-		 && (GIV(framePointer) > (((GIV(stackPage)->realStackLimit)) - (((sqInt) LargeContextSize >> 1)))));
-		(GIV(stackPage)->headFP = GIV(framePointer));
-		(GIV(stackPage)->headSP = GIV(stackPointer));
-		assert(pageListIsWellFormed());
-	}
-	
-	GIV(gcMode) = GCModeFull;
-	if (recordEventTrace()) {
-		traceType = (GCModeFull == GCModeFull
-			? TraceFullGC
-			: TraceIncrementalGC);
-		/* begin recordTrace:thing:source: */
-		GIV(traceLog)[GIV(traceLogIndex)] = traceType;
-		GIV(traceLog)[GIV(traceLogIndex) + 1] = traceType;
-		GIV(traceLog)[GIV(traceLogIndex) + 2] = 0;
-		GIV(traceLogIndex) = (GIV(traceLogIndex) + 3) % TraceBufferSize;
-	}
-	if (recordPrimTrace()) {
-		traceType = (GCModeFull == GCModeFull
-			? TraceFullGC
-			: TraceIncrementalGC);
-		/* begin fastLogPrim: */
-		GIV(primTraceLog)[GIV(primTraceLogIndex)] = traceType;
-		primTraceLogIndex(GIV(primTraceLogIndex) + 1);
-	}
+	preGCAction(GCModeFull);
 	GIV(needGCFlag) = 0;
 	GIV(gcStartUsecs) = ioUTCMicrosecondsNow();
 	GIV(statSweepCount) = (GIV(statMarkCount) = (GIV(statMkFwdCount) = (GIV(statCompMoveCount) = 0)));
@@ -24193,11 +24156,8 @@
     sqInt delta;
     sqInt growth;
     sqInt i;
-    sqInt i1;
-    sqInt i2;
     sqInt limit;
     sqInt survivorCount;
-    sqInt traceType;
     sqInt weDidGrow;
 
 	if (GIV(rootTableOverflowed)) {
@@ -24210,41 +24170,7 @@
 		return;
 	}
 	runLeakCheckerForFullGC(0);
-	/* begin preGCAction: */
-	if (GIV(stackPage) != 0) {
-		/* begin externalWriteBackHeadFramePointers */
-		assert((GIV(framePointer) - GIV(stackPointer)) < LargeContextSize);
-		assert(GIV(stackPage) == (mostRecentlyUsedPage()));
-		/* begin setHeadFP:andSP:inPage: */
-		assert(GIV(stackPointer) < GIV(framePointer));
-		assert((GIV(stackPointer) < ((GIV(stackPage)->baseAddress)))
-		 && (GIV(stackPointer) > (((GIV(stackPage)->realStackLimit)) - LargeContextSize)));
-		assert((GIV(framePointer) < ((GIV(stackPage)->baseAddress)))
-		 && (GIV(framePointer) > (((GIV(stackPage)->realStackLimit)) - (((sqInt) LargeContextSize >> 1)))));
-		(GIV(stackPage)->headFP = GIV(framePointer));
-		(GIV(stackPage)->headSP = GIV(stackPointer));
-		assert(pageListIsWellFormed());
-	}
-	
-	GIV(gcMode) = GCModeIncr;
-	if (recordEventTrace()) {
-		traceType = (GCModeIncr == GCModeFull
-			? TraceFullGC
-			: TraceIncrementalGC);
-		/* begin recordTrace:thing:source: */
-		GIV(traceLog)[GIV(traceLogIndex)] = traceType;
-		GIV(traceLog)[GIV(traceLogIndex) + 1] = traceType;
-		GIV(traceLog)[GIV(traceLogIndex) + 2] = 0;
-		GIV(traceLogIndex) = (GIV(traceLogIndex) + 3) % TraceBufferSize;
-	}
-	if (recordPrimTrace()) {
-		traceType = (GCModeIncr == GCModeFull
-			? TraceFullGC
-			: TraceIncrementalGC);
-		/* begin fastLogPrim: */
-		GIV(primTraceLog)[GIV(primTraceLogIndex)] = traceType;
-		primTraceLogIndex(GIV(primTraceLogIndex) + 1);
-	}
+	preGCAction(GCModeIncr);
 	GIV(needGCFlag) = 0;
 	GIV(gcStartUsecs) = ioUTCMicrosecondsNow();
 	GIV(statSweepCount) = (GIV(statMarkCount) = (GIV(statMkFwdCount) = (GIV(statCompMoveCount) = 0)));
@@ -30457,6 +30383,72 @@
 }
 
 
+/*	Need to write back the frame pointers unless all pages are free (as in
+	snapshot) 
+ */
+/*	Need to write back the frame pointers unless all pages are free (as in
+	snapshot). Need to set gcMode var (to avoid passing the flag through a lot
+	of the updating code) */
+
+static void
+preGCAction(sqInt gcModeArg)
+{   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt i;
+    sqInt i1;
+    sqInt traceType;
+
+	if (GIV(stackPage) != 0) {
+		/* begin externalWriteBackHeadFramePointers */
+		assert((GIV(framePointer) - GIV(stackPointer)) < LargeContextSize);
+		assert(GIV(stackPage) == (mostRecentlyUsedPage()));
+		/* begin setHeadFP:andSP:inPage: */
+		assert(GIV(stackPointer) < GIV(framePointer));
+		assert((GIV(stackPointer) < ((GIV(stackPage)->baseAddress)))
+		 && (GIV(stackPointer) > (((GIV(stackPage)->realStackLimit)) - LargeContextSize)));
+		assert((GIV(framePointer) < ((GIV(stackPage)->baseAddress)))
+		 && (GIV(framePointer) > (((GIV(stackPage)->realStackLimit)) - (((sqInt) LargeContextSize >> 1)))));
+		(GIV(stackPage)->headFP = GIV(framePointer));
+		(GIV(stackPage)->headSP = GIV(stackPointer));
+		assert(pageListIsWellFormed());
+	}
+	if ((gcModeArg == GCModeFull)
+	 && (0)) {
+		/* begin flushMethodCache */
+		for (i = 1; i <= MethodCacheSize; i += 1) {
+			GIV(methodCache)[i] = 0;
+		}
+
+		/* this for primitiveExternalMethod */
+
+		GIV(lastMethodCacheProbeWrite) = 0;
+		/* begin flushAtCache */
+		for (i1 = 1; i1 <= AtCacheTotalSize; i1 += 1) {
+			GIV(atCache)[i1] = 0;
+		}
+		unlinkAllSends();
+	}
+	GIV(gcMode) = gcModeArg;
+	if (recordEventTrace()) {
+		traceType = (gcModeArg == GCModeFull
+			? TraceFullGC
+			: TraceIncrementalGC);
+		/* begin recordTrace:thing:source: */
+		GIV(traceLog)[GIV(traceLogIndex)] = traceType;
+		GIV(traceLog)[GIV(traceLogIndex) + 1] = traceType;
+		GIV(traceLog)[GIV(traceLogIndex) + 2] = 0;
+		GIV(traceLogIndex) = (GIV(traceLogIndex) + 3) % TraceBufferSize;
+	}
+	if (recordPrimTrace()) {
+		traceType = (gcModeArg == GCModeFull
+			? TraceFullGC
+			: TraceIncrementalGC);
+		/* begin fastLogPrim: */
+		GIV(primTraceLog)[GIV(primTraceLogIndex)] = traceType;
+		primTraceLogIndex(GIV(primTraceLogIndex) + 1);
+	}
+}
+
+
 /*	Ensure that there are enough forwarding blocks to 
 	accomodate this become, then prepare forwarding blocks for 
 	the pointer swap. Return true if successful. */

Modified: branches/Cog/nscogsrc/vm/cointerp.h
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.h	2014-06-01 19:43:14 UTC (rev 2937)
+++ branches/Cog/nscogsrc/vm/cointerp.h	2014-06-02 01:11:49 UTC (rev 2938)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.741 uuid: f73b1214-56e1-4dde-a466-bad10d979d17
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
  */
 
 

Modified: branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2014-06-01 19:43:14 UTC (rev 2937)
+++ branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2014-06-02 01:11:49 UTC (rev 2938)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.741 uuid: f73b1214-56e1-4dde-a466-bad10d979d17
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
    from
-	CoInterpreter VMMaker.oscog-eem.741 uuid: f73b1214-56e1-4dde-a466-bad10d979d17
+	CoInterpreter VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.741 uuid: f73b1214-56e1-4dde-a466-bad10d979d17 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -842,6 +842,7 @@
 unsigned long positiveMachineIntegerValueOf(sqInt oop);
 static void possibleRootStoreIntovalue(sqInt oop, sqInt valueObj) NoDbgRegParms;
 static void postGCAction(sqInt gcModeArg) NoDbgRegParms;
+static void preGCAction(sqInt gcModeArg) NoDbgRegParms;
 static sqInt prepareForwardingTableForBecomingwithtwoWay(sqInt array1, sqInt array2, sqInt twoWayFlag) NoDbgRegParms;
 sqInt primErrTable(void);
 usqInt primFailCodeAddress(void);
@@ -1314,8 +1315,8 @@
 _iss sqInt trueObj;
 _iss sqInt falseObj;
 _iss sqInt remapBufferCount;
-_iss sqInt traceLogIndex;
 _iss sqInt bytesPerPage;
+_iss sqInt traceLogIndex;
 _iss usqInt reserveStart;
 _iss char * stackLimit;
 _iss sqInt rootTableCount;
@@ -1341,18 +1342,18 @@
 _iss sqInt growHeadroom;
 _iss sqInt longRunningPrimitiveCheckMethod;
 _iss sqInt profileMethod;
-_iss sqInt lastMethodCacheProbeWrite;
 _iss sqInt backwardJumpCount;
+_iss sqInt lastMethodCacheProbeWrite;
 _iss sqInt lkupClass;
 _iss usqLong nextWakeupUsecs;
 _iss sqInt preemptionYields;
 _iss sqInt cogCompiledCodeCompactionCalledFor;
-_iss sqInt gcMode;
 _iss sqInt highestRunnableProcessPriority;
 _iss usqLong longRunningPrimitiveStartUsecs;
 _iss usqLong longRunningPrimitiveStopUsecs;
 _iss usqLong statCheckForEvents;
 _iss sqInt statMarkCount;
+_iss sqInt gcMode;
 _iss sqInt lastCoggableInterpretedBlockMethod;
 _iss sqInt lastUncoggableInterpretedBlockMethod;
 _iss sqInt lowSpaceThreshold;
@@ -2062,7 +2063,7 @@
 	/* 574 */ (void (*)(void))0,
 	/* 575 */ (void (*)(void))0,
  0 };
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.741";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.746";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
@@ -4861,7 +4862,6 @@
 							GIV(framePointer) = localFP;
 							
 							ceEnterCogCodePopReceiverReg();
-							null;
 							goto l309;
 						}
 						localIP = pointerForOop(longAt(localFP + FoxIFSavedIP));
@@ -4879,7 +4879,7 @@
 					/* begin fetchNextBytecode */
 					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
-					null;
+					/* return self */
 				l309:	/* end baseFrameReturn */;
 					goto l306;
 				}
@@ -22856,52 +22856,15 @@
 void
 fullGC(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
-    sqInt i;
-    sqInt i1;
     sqInt limit;
     sqInt sz;
-    sqInt traceType;
 
 	if (GIV(fullGCLock) > 0) {
 		warning("aborting fullGC because fullGCLock > 0");
 		return;
 	}
 	runLeakCheckerForFullGC(1);
-	/* begin preGCAction: */
-	if (GIV(stackPage) != 0) {
-		/* begin externalWriteBackHeadFramePointers */
-		assert((GIV(framePointer) - GIV(stackPointer)) < LargeContextSize);
-		assert(GIV(stackPage) == (mostRecentlyUsedPage()));
-		/* begin setHeadFP:andSP:inPage: */
-		assert(GIV(stackPointer) < GIV(framePointer));
-		assert((GIV(stackPointer) < ((GIV(stackPage)->baseAddress)))
-		 && (GIV(stackPointer) > (((GIV(stackPage)->realStackLimit)) - LargeContextSize)));
-		assert((GIV(framePointer) < ((GIV(stackPage)->baseAddress)))
-		 && (GIV(framePointer) > (((GIV(stackPage)->realStackLimit)) - (((sqInt) LargeContextSize >> 1)))));
-		(GIV(stackPage)->headFP = GIV(framePointer));
-		(GIV(stackPage)->headSP = GIV(stackPointer));
-		assert(pageListIsWellFormed());
-	}
-	
-	GIV(gcMode) = GCModeFull;
-	if (recordEventTrace()) {
-		traceType = (GCModeFull == GCModeFull
-			? TraceFullGC
-			: TraceIncrementalGC);
-		/* begin recordTrace:thing:source: */
-		GIV(traceLog)[GIV(traceLogIndex)] = traceType;
-		GIV(traceLog)[GIV(traceLogIndex) + 1] = traceType;
-		GIV(traceLog)[GIV(traceLogIndex) + 2] = 0;
-		GIV(traceLogIndex) = (GIV(traceLogIndex) + 3) % TraceBufferSize;
-	}
-	if (recordPrimTrace()) {
-		traceType = (GCModeFull == GCModeFull
-			? TraceFullGC
-			: TraceIncrementalGC);
-		/* begin fastLogPrim: */
-		GIV(primTraceLog)[GIV(primTraceLogIndex)] = traceType;
-		primTraceLogIndex(GIV(primTraceLogIndex) + 1);
-	}
+	preGCAction(GCModeFull);
 	GIV(needGCFlag) = 0;
 	GIV(gcStartUsecs) = ioUTCMicrosecondsNow();
 	GIV(statSweepCount) = (GIV(statMarkCount) = (GIV(statMkFwdCount) = (GIV(statCompMoveCount) = 0)));
@@ -24202,11 +24165,8 @@
     sqInt delta;
     sqInt growth;
     sqInt i;
-    sqInt i1;
-    sqInt i2;
     sqInt limit;
     sqInt survivorCount;
-    sqInt traceType;
     sqInt weDidGrow;
 
 	if (GIV(rootTableOverflowed)) {
@@ -24219,41 +24179,7 @@
 		return;
 	}
 	runLeakCheckerForFullGC(0);
-	/* begin preGCAction: */
-	if (GIV(stackPage) != 0) {
-		/* begin externalWriteBackHeadFramePointers */
-		assert((GIV(framePointer) - GIV(stackPointer)) < LargeContextSize);
-		assert(GIV(stackPage) == (mostRecentlyUsedPage()));
-		/* begin setHeadFP:andSP:inPage: */
-		assert(GIV(stackPointer) < GIV(framePointer));
-		assert((GIV(stackPointer) < ((GIV(stackPage)->baseAddress)))
-		 && (GIV(stackPointer) > (((GIV(stackPage)->realStackLimit)) - LargeContextSize)));
-		assert((GIV(framePointer) < ((GIV(stackPage)->baseAddress)))
-		 && (GIV(framePointer) > (((GIV(stackPage)->realStackLimit)) - (((sqInt) LargeContextSize >> 1)))));
-		(GIV(stackPage)->headFP = GIV(framePointer));
-		(GIV(stackPage)->headSP = GIV(stackPointer));
-		assert(pageListIsWellFormed());
-	}
-	
-	GIV(gcMode) = GCModeIncr;
-	if (recordEventTrace()) {
-		traceType = (GCModeIncr == GCModeFull
-			? TraceFullGC
-			: TraceIncrementalGC);
-		/* begin recordTrace:thing:source: */
-		GIV(traceLog)[GIV(traceLogIndex)] = traceType;
-		GIV(traceLog)[GIV(traceLogIndex) + 1] = traceType;
-		GIV(traceLog)[GIV(traceLogIndex) + 2] = 0;
-		GIV(traceLogIndex) = (GIV(traceLogIndex) + 3) % TraceBufferSize;
-	}
-	if (recordPrimTrace()) {
-		traceType = (GCModeIncr == GCModeFull
-			? TraceFullGC
-			: TraceIncrementalGC);
-		/* begin fastLogPrim: */
-		GIV(primTraceLog)[GIV(primTraceLogIndex)] = traceType;
-		primTraceLogIndex(GIV(primTraceLogIndex) + 1);
-	}
+	preGCAction(GCModeIncr);
 	GIV(needGCFlag) = 0;
 	GIV(gcStartUsecs) = ioUTCMicrosecondsNow();
 	GIV(statSweepCount) = (GIV(statMarkCount) = (GIV(statMkFwdCount) = (GIV(statCompMoveCount) = 0)));
@@ -30466,6 +30392,72 @@
 }
 
 
+/*	Need to write back the frame pointers unless all pages are free (as in
+	snapshot) 
+ */
+/*	Need to write back the frame pointers unless all pages are free (as in
+	snapshot). Need to set gcMode var (to avoid passing the flag through a lot
+	of the updating code) */
+
+static void
+preGCAction(sqInt gcModeArg)
+{   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt i;
+    sqInt i1;
+    sqInt traceType;
+
+	if (GIV(stackPage) != 0) {
+		/* begin externalWriteBackHeadFramePointers */
+		assert((GIV(framePointer) - GIV(stackPointer)) < LargeContextSize);
+		assert(GIV(stackPage) == (mostRecentlyUsedPage()));
+		/* begin setHeadFP:andSP:inPage: */
+		assert(GIV(stackPointer) < GIV(framePointer));
+		assert((GIV(stackPointer) < ((GIV(stackPage)->baseAddress)))
+		 && (GIV(stackPointer) > (((GIV(stackPage)->realStackLimit)) - LargeContextSize)));
+		assert((GIV(framePointer) < ((GIV(stackPage)->baseAddress)))
+		 && (GIV(framePointer) > (((GIV(stackPage)->realStackLimit)) - (((sqInt) LargeContextSize >> 1)))));
+		(GIV(stackPage)->headFP = GIV(framePointer));
+		(GIV(stackPage)->headSP = GIV(stackPointer));
+		assert(pageListIsWellFormed());
+	}
+	if ((gcModeArg == GCModeFull)
+	 && (0)) {
+		/* begin flushMethodCache */
+		for (i = 1; i <= MethodCacheSize; i += 1) {
+			GIV(methodCache)[i] = 0;
+		}
+
+		/* this for primitiveExternalMethod */
+
+		GIV(lastMethodCacheProbeWrite) = 0;
+		/* begin flushAtCache */
+		for (i1 = 1; i1 <= AtCacheTotalSize; i1 += 1) {
+			GIV(atCache)[i1] = 0;
+		}
+		unlinkAllSends();
+	}
+	GIV(gcMode) = gcModeArg;
+	if (recordEventTrace()) {
+		traceType = (gcModeArg == GCModeFull
+			? TraceFullGC
+			: TraceIncrementalGC);
+		/* begin recordTrace:thing:source: */
+		GIV(traceLog)[GIV(traceLogIndex)] = traceType;
+		GIV(traceLog)[GIV(traceLogIndex) + 1] = traceType;
+		GIV(traceLog)[GIV(traceLogIndex) + 2] = 0;
+		GIV(traceLogIndex) = (GIV(traceLogIndex) + 3) % TraceBufferSize;
+	}
+	if (recordPrimTrace()) {
+		traceType = (gcModeArg == GCModeFull
+			? TraceFullGC
+			: TraceIncrementalGC);
+		/* begin fastLogPrim: */
+		GIV(primTraceLog)[GIV(primTraceLogIndex)] = traceType;
+		primTraceLogIndex(GIV(primTraceLogIndex) + 1);
+	}
+}
+
+
 /*	Ensure that there are enough forwarding blocks to 
 	accomodate this become, then prepare forwarding blocks for 
 	the pointer swap. Return true if successful. */

Modified: branches/Cog/nscogsrc/vm/interp.h
===================================================================
--- branches/Cog/nscogsrc/vm/interp.h	2014-06-01 19:43:14 UTC (rev 2937)
+++ branches/Cog/nscogsrc/vm/interp.h	2014-06-02 01:11:49 UTC (rev 2938)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.741 uuid: f73b1214-56e1-4dde-a466-bad10d979d17
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
  */
 
 #define VM_PROXY_MAJOR 1

Modified: branches/Cog/nscogsrc/vm/vmCallback.h
===================================================================
--- branches/Cog/nscogsrc/vm/vmCallback.h	2014-06-01 19:43:14 UTC (rev 2937)
+++ branches/Cog/nscogsrc/vm/vmCallback.h	2014-06-02 01:11:49 UTC (rev 2938)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.741 uuid: f73b1214-56e1-4dde-a466-bad10d979d17
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
  */
 
 #define VM_CALLBACK_INC 1

Modified: branches/Cog/nsspursrc/vm/cogit.c
===================================================================
--- branches/Cog/nsspursrc/vm/cogit.c	2014-06-01 19:43:14 UTC (rev 2937)
+++ branches/Cog/nsspursrc/vm/cogit.c	2014-06-02 01:11:49 UTC (rev 2938)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.745 uuid: 9ae88e74-1041-4ad2-be42-c2277e958b92
+	CCodeGenerator VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.745 uuid: 9ae88e74-1041-4ad2-be42-c2277e958b92
+	StackToRegisterMappingCogit VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.745 uuid: 9ae88e74-1041-4ad2-be42-c2277e958b92 " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -295,7 +295,7 @@
 #define NSSendIsPCAnnotated 1
 #define NumObjRefsInRuntime 2
 #define NumSendTrampolines 4
-#define NumTrampolines 58
+#define NumTrampolines 60
 #define OrCqR 93
 #define OrCwR 100
 #define OrRR 86
@@ -558,6 +558,7 @@
 void enterCogCodePopReceiverAndClassRegs(void);
 void enterCogCodePopReceiverArg0Regs(void);
 void enterCogCodePopReceiverArg1Arg0Regs(void);
+static void evaluateat(BytecodeDescriptor *descriptor, sqInt pc) NoDbgRegParms;
 static sqInt extABytecode(void);
 static sqInt extBBytecode(void);
 static sqInt extendedPushBytecode(void);
@@ -928,6 +929,7 @@
 static sqInt literalBeforeFollowingAddress(AbstractInstruction * self_in_literalBeforeFollowingAddress, sqInt followingAddress) NoDbgRegParms;
 static sqInt liveRegisters(void);
 static sqInt loadLiteralByteSize(AbstractInstruction * self_in_loadLiteralByteSize) NoDbgRegParms;
+static void loadSubsequentBytesForDescriptorat(BytecodeDescriptor *descriptor, sqInt pc) NoDbgRegParms;
 static sqInt log2BytesPerWord(void);
 static AbstractInstruction * longJumpTargetAddress(AbstractInstruction * self_in_longJumpTargetAddress) NoDbgRegParms;
 static AbstractInstruction * gMoveAwR(sqInt address, sqInt reg) NoDbgRegParms;
@@ -1094,6 +1096,7 @@
 static sqInt sib(AbstractInstruction * self_in_sib, sqInt scale, sqInt indexReg, sqInt baseReg) NoDbgRegParms;
 sqInt traceLinkedSendOffset(void);
 static char * trampolineNamenumArgs(char *routinePrefix, sqInt numArgs) NoDbgRegParms;
+static sqInt tryCollapseTempVectorInitializationOfSize(sqInt slots) NoDbgRegParms;
 static sqInt twoByteInstructionSizeAt(AbstractInstruction * self_in_twoByteInstructionSizeAt, sqInt pc) NoDbgRegParms;
 static sqInt unimplementedPrimitive(void);
 static sqInt unknownBytecode(void);
@@ -4109,18 +4112,7 @@
 		
 		byte0 = (fetchByteofObject(bytecodePC, methodObj)) + bytecodeSetOffset;
 		descriptor = generatorAt(byte0);
-		if (((descriptor->numBytes)) > 1) {
-			byte1 = fetchByteofObject(bytecodePC + 1, methodObj);
-			if (((descriptor->numBytes)) > 2) {
-				byte2 = fetchByteofObject(bytecodePC + 2, methodObj);
-				if (((descriptor->numBytes)) > 3) {
-					byte3 = fetchByteofObject(bytecodePC + 3, methodObj);
-					if (((descriptor->numBytes)) > 4) {
-						notYetImplemented();
-					}
-				}
-			}
-		}
+		loadSubsequentBytesForDescriptorat(descriptor, bytecodePC);
 		nextOpcodeIndex = opcodeIndex;
 		result = (deadCode
 			? ((((descriptor->isMapped))
@@ -10331,7 +10323,16 @@
 	realCEEnterCogCodePopReceiverArg1Arg0Regs();
 }
 
+static void
+evaluateat(BytecodeDescriptor *descriptor, sqInt pc)
+{
+	byte0 = fetchByteofObject(pc, methodObj);
+	assert(descriptor == (generatorAt(bytecodeSetOffset + byte0)));
+	loadSubsequentBytesForDescriptorat(descriptor, pc);
+	((descriptor->generator))();
+}
 
+
 /*	224		11100000	aaaaaaaa	Extend A (Ext A = Ext A prev * 256 + Ext A) */
 
 static sqInt
@@ -16673,6 +16674,11 @@
 		ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg);
 	}
 	size = byte1 & 0x7F;
+	if (!popValues) {
+		if (tryCollapseTempVectorInitializationOfSize(size)) {
+			return 0;
+		}
+	}
 	genNewArrayOfSizeinitialized(size, !popValues);
 	if (popValues) {
 		for (i = (size - 1); i >= 0; i += -1) {
@@ -19408,6 +19414,23 @@
 	return 5;
 }
 
+static void
+loadSubsequentBytesForDescriptorat(BytecodeDescriptor *descriptor, sqInt pc)
+{
+	if (((descriptor->numBytes)) > 1) {
+		byte1 = fetchByteofObject(pc + 1, methodObj);
+		if (((descriptor->numBytes)) > 2) {
+			byte2 = fetchByteofObject(pc + 2, methodObj);
+			if (((descriptor->numBytes)) > 3) {
+				byte3 = fetchByteofObject(pc + 3, methodObj);
+				if (((descriptor->numBytes)) > 4) {
+					notYetImplemented();
+				}
+			}
+		}
+	}
+}
+
 static sqInt
 log2BytesPerWord(void)
 {
@@ -22934,7 +22957,59 @@
 	return theString;
 }
 
+
+/*	Try and collapse
+	push: (Array new: 1)
+	popIntoTemp: tempIndex
+	pushConstant: const or pushTemp: n
+	popIntoTemp: 0 inVectorAt: tempIndex
+	into
+	tempAt: tempIndex put: {const}.
+	One might think that we should look for a sequence of more than
+	one pushes and pops but this is extremely rare. */
+
 static sqInt
+tryCollapseTempVectorInitializationOfSize(sqInt slots)
+{
+    BytecodeDescriptor *pushArrayDesc;
+    BytecodeDescriptor *pushValueDesc;
+    sqInt reg;
+    BytecodeDescriptor *storeArrayDesc;
+    BytecodeDescriptor *storeValueDesc;
+
+	if (slots != 1) {
+		return 0;
+	}
+	pushArrayDesc = generatorAt(bytecodeSetOffset + (fetchByteofObject(bytecodePC, methodObj)));
+	assert(((pushArrayDesc->generator)) == genPushNewArrayBytecode);
+	storeArrayDesc = generatorAt(bytecodeSetOffset + (fetchByteofObject(bytecodePC + ((pushArrayDesc->numBytes)), methodObj)));
+	if (((storeArrayDesc->generator)) != genStoreAndPopTemporaryVariableBytecode) {
+		return 0;
+	}
+	pushValueDesc = generatorAt(bytecodeSetOffset + (fetchByteofObject((bytecodePC + ((pushArrayDesc->numBytes))) + ((storeArrayDesc->numBytes)), methodObj)));
+	if ((((pushValueDesc->generator)) != genPushLiteralConstantBytecode)
+	 && ((((pushValueDesc->generator)) != genPushQuickIntegerConstantBytecode)
+	 && (((pushValueDesc->generator)) != genPushTemporaryVariableBytecode))) {
+		return 0;
+	}
+	storeValueDesc = generatorAt(bytecodeSetOffset + (fetchByteofObject(((bytecodePC + ((pushArrayDesc->numBytes))) + ((storeArrayDesc->numBytes))) + ((pushValueDesc->numBytes)), methodObj)));
+	if (((storeValueDesc->generator)) != genStoreAndPopRemoteTempLongBytecode) {
+		return 0;
+	}
+	genNewArrayOfSizeinitialized(1, 0);
+	evaluateat(pushValueDesc, (bytecodePC + ((pushArrayDesc->numBytes))) + ((storeArrayDesc->numBytes)));
+	reg = ssStorePoptoPreferredReg(1, TempReg);
+	genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, 0, ReceiverResultReg);
+	ssPushRegister(ReceiverResultReg);
+	evaluateat(storeArrayDesc, bytecodePC + ((pushArrayDesc->numBytes)));
+
+	/* + pushArrayDesc numBytes this gets added by nextBytecodePCFor:at:exts:in: */
+
+	bytecodePC = ((bytecodePC + ((storeArrayDesc->numBytes))) + ((pushValueDesc->numBytes))) + ((storeValueDesc->numBytes));
+	return 1;
+}
+
+static sqInt
 twoByteInstructionSizeAt(AbstractInstruction * self_in_twoByteInstructionSizeAt, sqInt pc)
 {
     sqInt op;

Modified: branches/Cog/nsspursrc/vm/cogit.h
===================================================================
--- branches/Cog/nsspursrc/vm/cogit.h	2014-06-01 19:43:14 UTC (rev 2937)
+++ branches/Cog/nsspursrc/vm/cogit.h	2014-06-02 01:11:49 UTC (rev 2938)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.745 uuid: 9ae88e74-1041-4ad2-be42-c2277e958b92
+	CCodeGenerator VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
  */
 
 

Modified: branches/Cog/nsspursrc/vm/cogmethod.h
===================================================================
--- branches/Cog/nsspursrc/vm/cogmethod.h	2014-06-01 19:43:14 UTC (rev 2937)
+++ branches/Cog/nsspursrc/vm/cogmethod.h	2014-06-02 01:11:49 UTC (rev 2938)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.745 uuid: 9ae88e74-1041-4ad2-be42-c2277e958b92
+	CCodeGenerator VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
  */
 
 typedef struct {

Modified: branches/Cog/nsspursrc/vm/cointerp.c
===================================================================
--- branches/Cog/nsspursrc/vm/cointerp.c	2014-06-01 19:43:14 UTC (rev 2937)
+++ branches/Cog/nsspursrc/vm/cointerp.c	2014-06-02 01:11:49 UTC (rev 2938)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.741 uuid: f73b1214-56e1-4dde-a466-bad10d979d17
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
    from
-	CoInterpreter VMMaker.oscog-eem.741 uuid: f73b1214-56e1-4dde-a466-bad10d979d17
+	CoInterpreter VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.741 uuid: f73b1214-56e1-4dde-a466-bad10d979d17 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -967,6 +967,7 @@
 static void postBecomeOrCompactScanClassTable(sqInt effectsFlags) NoDbgRegParms;
 static void postGCAction(sqInt gcModeArg) NoDbgRegParms;
 static void postSnapshot(void);
+static void preGCAction(sqInt gcModeArg) NoDbgRegParms;
 static void prepareForSnapshot(void);
 sqInt primErrTable(void);
 usqInt primFailCodeAddress(void);
@@ -1476,8 +1477,8 @@
 _iss sqInt falseObj;
 _iss sqInt needGCFlag;
 _iss sqInt totalFreeOldSpace;
-_iss sqInt traceLogIndex;
 _iss sqInt bytesPerPage;
+_iss sqInt traceLogIndex;
 _iss sqInt numSegments;
 _iss usqInt pastSpaceStart;
 _iss char * stackLimit;
@@ -1485,9 +1486,9 @@
 _iss usqInt scavengeThreshold;
 _iss usqInt freeListsMask;
 _iss sqInt rememberedSetSize;
-_iss unsigned char primTraceLogIndex;
 _iss SpurContiguousObjStack unscannedEphemerons;
 _iss sqInt firstFreeChunk;
+_iss unsigned char primTraceLogIndex;
 _iss StackPage * mostRecentlyUsedPage;
 _iss SpurNewSpaceSpace pastSpace;
 _iss sqInt numStackPages;
@@ -1522,9 +1523,9 @@
 _iss sqInt profileMethod;
 _iss sqInt classTableIndex;
 _iss sqInt ephemeronQueue;
-_iss sqInt lastMethodCacheProbeWrite;
 _iss sqInt lkupClass;
 _iss sqInt backwardJumpCount;
+_iss sqInt lastMethodCacheProbeWrite;
 _iss sqInt metaclassNumSlots;
 _iss usqLong nextWakeupUsecs;
 _iss sqInt preemptionYields;
@@ -1534,7 +1535,6 @@
 _iss usqLong longRunningPrimitiveStopUsecs;
 _iss sqInt numSegInfos;
 _iss usqLong statCheckForEvents;
-_iss sqInt gcMode;
 _iss sqInt lastCoggableInterpretedBlockMethod;
 _iss sqInt lastUncoggableInterpretedBlockMethod;
 _iss usqInt lowSpaceThreshold;
@@ -1543,6 +1543,7 @@
 _iss sqInt cogCodeSize;
 _iss sqInt externalPrimitiveTableFirstFreeIndex;
 _iss sqInt flagInterpretedMethods;
+_iss sqInt gcMode;
 _iss sqInt pendingFinalizationSignals;
 _iss usqLong statIOProcessEvents;
 _iss sqInt firstSegmentSize;
@@ -2237,7 +2238,7 @@
 	/* 574 */ (void (*)(void))0,
 	/* 575 */ (void (*)(void))0,
  0 };
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.741";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.746";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
@@ -5530,7 +5531,6 @@
 							GIV(framePointer) = localFP;
 							
 							ceEnterCogCodePopReceiverReg();
-							null;
 							goto l290;
 						}
 						localIP = pointerForOop(longAt(localFP + FoxIFSavedIP));
@@ -5548,7 +5548,7 @@
 					/* begin fetchNextBytecode */
 					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
 
-					null;
+					/* return self */
 				l290:	/* end baseFrameReturn */;
 					goto l287;
 				}
@@ -29180,61 +29180,10 @@
 usqLong
 fullGC(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
-    sqInt i;
-    sqInt i1;
-    sqInt traceType;
-
 	GIV(needGCFlag) = 0;
 	GIV(gcStartUsecs) = ioUTCMicrosecondsNow();
 	GIV(statMarkCount) = 0;
-	/* begin preGCAction: */
-	if (GIV(stackPage) != 0) {
-		/* begin externalWriteBackHeadFramePointers */
-		assert((GIV(framePointer) - GIV(stackPointer)) < LargeContextSize);
-		assert(GIV(stackPage) == (mostRecentlyUsedPage()));
-		/* begin setHeadFP:andSP:inPage: */
-		assert(GIV(stackPointer) < GIV(framePointer));
-		assert((GIV(stackPointer) < ((GIV(stackPage)->baseAddress)))
-		 && (GIV(stackPointer) > (((GIV(stackPage)->realStackLimit)) - LargeContextSize)));
-		assert((GIV(framePointer) < ((GIV(stackPage)->baseAddress)))
-		 && (GIV(framePointer) > (((GIV(stackPage)->realStackLimit)) - (((sqInt) LargeContextSize >> 1)))));
-		(GIV(stackPage)->headFP = GIV(framePointer));
-		(GIV(stackPage)->headSP = GIV(stackPointer));
-		assert(pageListIsWellFormed());
-	}
-	/* begin flushMethodCache */
-	for (i = 1; i <= MethodCacheSize; i += 1) {
-		GIV(methodCache)[i] = 0;
-	}
-
-	/* this for primitiveExternalMethod */
-
-	GIV(lastMethodCacheProbeWrite) = 0;
-	/* begin flushAtCache */
-	for (i1 = 1; i1 <= AtCacheTotalSize; i1 += 1) {
-		GIV(atCache)[i1] = 0;
-	}
-	unlinkAllSends();
-
-	GIV(gcMode) = GCModeFull;
-	if (recordEventTrace()) {
-		traceType = (GCModeFull == GCModeFull
-			? TraceFullGC
-			: TraceIncrementalGC);
-		/* begin recordTrace:thing:source: */
-		GIV(traceLog)[GIV(traceLogIndex)] = traceType;
-		GIV(traceLog)[GIV(traceLogIndex) + 1] = traceType;
-		GIV(traceLog)[GIV(traceLogIndex) + 2] = 0;
-		GIV(traceLogIndex) = (GIV(traceLogIndex) + 3) % TraceBufferSize;
-	}
-	if (recordPrimTrace()) {
-		traceType = (GCModeFull == GCModeFull
-			? TraceFullGC
-			: TraceIncrementalGC);
-		/* begin fastLogPrim: */
-		GIV(primTraceLog)[GIV(primTraceLogIndex)] = traceType;
-		primTraceLogIndex(GIV(primTraceLogIndex) + 1);
-	}
+	preGCAction(GCModeFull);
 	/* begin globalGarbageCollect */
 	null;
 	assert(validObjStacks());
@@ -38542,6 +38491,72 @@
 }
 
 
+/*	Need to write back the frame pointers unless all pages are free (as in
+	snapshot) 
+ */
+/*	Need to write back the frame pointers unless all pages are free (as in
+	snapshot). Need to set gcMode var (to avoid passing the flag through a lot
+	of the updating code) */
+
+static void
+preGCAction(sqInt gcModeArg)
+{   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt i;
+    sqInt i1;
+    sqInt traceType;
+
+	if (GIV(stackPage) != 0) {
+		/* begin externalWriteBackHeadFramePointers */
+		assert((GIV(framePointer) - GIV(stackPointer)) < LargeContextSize);
+		assert(GIV(stackPage) == (mostRecentlyUsedPage()));
+		/* begin setHeadFP:andSP:inPage: */
+		assert(GIV(stackPointer) < GIV(framePointer));
+		assert((GIV(stackPointer) < ((GIV(stackPage)->baseAddress)))
+		 && (GIV(stackPointer) > (((GIV(stackPage)->realStackLimit)) - LargeContextSize)));
+		assert((GIV(framePointer) < ((GIV(stackPage)->baseAddress)))
+		 && (GIV(framePointer) > (((GIV(stackPage)->realStackLimit)) - (((sqInt) LargeContextSize >> 1)))));
+		(GIV(stackPage)->headFP = GIV(framePointer));
+		(GIV(stackPage)->headSP = GIV(stackPointer));
+		assert(pageListIsWellFormed());
+	}
+	if ((gcModeArg == GCModeFull)
+	 && (1)) {
+		/* begin flushMethodCache */
+		for (i = 1; i <= MethodCacheSize; i += 1) {
+			GIV(methodCache)[i] = 0;
+		}
+
+		/* this for primitiveExternalMethod */
+
+		GIV(lastMethodCacheProbeWrite) = 0;
+		/* begin flushAtCache */
+		for (i1 = 1; i1 <= AtCacheTotalSize; i1 += 1) {
+			GIV(atCache)[i1] = 0;
+		}
+		unlinkAllSends();
+	}
+	GIV(gcMode) = gcModeArg;
+	if (recordEventTrace()) {
+		traceType = (gcModeArg == GCModeFull
+			? TraceFullGC
+			: TraceIncrementalGC);
+		/* begin recordTrace:thing:source: */
+		GIV(traceLog)[GIV(traceLogIndex)] = traceType;
+		GIV(traceLog)[GIV(traceLogIndex) + 1] = traceType;
+		GIV(traceLog)[GIV(traceLogIndex) + 2] = 0;
+		GIV(traceLogIndex) = (GIV(traceLogIndex) + 3) % TraceBufferSize;
+	}
+	if (recordPrimTrace()) {
+		traceType = (gcModeArg == GCModeFull
+			? TraceFullGC
+			: TraceIncrementalGC);
+		/* begin fastLogPrim: */
+		GIV(primTraceLog)[GIV(primTraceLogIndex)] = traceType;
+		primTraceLogIndex(GIV(primTraceLogIndex) + 1);
+	}
+}
+
+
 /*	shorten all segments by any trailing free space. */
 
 static void
@@ -62105,11 +62120,8 @@
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt i;
     sqInt i1;
-    sqInt i11;
-    sqInt i2;
     sqInt probe;
     usqLong statSGCDeltaUsecs = 0;
-    sqInt traceType;
 
 	assert(GIV(remapBufferCount) == 0);
 	if (!(asserta(((((eden()).limit)) - GIV(freeStart)) > (interpreterAllocationReserveBytes())))) {
@@ -62147,44 +62159,10 @@
 	/* begin runLeakCheckerForFullGC: */
 	runLeakCheckerForFullGCexcludeUnmarkedNewSpaceObjsclassIndicesShouldBeValid(0, 0, 1);
 	/* return self */
-	/* begin preGCAction: */
-	if (GIV(stackPage) != 0) {
-		/* begin externalWriteBackHeadFramePointers */
-		assert((GIV(framePointer) - GIV(stackPointer)) < LargeContextSize);
-		assert(GIV(stackPage) == (mostRecentlyUsedPage()));
-		/* begin setHeadFP:andSP:inPage: */
-		assert(GIV(stackPointer) < GIV(framePointer));
-		assert((GIV(stackPointer) < ((GIV(stackPage)->baseAddress)))
-		 && (GIV(stackPointer) > (((GIV(stackPage)->realStackLimit)) - LargeContextSize)));
-		assert((GIV(framePointer) < ((GIV(stackPage)->baseAddress)))
-		 && (GIV(framePointer) > (((GIV(stackPage)->realStackLimit)) - (((sqInt) LargeContextSize >> 1)))));
-		(GIV(stackPage)->headFP = GIV(framePointer));
-		(GIV(stackPage)->headSP = GIV(stackPointer));
-		assert(pageListIsWellFormed());
-	}
-	
-	GIV(gcMode) = GCModeScavenge;
-	if (recordEventTrace()) {
-		traceType = (GCModeScavenge == GCModeFull
-			? TraceFullGC
-			: TraceIncrementalGC);
-		/* begin recordTrace:thing:source: */
-		GIV(traceLog)[GIV(traceLogIndex)] = traceType;
-		GIV(traceLog)[GIV(traceLogIndex) + 1] = traceType;
-		GIV(traceLog)[GIV(traceLogIndex) + 2] = 0;
-		GIV(traceLogIndex) = (GIV(traceLogIndex) + 3) % TraceBufferSize;
-	}
-	if (recordPrimTrace()) {
-		traceType = (GCModeScavenge == GCModeFull
-			? TraceFullGC
-			: TraceIncrementalGC);
-		/* begin fastLogPrim: */
-		GIV(primTraceLog)[GIV(primTraceLogIndex)] = traceType;
-		primTraceLogIndex(GIV(primTraceLogIndex) + 1);
-	}
+	preGCAction(GCModeScavenge);
 	/* begin flushMethodCacheFrom:to: */
 	probe = 0;
-	for (i2 = 1; i2 <= MethodCacheEntries; i2 += 1) {
+	for (i = 1; i <= MethodCacheEntries; i += 1) {
 		if (!((GIV(methodCache)[probe + MethodCacheSelector]) == 0)) {
 			if (((((((usqInt) (GIV(methodCache)[probe + MethodCacheSelector]))) >= (((usqInt) GIV(newSpaceStart))))
 			 && ((((usqInt) (GIV(methodCache)[probe + MethodCacheSelector]))) < (((usqInt) GIV(newSpaceLimit)))))
@@ -62198,8 +62176,8 @@
 		probe += MethodCacheEntrySize;
 	}
 	/* begin flushAtCache */
-	for (i11 = 1; i11 <= AtCacheTotalSize; i11 += 1) {
-		GIV(atCache)[i11] = 0;
+	for (i1 = 1; i1 <= AtCacheTotalSize; i1 += 1) {
+		GIV(atCache)[i1] = 0;
 	}
 	GIV(needGCFlag) = 0;
 	GIV(gcStartUsecs) = ioUTCMicrosecondsNow();

Modified: branches/Cog/nsspursrc/vm/cointerp.h
===================================================================
--- branches/Cog/nsspursrc/vm/cointerp.h	2014-06-01 19:43:14 UTC (rev 2937)
+++ branches/Cog/nsspursrc/vm/cointerp.h	2014-06-02 01:11:49 UTC (rev 2938)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.741 uuid: f73b1214-56e1-4dde-a466-bad10d979d17
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
  */
 
 

Modified: branches/Cog/nsspursrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nsspursrc/vm/gcc3x-cointerp.c	2014-06-01 19:43:14 UTC (rev 2937)
+++ branches/Cog/nsspursrc/vm/gcc3x-cointerp.c	2014-06-02 01:11:49 UTC (rev 2938)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.741 uuid: f73b1214-56e1-4dde-a466-bad10d979d17
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
    from
-	CoInterpreter VMMaker.oscog-eem.741 uuid: f73b1214-56e1-4dde-a466-bad10d979d17
+	CoInterpreter VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.741 uuid: f73b1214-56e1-4dde-a466-bad10d979d17 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.746 uuid: cc4961d3-e629-4e28-b308-88eab314a8c9 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -970,6 +970,7 @@
 static void postBecomeOrCompactScanClassTable(sqInt effectsFlags) NoDbgRegParms;
 static void postGCAction(sqInt gcModeArg) NoDbgRegParms;
 static void postSnapshot(void);
+static void preGCAction(sqInt gcModeArg) NoDbgRegParms;
 static void prepareForSnapshot(void);
 sqInt primErrTable(void);
 usqInt primFailCodeAddress(void);
@@ -1479,8 +1480,8 @@
 _iss sqInt falseObj;
 _iss sqInt needGCFlag;
 _iss sqInt totalFreeOldSpace;
-_iss sqInt traceLogIndex;
 _iss sqInt bytesPerPage;
+_iss sqInt traceLogIndex;
 _iss sqInt numSegments;
 _iss usqInt pastSpaceStart;
 _iss char * stackLimit;
@@ -1488,9 +1489,9 @@
 _iss usqInt scavengeThreshold;
 _iss usqInt freeListsMask;
 _iss sqInt rememberedSetSize;
-_iss unsigned char primTraceLogIndex;
 _iss SpurContiguousObjStack unscannedEphemerons;
 _iss sqInt firstFreeChunk;
+_iss unsigned char primTraceLogIndex;
 _iss StackPage * mostRecentlyUsedPage;
 _iss SpurNewSpaceSpace pastSpace;
 _iss sqInt numStackPages;
@@ -1525,9 +1526,9 @@
 _iss sqInt profileMethod;
 _iss sqInt classTableIndex;
 _iss sqInt ephemeronQueue;
-_iss sqInt lastMethodCacheProbeWrite;
 _iss sqInt lkupClass;
 _iss sqInt backwardJumpCount;
+_iss sqInt lastMethodCacheProbeWrite;
 _iss sqInt metaclassNumSlots;
 _iss usqLong nextWakeupUsecs;
 _iss sqInt preemptionYields;
@@ -1537,7 +1538,6 @@
 _iss usqLong longRunningPrimitiveStopUsecs;
 _iss sqInt numSegInfos;
 _iss usqLong statCheckForEvents;
-_iss sqInt gcMode;
 _iss sqInt lastCoggableInterpretedBlockMethod;
 _iss sqInt lastUncoggableInterpretedBlockMethod;
 _iss usqInt lowSpaceThreshold;
@@ -1546,6 +1546,7 @@
 _iss sqInt cogCodeSize;
 _iss sqInt externalPrimitiveTableFirstFreeIndex;
 _iss sqInt flagInterpretedMethods;
+_iss sqInt gcMode;
 _iss sqInt pendingFinalizationSignals;
 _iss usqLong statIOProcessEvents;
 _iss sqInt firstSegmentSize;
@@ -2240,7 +2241,7 @@
 	/* 574 */ (void (*)(void))0,

@@ Diff output truncated at 50000 characters. @@


More information about the Vm-dev mailing list