[Vm-dev] [commit] r2488 - CogVM source as per VMMaker.oscog-eem.119.

commits at squeakvm.org commits at squeakvm.org
Fri Aug 19 21:33:13 UTC 2011


Author: eliot
Date: 2011-08-19 14:33:12 -0700 (Fri, 19 Aug 2011)
New Revision: 2488

Added:
   branches/Cog/scripts/mknsvmlinuxarchive
Modified:
   branches/Cog/nscogbuild/cygwinbuild/mvm
   branches/Cog/nscogbuild/macbuild/makevm
   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/platforms/Cross/vm/sqSCCSVersion.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
Log:
CogVM source as per VMMaker.oscog-eem.119.

CoInterpreter/StackInterpreter:
Fix object accessing prims (at:, at:put: & size 60, 61 & 612) for contexts,
because primitives  60-62 are used for the mirror primitives in ContextPart
(object:at: et al).  Fix now obsolete, but still used primitiveContextAt et al
(primitives 210, 211 & 212) to be varargs, since these might also be used from
mirror primitives.  Pull the temporary:in:[put:] code into a non-inlined wrapper
to avoid bloating the common case.

Cogit/CogObjectRepresentationForSqueakV3:
Fix genInnerPrimitiveAt: & genInnerPrimitiveSize to fail for context receivers.
Fix genInnerPrimitiveAt:, genInnerPrimitiveStringAt: & genInnerPrimitiveSize to
call the interpereter primitive on failure, to get the error code - not yet
avoiding the call if the method doesn't use the error code; one thing at a time.


Modified: branches/Cog/nscogbuild/cygwinbuild/mvm
===================================================================
--- branches/Cog/nscogbuild/cygwinbuild/mvm	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/nscogbuild/cygwinbuild/mvm	2011-08-19 21:33:12 UTC (rev 2488)
@@ -2,4 +2,18 @@
 rm -rf build*/vm/nsvm*.exe
 make debug;make assert;make
 ls -rlt build*/vm/nsvm*.exe
-echo "don't forget to link in sources!!"
+if [ ! -f builddbg/vm/SqueakV41.sources \
+  -a ! -f buildast/vm/SqueakV41.sources \
+  -a ! -f build/vm/SqueakV41.sources ]; then
+	echo "don't forget to link in sources!!"
+else
+	if [ ! -f builddbg/vm/SqueakV41.sources ]; then
+		echo "don't forget to link in builddbg/vm sources"
+	fi
+	if [ ! -f buildast/vm/SqueakV41.sources ]; then
+		echo "don't forget to link in buildast/vm sources"
+	fi
+	if [ ! -f build/vm/SqueakV41.sources ]; then
+		echo "don't forget to link in build/vm sources"
+	fi
+fi

Modified: branches/Cog/nscogbuild/macbuild/makevm
===================================================================
--- branches/Cog/nscogbuild/macbuild/makevm	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/nscogbuild/macbuild/makevm	2011-08-19 21:33:12 UTC (rev 2488)
@@ -70,3 +70,5 @@
 
 # Clean out any .svn directories (result of copying) in the VM
 find "$DEST" -name .svn -exec rm -rf {} \;
+#link source file into resources directory
+ln SqueakV41.sources "$DEST/Contents/Resources"

Modified: branches/Cog/nscogsrc/vm/cogit.c
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.c	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/nscogsrc/vm/cogit.c	2011-08-19 21:33:12 UTC (rev 2488)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CCodeGenerator VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	StackToRegisterMappingCogit VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9 " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -145,6 +145,7 @@
 #define BytesPerWord 4
 #define Call 9
 #define CDQ 103
+#define ClassMethodContextCompactIndex 14
 #define ClassReg -5
 #define ClosureFirstCopiedValueIndex 3
 #define ClosureNumArgsIndex 2
@@ -607,7 +608,6 @@
 static sqInt genGetHashFieldNonIntOfasSmallIntegerInto(sqInt instReg, sqInt destReg);
 static sqInt genGetLeafCallStackPointer(void);
 static void genGetLeafCallStackPointerFunction(AbstractInstruction * self_in_genGetLeafCallStackPointerFunction);
-static AbstractInstruction * genGetSizeOfintoformatRegscratchReg(sqInt sourceReg, sqInt destReg, sqInt formatReg, sqInt scratchReg);
 static sqInt genInnerPICAbortTrampoline(char *name);
 static sqInt genInnerPrimitiveAt(sqInt retNoffset);
 static sqInt genInnerPrimitiveSize(sqInt retNoffset);
@@ -772,7 +772,6 @@
 static sqInt hasPCDependentInstructions(AbstractInstruction * self_in_hasPCDependentInstructions);
 static sqInt hasSSE2Instructions(AbstractInstruction * self_in_hasSSE2Instructions);
 static sqInt hasSSEInstructions(AbstractInstruction * self_in_hasSSEInstructions);
-static sqInt hasValidHeaderPostGC(CogMethod *cogMethod);
 static sqInt incrementUsageOfTargetIfLinkedSendmcpcignored(sqInt annotation, char *mcpc, sqInt superfluity);
 static sqInt initialClosedPICUsageCount(void);
 static void initializeBackend(void);
@@ -870,6 +869,7 @@
 static AbstractInstruction * gNegateR(sqInt reg);
 static sqInt needsFrameIfInBlock(sqInt isInBlock);
 static sqInt needsFrameNever(sqInt isInBlock);
+static sqInt noAssertMethodClassAssociationOf(sqInt methodPointer);
 static sqInt noCogMethodsMaximallyMarked(void);
 static void nopsFromto(AbstractInstruction * self_in_nopsFromto, sqInt startAddr, sqInt endAddr);
 static sqInt noTargetsFreeInClosedPIC(CogMethod *cPIC);
@@ -1689,7 +1689,6 @@
 #define traceSimStack() 0
 #define traceSpill(ign) 0
 #define tryLockVMOwner() (ceTryLockVMOwner() != 0)
-#define typeEtAlWord(cm) (((long *)(cm))[1])
 #define unalignedLongAt(inst,byteAddress) longAt(byteAddress)
 #define unalignedLongAtput(inst,byteAddress,aWord) longAtput(byteAddress,aWord)
 #define unlockVMOwner() ceUnlockVMOwner()
@@ -1922,7 +1921,7 @@
 	cogMethod = ((CogMethod *) methodZoneBase);
 	while (cogMethod < (limitZony())) {
 		if (((cogMethod->cmType)) == CMMethod) {
-			if (!(hasValidHeaderPostGC(cogMethod))) {
+			if (!(((cogMethod->objectHeader)) == (nullHeaderForMachineCodeMethod()))) {
 				return 0;
 			}
 		}
@@ -2454,7 +2453,9 @@
     sqInt cacheTag;
     sqInt entryPoint;
     sqInt literal;
+    sqInt off;
     sqInt offset;
+    sqInt table;
     CogMethod *targetMethod;
 
 	if (annotation == IsObjectReference) {
@@ -2492,9 +2493,55 @@
 		}
 		entryPoint = callTargetFromReturnAddress(backEnd, ((sqInt)mcpc));
 		if (entryPoint > methodZoneBase) {
-			offset = ((entryPoint & entryPointMask) == checkedEntryAlignment
-				? cmEntryOffset
-				: cmNoCheckEntryOffset);
+			/* begin offsetAndSendTableFor:annotation:into: */
+			VM_LABEL(0offsetAndSendTableForannotationinto);
+			
+#      if NewspeakVM
+			if ((entryPoint & entryPointMask) == checkedEntryAlignment) {
+				assert(annotation == IsSendCall);
+				
+				/* It's a linked send; find which kind. */
+
+				offset = cmEntryOffset;
+
+			}
+			else {
+				if ((entryPoint & entryPointMask) == dynSuperEntryAlignment) {
+					assert(annotation == IsNSSendCall);
+					
+					/* It's a linked send; find which kind. */
+
+					offset = cmDynSuperEntryOffset;
+
+				}
+				else {
+					assert(annotation == IsSendCall);
+					
+					/* It's a linked send; find which kind. */
+
+					offset = cmNoCheckEntryOffset;
+
+				}
+			}
+
+#      else /* NewspeakVM */
+			if ((entryPoint & entryPointMask) == checkedEntryAlignment) {
+				
+				/* It's a linked send; find which kind. */
+
+				offset = cmEntryOffset;
+
+			}
+			else {
+				
+				/* It's a linked send; find which kind. */
+
+				offset = cmNoCheckEntryOffset;
+
+			}
+
+#      endif /* NewspeakVM */
+
 			targetMethod = ((CogMethod *) (entryPoint - offset));
 			if (!(asserta((((targetMethod->cmType)) == CMMethod)
 				 || ((((targetMethod->cmType)) == CMClosedPIC)
@@ -3171,7 +3218,7 @@
     CogMethod *cogMethod;
 
 	assert((!(methodHasCogMethod(aMethodObj)))
-	 || ((methodClassAssociationOf(aMethodObj)) == (nilObject())));
+	 || ((noAssertMethodClassAssociationOf(aMethodObj)) == (nilObject())));
 	compilationBreakpoint(aSelectorOop, lengthOf(aSelectorOop));
 	if (aMethodObj == breakMethod) {
 		haltmsg("Compilation of breakMethod");
@@ -3183,6 +3230,11 @@
 		null;
 	}
 	else {
+		if (!(methodHasCogMethod(aMethodObj))) {
+			assert((rawHeaderOf(aMethodObj)) == ((cogMethod->methodHeader)));
+			(cogMethod->methodObject = aMethodObj);
+			rawHeaderOfput(aMethodObj, ((sqInt)cogMethod));
+		}
 		return cogMethod;
 	}
 
@@ -3254,7 +3306,7 @@
 			(dest->objectHeader = objectHeaderValue);
 			if (((dest->cmType)) == CMMethod) {
 				assert(((((sqInt)(rawHeaderOf((dest->methodObject))))) == (((sqInt)source)))
-				 || ((methodClassAssociationOf((dest->methodObject))) == (nilObject())));
+				 || ((noAssertMethodClassAssociationOf((dest->methodObject))) == (nilObject())));
 				if ((((sqInt)(rawHeaderOf((dest->methodObject))))) == (((sqInt)source))) {
 					rawHeaderOfput((dest->methodObject), ((sqInt)dest));
 				}
@@ -7560,7 +7612,7 @@
 	assert((cogMethodDoesntLookKosher(cogMethod)) == 0);
 	if (((cogMethod->cmType)) == CMMethod) {
 		assert(((((sqInt)(rawHeaderOf((cogMethod->methodObject))))) == (((sqInt)cogMethod)))
-		 || ((methodClassAssociationOf((cogMethod->methodObject))) == (nilObject())));
+		 || ((noAssertMethodClassAssociationOf((cogMethod->methodObject))) == (nilObject())));
 		if ((((sqInt)(rawHeaderOf((cogMethod->methodObject))))) == (((sqInt)cogMethod))) {
 			rawHeaderOfput((cogMethod->methodObject), (cogMethod->methodHeader));
 		}
@@ -8916,11 +8968,11 @@
 	/* begin MoveMw:r:R: */
 	genoperandoperandoperand(MoveMwrR, 0, instReg, destReg);
 	/* begin LogicalShiftRightCq:R: */
-	quickConstant1 = (compactClassFieldLSB()) - ShiftForWord;
-	genoperandoperand(LogicalShiftRightCqR, quickConstant1, destReg);
+	quickConstant = (compactClassFieldLSB()) - ShiftForWord;
+	genoperandoperand(LogicalShiftRightCqR, quickConstant, destReg);
 	/* begin AndCq:R: */
-	quickConstant = ((1 << (compactClassFieldWidth())) - 1) << ShiftForWord;
-	genoperandoperand(AndCqR, quickConstant, destReg);
+	quickConstant1 = ((1 << (compactClassFieldWidth())) - 1) << ShiftForWord;
+	genoperandoperand(AndCqR, quickConstant1, destReg);
 	/* begin JumpNonZero: */
 	jumpCompact = genoperand(JumpNonZero, ((sqInt)0));
 	/* begin MoveMw:r:R: */
@@ -8962,11 +9014,11 @@
 	/* begin MoveMw:r:R: */
 	genoperandoperandoperand(MoveMwrR, 0, instReg, scratchReg);
 	/* begin LogicalShiftRightCq:R: */
-	quickConstant1 = (compactClassFieldLSB()) - ShiftForWord;
-	genoperandoperand(LogicalShiftRightCqR, quickConstant1, scratchReg);
+	quickConstant = (compactClassFieldLSB()) - ShiftForWord;
+	genoperandoperand(LogicalShiftRightCqR, quickConstant, scratchReg);
 	/* begin AndCq:R: */
-	quickConstant = ((1 << (compactClassFieldWidth())) - 1) << ShiftForWord;
-	genoperandoperand(AndCqR, quickConstant, scratchReg);
+	quickConstant1 = ((1 << (compactClassFieldWidth())) - 1) << ShiftForWord;
+	genoperandoperand(AndCqR, quickConstant1, scratchReg);
 	/* begin JumpNonZero: */
 	jumpCompact = genoperand(JumpNonZero, ((sqInt)0));
 	/* begin MoveMw:r:R: */
@@ -8998,11 +9050,11 @@
 	/* begin MoveMw:r:R: */
 	genoperandoperandoperand(MoveMwrR, 0, instReg, destReg);
 	/* begin LogicalShiftRightCq:R: */
-	quickConstant1 = compactClassFieldLSB();
-	genoperandoperand(LogicalShiftRightCqR, quickConstant1, destReg);
+	quickConstant = compactClassFieldLSB();
+	genoperandoperand(LogicalShiftRightCqR, quickConstant, destReg);
 	/* begin AndCq:R: */
-	quickConstant = (1 << (compactClassFieldWidth())) - 1;
-	genoperandoperand(AndCqR, quickConstant, destReg);
+	quickConstant1 = (1 << (compactClassFieldWidth())) - 1;
+	genoperandoperand(AndCqR, quickConstant1, destReg);
 	return 0;
 }
 
@@ -9089,138 +9141,145 @@
 }
 
 
-/*	Get the size of the non-immediate object in sourceReg into destReg using
-	formatReg and scratchReg as temps. None of these registers can overlap.
-	Answer the jump
-	taken if the object in sourceReg is not indexable. Hack: If the object hs
-	a pointer
-	format other than 2 leave the number of fixed fields in formatReg. Used by
-	primitiveSize, primitiveAt, primitiveAtPut, primitiveStringAt &
-	primitiveStringAtPut  */
+/*	Generate the abort for a PIC. This abort performs either a call of
+	ceInterpretMethodFromPIC:receiver: to handle invoking an uncogged
+	target or a call of ceMNUFromPICMNUMethod:receiver: to handle an
+	MNU dispatch in a closed PIC. It distinguishes the two by testing
+	ClassReg. If the register is zero then this is an MNU. */
+
+static sqInt
+genInnerPICAbortTrampoline(char *name)
+{
+    AbstractInstruction *jumpMNUCase;
+
+	/* begin CmpCq:R: */
+	genoperandoperand(CmpCqR, 0, ClassReg);
+	/* begin JumpZero: */
+	jumpMNUCase = genoperand(JumpZero, ((sqInt)0));
+	compileTrampolineForcallJumpBarnumArgsargargargargsaveRegsresultReg(ceInterpretMethodFromPICreceiver, 1, 2, SendNumArgsReg, ReceiverResultReg, null, null, 0, null);
+	jmpTarget(jumpMNUCase, gLabel());
+	return genTrampolineForcalledcallJumpBarnumArgsargargargargsaveRegsresultRegappendOpcodes(ceMNUFromPICMNUMethodreceiver, name, 1, 2, SendNumArgsReg, ReceiverResultReg, null, null, 0, null, 1);
+}
+
+
 /*	c.f. StackInterpreter>>stSizeOf: lengthOf:baseHeader:format:
 	fixedFieldsOf:format:length: 
  */
-/*	and one wonders why Squeak V1 through V3 are slow... */
 
-static AbstractInstruction *
-genGetSizeOfintoformatRegscratchReg(sqInt sourceReg, sqInt destReg, sqInt formatReg, sqInt scratchReg)
+static sqInt
+genInnerPrimitiveAt(sqInt retNoffset)
 {
+    sqInt jic;
     AbstractInstruction *jmpFmtGe8;
+    sqInt jnx;
+    AbstractInstruction *jumpBounds;
+    AbstractInstruction *jumpFmtEq2;
+    AbstractInstruction *jumpFmtGt4;
     AbstractInstruction *jumpFmtIs2;
     AbstractInstruction *jumpFmtLe4;
+    AbstractInstruction *jumpFmtLt8;
     AbstractInstruction *jumpGotByteSize;
     AbstractInstruction *jumpGotWordSize;
+    AbstractInstruction *jumpIsContext;
+    AbstractInstruction *jumpIsContext1;
+    AbstractInstruction *jumpLarge;
     AbstractInstruction *jumpNotIndexable;
+    AbstractInstruction *jumpNotIndexable1;
+    AbstractInstruction *jumpNotSI;
     AbstractInstruction *jumpShortHeader;
+    AbstractInstruction *jumpSI;
     AbstractInstruction *jumpSkip;
+    sqInt quickConstant;
+    sqInt quickConstant1;
+    sqInt quickConstant11;
+    sqInt quickConstant2;
+    sqInt quickConstant3;
+    sqInt quickConstant4;
 
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, ReceiverResultReg, TempReg);
+	jumpSI = genJumpSmallIntegerInScratchReg(TempReg);
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, Arg0Reg, TempReg);
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, Arg0Reg, Arg1Reg);
+	jumpNotSI = genJumpNotSmallIntegerInScratchReg(TempReg);
+	/* begin genGetSizeOf:into:formatReg:scratchReg:abortJumpsInto: */
+	VM_LABEL(0genGetSizeOfintoformatRegscratchRegabortJumpsInto);
 	/* begin MoveMw:r:R: */
-	genoperandoperandoperand(MoveMwrR, 0, sourceReg, formatReg);
+	genoperandoperandoperand(MoveMwrR, 0, ReceiverResultReg, SendNumArgsReg);
 	/* begin MoveR:R: */
-	genoperandoperand(MoveRR, formatReg, destReg);
+	genoperandoperand(MoveRR, SendNumArgsReg, ClassReg);
 	/* begin LogicalShiftRightCq:R: */
-	genoperandoperand(LogicalShiftRightCqR, 8, formatReg);
+	quickConstant4 = instFormatFieldLSB();
+	genoperandoperand(LogicalShiftRightCqR, quickConstant4, SendNumArgsReg);
 	/* begin AndCq:R: */
-	genoperandoperand(AndCqR, 15, formatReg);
+	quickConstant11 = (1 << (instFormatFieldWidth())) - 1;
+	genoperandoperand(AndCqR, quickConstant11, SendNumArgsReg);
 	/* begin CmpCq:R: */
-	genoperandoperand(CmpCqR, 2, formatReg);
+	genoperandoperand(CmpCqR, 2, SendNumArgsReg);
 	/* begin JumpLess: */
-	jumpNotIndexable = genoperand(JumpLess, ((sqInt)0));
+	jumpNotIndexable1 = genoperand(JumpLess, ((sqInt)0));
 	/* begin MoveR:R: */
-	genoperandoperand(MoveRR, destReg, scratchReg);
+	genoperandoperand(MoveRR, ClassReg, TempReg);
+	/* begin LogicalShiftRightCq:R: */
+	quickConstant2 = compactClassFieldLSB();
+	genoperandoperand(LogicalShiftRightCqR, quickConstant2, TempReg);
 	/* begin AndCq:R: */
-	genoperandoperand(AndCqR, TypeMask, scratchReg);
+	quickConstant3 = (1 << (compactClassFieldWidth())) - 1;
+	genoperandoperand(AndCqR, quickConstant3, TempReg);
 	/* begin CmpCq:R: */
-	genoperandoperand(CmpCqR, HeaderTypeSizeAndClass, scratchReg);
+	genoperandoperand(CmpCqR, ClassMethodContextCompactIndex, TempReg);
+	/* begin JumpZero: */
+	jumpIsContext1 = genoperand(JumpZero, ((sqInt)0));
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, ClassReg, TempReg);
+	/* begin AndCq:R: */
+	genoperandoperand(AndCqR, TypeMask, TempReg);
+	/* begin CmpCq:R: */
+	genoperandoperand(CmpCqR, HeaderTypeSizeAndClass, TempReg);
 	/* begin JumpNonZero: */
 	jumpShortHeader = genoperand(JumpNonZero, ((sqInt)0));
 	assert(Size4Bit == 0);
 	/* begin MoveMw:r:R: */
-	genoperandoperandoperand(MoveMwrR, 0 - (2 * BytesPerWord), sourceReg, destReg);
+	genoperandoperandoperand(MoveMwrR, 0 - (2 * BytesPerWord), ReceiverResultReg, ClassReg);
 	/* begin AndCq:R: */
-	genoperandoperand(AndCqR, ((sqInt) LongSizeMask), destReg);
+	genoperandoperand(AndCqR, ((sqInt) LongSizeMask), ClassReg);
 	/* begin Jump: */
 	jumpSkip = genoperand(Jump, ((sqInt)0));
-	jmpTarget(jumpShortHeader, gAndCqR(SizeMask, destReg));
-	jmpTarget(jumpSkip, gSubCqR(BaseHeaderSize, destReg));
+	jmpTarget(jumpShortHeader, gAndCqR(SizeMask, ClassReg));
+	jmpTarget(jumpSkip, gSubCqR(BaseHeaderSize, ClassReg));
 	/* begin CmpCq:R: */
-	genoperandoperand(CmpCqR, 4, formatReg);
+	genoperandoperand(CmpCqR, 4, SendNumArgsReg);
 	/* begin JumpLessOrEqual: */
 	jumpFmtLe4 = genoperand(JumpLessOrEqual, ((sqInt)0));
 	/* begin CmpCq:R: */
-	genoperandoperand(CmpCqR, 8, formatReg);
+	genoperandoperand(CmpCqR, 8, SendNumArgsReg);
 	/* begin JumpLess: */
 	jmpFmtGe8 = genoperand(JumpLess, ((sqInt)0));
 	/* begin AndCq:R: */
-	genoperandoperand(AndCqR, 3, formatReg);
+	genoperandoperand(AndCqR, 3, SendNumArgsReg);
 	/* begin SubR:R: */
-	genoperandoperand(SubRR, formatReg, destReg);
+	genoperandoperand(SubRR, SendNumArgsReg, ClassReg);
 	/* begin Jump: */
 	jumpGotByteSize = genoperand(Jump, ((sqInt)0));
-	jmpTarget(jmpFmtGe8, gLogicalShiftRightCqR(2, destReg));
+	jmpTarget(jmpFmtGe8, gLogicalShiftRightCqR(2, ClassReg));
 	/* begin Jump: */
 	jumpGotWordSize = genoperand(Jump, ((sqInt)0));
 	jmpTarget(jumpFmtLe4, gLabel());
 	/* begin LogicalShiftRightCq:R: */
-	genoperandoperand(LogicalShiftRightCqR, ShiftForWord, destReg);
+	genoperandoperand(LogicalShiftRightCqR, ShiftForWord, ClassReg);
 	/* begin CmpCq:R: */
-	genoperandoperand(CmpCqR, 2, formatReg);
+	genoperandoperand(CmpCqR, 2, SendNumArgsReg);
 	/* begin JumpZero: */
 	jumpFmtIs2 = genoperand(JumpZero, ((sqInt)0));
-	genGetFixedFieldsOfPointerNonIntintoscratchReg(sourceReg, formatReg, scratchReg);
+	genGetFixedFieldsOfPointerNonIntintoscratchReg(ReceiverResultReg, SendNumArgsReg, TempReg);
 	/* begin SubR:R: */
-	genoperandoperand(SubRR, formatReg, destReg);
+	genoperandoperand(SubRR, SendNumArgsReg, ClassReg);
 	jmpTarget(jumpFmtIs2, jmpTarget(jumpGotWordSize, jmpTarget(jumpGotByteSize, gLabel())));
-	return jumpNotIndexable;
-}
+		jumpNotIndexable = jumpNotIndexable1;
+	jumpIsContext = jumpIsContext1;
 
-
-/*	Generate the abort for a PIC. This abort performs either a call of
-	ceInterpretMethodFromPIC:receiver: to handle invoking an uncogged
-	target or a call of ceMNUFromPICMNUMethod:receiver: to handle an
-	MNU dispatch in a closed PIC. It distinguishes the two by testing
-	ClassReg. If the register is zero then this is an MNU. */
-
-static sqInt
-genInnerPICAbortTrampoline(char *name)
-{
-    AbstractInstruction *jumpMNUCase;
-
-	/* begin CmpCq:R: */
-	genoperandoperand(CmpCqR, 0, ClassReg);
-	/* begin JumpZero: */
-	jumpMNUCase = genoperand(JumpZero, ((sqInt)0));
-	compileTrampolineForcallJumpBarnumArgsargargargargsaveRegsresultReg(ceInterpretMethodFromPICreceiver, 1, 2, SendNumArgsReg, ReceiverResultReg, null, null, 0, null);
-	jmpTarget(jumpMNUCase, gLabel());
-	return genTrampolineForcalledcallJumpBarnumArgsargargargargsaveRegsresultRegappendOpcodes(ceMNUFromPICMNUMethodreceiver, name, 1, 2, SendNumArgsReg, ReceiverResultReg, null, null, 0, null, 1);
-}
-
-
-/*	c.f. StackInterpreter>>stSizeOf: lengthOf:baseHeader:format:
-	fixedFieldsOf:format:length: 
- */
-
-static sqInt
-genInnerPrimitiveAt(sqInt retNoffset)
-{
-    AbstractInstruction *jumpBounds;
-    AbstractInstruction *jumpFmtEq2;
-    AbstractInstruction *jumpFmtGt4;
-    AbstractInstruction *jumpFmtLt8;
-    AbstractInstruction *jumpLarge;
-    AbstractInstruction *jumpNotIndexable;
-    AbstractInstruction *jumpNotSI;
-    AbstractInstruction *jumpSI;
-
-	/* begin MoveR:R: */
-	genoperandoperand(MoveRR, ReceiverResultReg, TempReg);
-	jumpSI = genJumpSmallIntegerInScratchReg(TempReg);
-	/* begin MoveR:R: */
-	genoperandoperand(MoveRR, Arg0Reg, TempReg);
-	/* begin MoveR:R: */
-	genoperandoperand(MoveRR, Arg0Reg, Arg1Reg);
-	jumpNotSI = genJumpNotSmallIntegerInScratchReg(TempReg);
-	jumpNotIndexable = genGetSizeOfintoformatRegscratchReg(ReceiverResultReg, ClassReg, SendNumArgsReg, TempReg);
 	genConvertSmallIntegerToIntegerInScratchReg(Arg1Reg);
 	/* begin SubCq:R: */
 	genoperandoperand(SubCqR, 1, Arg1Reg);
@@ -9231,9 +9290,11 @@
 	/* begin MoveMw:r:R: */
 	genoperandoperandoperand(MoveMwrR, 0, ReceiverResultReg, ClassReg);
 	/* begin LogicalShiftRightCq:R: */
-	genoperandoperand(LogicalShiftRightCqR, 8, ClassReg);
+	quickConstant = instFormatFieldLSB();
+	genoperandoperand(LogicalShiftRightCqR, quickConstant, ClassReg);
 	/* begin AndCq:R: */
-	genoperandoperand(AndCqR, 15, ClassReg);
+	quickConstant1 = (1 << (instFormatFieldWidth())) - 1;
+	genoperandoperand(AndCqR, quickConstant1, ClassReg);
 	/* begin CmpCq:R: */
 	genoperandoperand(CmpCqR, 4, ClassReg);
 	/* begin JumpGreater: */
@@ -9281,7 +9342,7 @@
 	genoperandoperand(MoveRR, TempReg, ReceiverResultReg);
 	/* begin RetN: */
 	genoperand(RetN, retNoffset);
-	jmpTarget(jumpSI, jmpTarget(jumpNotSI, jmpTarget(jumpNotIndexable, jmpTarget(jumpBounds, gLabel()))));
+	jmpTarget(jumpSI, jmpTarget(jumpNotSI, jmpTarget(jumpNotIndexable, jmpTarget(jumpIsContext, jmpTarget(jumpBounds, gLabel())))));
 	return 0;
 }
 
@@ -9293,20 +9354,111 @@
 static sqInt
 genInnerPrimitiveSize(sqInt retNoffset)
 {
+    sqInt jic;
+    AbstractInstruction *jmpFmtGe8;
+    sqInt jnx;
+    AbstractInstruction *jumpFmtIs2;
+    AbstractInstruction *jumpFmtLe4;
+    AbstractInstruction *jumpGotByteSize;
+    AbstractInstruction *jumpGotWordSize;
+    AbstractInstruction *jumpIsContext;
+    AbstractInstruction *jumpIsContext1;
     AbstractInstruction *jumpNotIndexable;
+    AbstractInstruction *jumpNotIndexable1;
     AbstractInstruction *jumpNotSI;
+    AbstractInstruction *jumpShortHeader;
+    AbstractInstruction *jumpSkip;
+    sqInt quickConstant;
+    sqInt quickConstant1;
+    sqInt quickConstant2;
+    sqInt quickConstant3;
 
 	/* begin MoveR:R: */
 	genoperandoperand(MoveRR, ReceiverResultReg, TempReg);
 	jumpNotSI = genJumpSmallIntegerInScratchReg(TempReg);
-	jumpNotIndexable = genGetSizeOfintoformatRegscratchReg(ReceiverResultReg, ClassReg, SendNumArgsReg, TempReg);
+	/* begin genGetSizeOf:into:formatReg:scratchReg:abortJumpsInto: */
+	VM_LABEL(1genGetSizeOfintoformatRegscratchRegabortJumpsInto);
+	/* begin MoveMw:r:R: */
+	genoperandoperandoperand(MoveMwrR, 0, ReceiverResultReg, SendNumArgsReg);
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, SendNumArgsReg, ClassReg);
+	/* begin LogicalShiftRightCq:R: */
+	quickConstant = instFormatFieldLSB();
+	genoperandoperand(LogicalShiftRightCqR, quickConstant, SendNumArgsReg);
+	/* begin AndCq:R: */
+	quickConstant1 = (1 << (instFormatFieldWidth())) - 1;
+	genoperandoperand(AndCqR, quickConstant1, SendNumArgsReg);
+	/* begin CmpCq:R: */
+	genoperandoperand(CmpCqR, 2, SendNumArgsReg);
+	/* begin JumpLess: */
+	jumpNotIndexable1 = genoperand(JumpLess, ((sqInt)0));
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, ClassReg, TempReg);
+	/* begin LogicalShiftRightCq:R: */
+	quickConstant2 = compactClassFieldLSB();
+	genoperandoperand(LogicalShiftRightCqR, quickConstant2, TempReg);
+	/* begin AndCq:R: */
+	quickConstant3 = (1 << (compactClassFieldWidth())) - 1;
+	genoperandoperand(AndCqR, quickConstant3, TempReg);
+	/* begin CmpCq:R: */
+	genoperandoperand(CmpCqR, ClassMethodContextCompactIndex, TempReg);
+	/* begin JumpZero: */
+	jumpIsContext1 = genoperand(JumpZero, ((sqInt)0));
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, ClassReg, TempReg);
+	/* begin AndCq:R: */
+	genoperandoperand(AndCqR, TypeMask, TempReg);
+	/* begin CmpCq:R: */
+	genoperandoperand(CmpCqR, HeaderTypeSizeAndClass, TempReg);
+	/* begin JumpNonZero: */
+	jumpShortHeader = genoperand(JumpNonZero, ((sqInt)0));
+	assert(Size4Bit == 0);
+	/* begin MoveMw:r:R: */
+	genoperandoperandoperand(MoveMwrR, 0 - (2 * BytesPerWord), ReceiverResultReg, ClassReg);
+	/* begin AndCq:R: */
+	genoperandoperand(AndCqR, ((sqInt) LongSizeMask), ClassReg);
+	/* begin Jump: */
+	jumpSkip = genoperand(Jump, ((sqInt)0));
+	jmpTarget(jumpShortHeader, gAndCqR(SizeMask, ClassReg));
+	jmpTarget(jumpSkip, gSubCqR(BaseHeaderSize, ClassReg));
+	/* begin CmpCq:R: */
+	genoperandoperand(CmpCqR, 4, SendNumArgsReg);
+	/* begin JumpLessOrEqual: */
+	jumpFmtLe4 = genoperand(JumpLessOrEqual, ((sqInt)0));
+	/* begin CmpCq:R: */
+	genoperandoperand(CmpCqR, 8, SendNumArgsReg);
+	/* begin JumpLess: */
+	jmpFmtGe8 = genoperand(JumpLess, ((sqInt)0));
+	/* begin AndCq:R: */
+	genoperandoperand(AndCqR, 3, SendNumArgsReg);
+	/* begin SubR:R: */
+	genoperandoperand(SubRR, SendNumArgsReg, ClassReg);
+	/* begin Jump: */
+	jumpGotByteSize = genoperand(Jump, ((sqInt)0));
+	jmpTarget(jmpFmtGe8, gLogicalShiftRightCqR(2, ClassReg));
+	/* begin Jump: */
+	jumpGotWordSize = genoperand(Jump, ((sqInt)0));
+	jmpTarget(jumpFmtLe4, gLabel());
+	/* begin LogicalShiftRightCq:R: */
+	genoperandoperand(LogicalShiftRightCqR, ShiftForWord, ClassReg);
+	/* begin CmpCq:R: */
+	genoperandoperand(CmpCqR, 2, SendNumArgsReg);
+	/* begin JumpZero: */
+	jumpFmtIs2 = genoperand(JumpZero, ((sqInt)0));
+	genGetFixedFieldsOfPointerNonIntintoscratchReg(ReceiverResultReg, SendNumArgsReg, TempReg);
+	/* begin SubR:R: */
+	genoperandoperand(SubRR, SendNumArgsReg, ClassReg);
+	jmpTarget(jumpFmtIs2, jmpTarget(jumpGotWordSize, jmpTarget(jumpGotByteSize, gLabel())));
+		jumpNotIndexable = jumpNotIndexable1;
+	jumpIsContext = jumpIsContext1;
+
 	genConvertIntegerToSmallIntegerInScratchReg(ClassReg);
 	/* begin MoveR:R: */
 	genoperandoperand(MoveRR, ClassReg, ReceiverResultReg);
 	flag("currently caller pushes result");
 	/* begin RetN: */
 	genoperand(RetN, retNoffset);
-	jmpTarget(jumpNotSI, jmpTarget(jumpNotIndexable, gLabel()));
+	jmpTarget(jumpNotSI, jmpTarget(jumpNotIndexable, jmpTarget(jumpIsContext, gLabel())));
 	return 0;
 }
 
@@ -9324,6 +9476,8 @@
     AbstractInstruction *jumpShortHeader;
     AbstractInstruction *jumpSI;
     AbstractInstruction *jumpSkip;
+    sqInt quickConstant;
+    sqInt quickConstant1;
 
 	/* begin MoveR:R: */
 	genoperandoperand(MoveRR, ReceiverResultReg, TempReg);
@@ -9338,9 +9492,11 @@
 	/* begin MoveR:R: */
 	genoperandoperand(MoveRR, TempReg, ClassReg);
 	/* begin LogicalShiftRightCq:R: */
-	genoperandoperand(LogicalShiftRightCqR, 8, TempReg);
+	quickConstant = instFormatFieldLSB();
+	genoperandoperand(LogicalShiftRightCqR, quickConstant, TempReg);
 	/* begin AndCq:R: */
-	genoperandoperand(AndCqR, 15, TempReg);
+	quickConstant1 = (1 << (instFormatFieldWidth())) - 1;
+	genoperandoperand(AndCqR, quickConstant1, TempReg);
 	/* begin MoveR:R: */
 	genoperandoperand(MoveRR, TempReg, SendNumArgsReg);
 	/* begin AndCq:R: */
@@ -9905,8 +10061,13 @@
 static sqInt
 genPrimitiveAt(void)
 {
+    sqInt r;
+
 	assert((numRegArgs()) >= 1);
-	return genInnerPrimitiveAt(0);
+	if (((r = genInnerPrimitiveAt(0))) < 0) {
+		return r;
+	}
+	return compileInterpreterPrimitive(functionPointerForCompiledMethodprimitiveIndex(methodObj, primitiveIndex));
 }
 
 static sqInt
@@ -10502,14 +10663,24 @@
 static sqInt
 genPrimitiveSize(void)
 {
-	return genInnerPrimitiveSize(0);
+    sqInt r;
+
+	if (((r = genInnerPrimitiveSize(0))) < 0) {
+		return r;
+	}
+	return compileInterpreterPrimitive(functionPointerForCompiledMethodprimitiveIndex(methodObj, primitiveIndex));
 }
 
 static sqInt
 genPrimitiveStringAt(void)
 {
+    sqInt r;
+
 	assert((numRegArgs()) >= 1);
-	return genInnerPrimitiveStringAt(0);
+	if (((r = genInnerPrimitiveStringAt(0))) < 0) {
+		return r;
+	}
+	return compileInterpreterPrimitive(functionPointerForCompiledMethodprimitiveIndex(methodObj, primitiveIndex));
 }
 
 static sqInt
@@ -12388,11 +12559,11 @@
 	/* begin MoveMw:r:R: */
 	genoperandoperandoperand(MoveMwrR, 0, sourceReg, destReg);
 	/* begin LogicalShiftRightCq:R: */
-	quickConstant1 = (compactClassFieldLSB()) - ShiftForWord;
-	genoperandoperand(LogicalShiftRightCqR, quickConstant1, destReg);
+	quickConstant = (compactClassFieldLSB()) - ShiftForWord;
+	genoperandoperand(LogicalShiftRightCqR, quickConstant, destReg);
 	/* begin AndCq:R: */
-	quickConstant = ((1 << (compactClassFieldWidth())) - 1) << ShiftForWord;
-	genoperandoperand(AndCqR, quickConstant, destReg);
+	quickConstant1 = ((1 << (compactClassFieldWidth())) - 1) << ShiftForWord;
+	genoperandoperand(AndCqR, quickConstant1, destReg);
 	/* begin JumpNonZero: */
 	jumpCompact = genoperand(JumpNonZero, ((sqInt)0));
 	/* begin MoveMw:r:R: */
@@ -12461,12 +12632,6 @@
 }
 
 static sqInt
-hasValidHeaderPostGC(CogMethod *cogMethod)
-{
-	return ((cogMethod->objectHeader)) == (nullHeaderForMachineCodeMethod());
-}
-
-static sqInt
 incrementUsageOfTargetIfLinkedSendmcpcignored(sqInt annotation, char *mcpc, sqInt superfluity)
 {
     sqInt entryPoint;
@@ -12486,7 +12651,7 @@
 		entryPoint = callTargetFromReturnAddress(backEnd, ((sqInt)mcpc));
 		if (entryPoint > methodZoneBase) {
 			/* begin offsetAndSendTableFor:annotation:into: */
-			VM_LABEL(0offsetAndSendTableForannotationinto);
+			VM_LABEL(1offsetAndSendTableForannotationinto);
 			
 #      if NewspeakVM
 			if ((entryPoint & entryPointMask) == checkedEntryAlignment) {
@@ -13643,7 +13808,8 @@
 				if (((cogMethod->cmType)) == CMMethod) {
 					assert(((cogMethod->objectHeader)) == (nullHeaderForMachineCodeMethod()));
 					(cogMethod->methodObject = remapOop((cogMethod->methodObject)));
-					assert((rawHeaderOf((cogMethod->methodObject))) == (((sqInt)cogMethod)));
+					assert(((rawHeaderOf((cogMethod->methodObject))) == (((sqInt)cogMethod)))
+					 || ((noAssertMethodClassAssociationOf((cogMethod->methodObject))) == (nilObject())));
 					if (isYoung((cogMethod->methodObject))) {
 						hasYoungObj = 1;
 					}
@@ -14071,7 +14237,7 @@
 		else {
 			if (entryPoint > methodZoneBase) {
 				/* begin offsetAndSendTableFor:annotation:into: */
-				VM_LABEL(1offsetAndSendTableForannotationinto);
+				VM_LABEL(2offsetAndSendTableForannotationinto);
 				
 #        if NewspeakVM
 				if ((entryPoint & entryPointMask) == checkedEntryAlignment) {
@@ -14179,7 +14345,7 @@
 		entryPoint = callTargetFromReturnAddress(backEnd, ((sqInt)mcpc));
 		if (entryPoint > methodZoneBase) {
 			/* begin offsetAndSendTableFor:annotation:into: */
-			VM_LABEL(2offsetAndSendTableForannotationinto);
+			VM_LABEL(3offsetAndSendTableForannotationinto);
 			
 #      if NewspeakVM
 			if ((entryPoint & entryPointMask) == checkedEntryAlignment) {
@@ -14564,7 +14730,13 @@
 	return 0;
 }
 
+static sqInt
+noAssertMethodClassAssociationOf(sqInt methodPointer)
+{
+	return literalofMethod((literalCountOfHeader(noAssertHeaderOf(methodPointer))) - 1, methodPointer);
+}
 
+
 /*	Check that no metod is maximally marked. A maximal mark is an indication
 	the method has been scanned to increase the usage count of its referent
 	methods.  */
@@ -15366,7 +15538,7 @@
 			return 0;
 		}
 		/* begin offsetAndSendTableFor:annotation:into: */
-		VM_LABEL(3offsetAndSendTableForannotationinto);
+		VM_LABEL(4offsetAndSendTableForannotationinto);
 		
 #    if NewspeakVM
 		if ((entryPoint & entryPointMask) == checkedEntryAlignment) {
@@ -16666,7 +16838,7 @@
 		entryPoint = callTargetFromReturnAddress(backEnd, ((sqInt)mcpc));
 		if (entryPoint > methodZoneBase) {
 			/* begin offsetAndSendTableFor:annotation:into: */
-			VM_LABEL(4offsetAndSendTableForannotationinto);
+			VM_LABEL(5offsetAndSendTableForannotationinto);
 			
 #      if NewspeakVM
 			if ((entryPoint & entryPointMask) == checkedEntryAlignment) {
@@ -16752,7 +16924,7 @@
 		entryPoint = callTargetFromReturnAddress(backEnd, ((sqInt)mcpc));
 		if (entryPoint > methodZoneBase) {
 			/* begin offsetAndSendTableFor:annotation:into: */
-			VM_LABEL(5offsetAndSendTableForannotationinto);
+			VM_LABEL(6offsetAndSendTableForannotationinto);
 			
 #      if NewspeakVM
 			if ((entryPoint & entryPointMask) == checkedEntryAlignment) {
@@ -16846,7 +17018,7 @@
 
 		if (entryPoint > methodZoneBase) {
 			/* begin offsetAndSendTableFor:annotation:into: */
-			VM_LABEL(6offsetAndSendTableForannotationinto);
+			VM_LABEL(7offsetAndSendTableForannotationinto);
 			
 #      if NewspeakVM
 			if ((entryPoint & entryPointMask) == checkedEntryAlignment) {
@@ -16932,7 +17104,7 @@
 		entryPoint = callTargetFromReturnAddress(backEnd, ((sqInt)mcpc));
 		if (entryPoint > methodZoneBase) {
 			/* begin offsetAndSendTableFor:annotation:into: */
-			VM_LABEL(7offsetAndSendTableForannotationinto);
+			VM_LABEL(8offsetAndSendTableForannotationinto);
 			
 #      if NewspeakVM
 			if ((entryPoint & entryPointMask) == checkedEntryAlignment) {

Modified: branches/Cog/nscogsrc/vm/cogit.h
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.h	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/nscogsrc/vm/cogit.h	2011-08-19 21:33:12 UTC (rev 2488)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CCodeGenerator VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
  */
 
 

Modified: branches/Cog/nscogsrc/vm/cogmethod.h
===================================================================
--- branches/Cog/nscogsrc/vm/cogmethod.h	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/nscogsrc/vm/cogmethod.h	2011-08-19 21:33:12 UTC (rev 2488)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CCodeGenerator VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
  */
 
 typedef struct {

Modified: branches/Cog/nscogsrc/vm/cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.c	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/nscogsrc/vm/cointerp.c	2011-08-19 21:33:12 UTC (rev 2488)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
    from
-	CoInterpreter VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CoInterpreter VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -414,7 +414,6 @@
 sqInt classExternalFunction(void);
 sqInt classExternalLibrary(void);
 sqInt classExternalStructure(void);
-sqInt classFieldOffset(void);
 sqInt classFloat(void);
 sqInt classFloatCompactIndex(void);
 sqInt classHeader(sqInt oop);
@@ -435,8 +434,6 @@
 static void commonAtPut(sqInt stringy);
 static void commonAt(sqInt stringy);
 sqInt compactClassAt(sqInt ccIndex);
-sqInt compactClassFieldLSB(void);
-sqInt compactClassFieldWidth(void);
 sqInt compactClassIndexOfHeader(sqInt header);
 sqInt compactClassIndexOf(sqInt oop);
 sqInt compactClassTable(void);
@@ -580,7 +577,7 @@
 static void initializeObjectMemory(sqInt bytesToShift);
 static void initializeStacknumSlotspageSizestackLimitOffsetstackPageHeadroom(char *theStackPages, sqInt stackSlots, sqInt slotsPerPage, sqInt stackLimitOffsetBytes, sqInt stackPageHeadroomBytes);
 static sqInt initStackPagesAndInterpret(void);
-static void installinAtCacheatstring(sqInt rcvr, sqInt *cache, sqInt atIx, sqInt stringy);
+static sqInt installinAtCacheatstring(sqInt rcvr, sqInt *cache, sqInt atIx, sqInt stringy);
 sqInt instanceSizeOf(sqInt classObj);
 sqInt instantiateClassindexableSize(sqInt classPointer, sqInt size);
 usqInt instructionPointerAddress(void);
@@ -597,6 +594,7 @@
 sqInt isCogMethodReference(sqInt methodHeader);
 sqInt isCompiledMethod(sqInt oop);
 static sqInt isContextHeader(sqInt aHeader);
+static sqInt isContextNonInt(sqInt oop);
 static sqInt isContext(sqInt oop);
 sqInt isFloatObject(sqInt oop);
 static sqInt isFree(StackPage * self_in_isFree);
@@ -641,6 +639,7 @@
 sqInt loadBitBltFrom(sqInt bb);
 static sqInt loadImageSegmentFromoutPointers(sqInt segmentWordArray, sqInt outPointerArray);
 void loadInitialContext(void);
+void longPrintOop(sqInt oop);
 static sqInt lookupInMethodCacheSelclass(sqInt selector, sqInt class);
 static sqInt lookupMethodInClass(sqInt class);
 static sqInt lookupMethodInDictionary(sqInt dictionary);
@@ -695,8 +694,11 @@
 static StackPage * newStackPage(void);
 usqInt nextProfileTickAddress(void);
 sqInt nilObject(void);
+sqInt noAssertHeaderOf(sqInt methodPointer);
 static void noAtCacheCommonAtPut(sqInt stringy);
 static void noAtCacheCommonAt(sqInt stringy);
+static sqInt noInlineTemporaryin(sqInt offset, char *theFP);
+static void noInlineTemporaryinput(sqInt offset, char *theFP, sqInt valueOop);
 static sqInt noMarkedContextsOnPage(StackPage *thePage);
 static sqInt nonWeakFieldsOf(sqInt oop);
 sqInt nullHeaderForMachineCodeMethod(void);
@@ -1889,12 +1891,15 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void);
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.117";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.119";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
 
 /*** Macros ***/
+#define classFieldOffset() (0 - BaseHeaderSize)
+#define compactClassFieldLSB() 12
+#define compactClassFieldWidth() 5
 #define compilationBreakpoint(sel, len) do { \
 	if ((len) == breakSelectorLength \
 	 && !strncmp((char *)((sel) + BaseHeaderSize), breakSelector, breakSelectorLength)) { \
@@ -1912,6 +1917,8 @@
 #define getCogCodeSize() integerObjectOf(GIV(cogCodeSize))
 #define getDesiredCogCodeSize() integerObjectOf(desiredCogCodeSize)
 #define initialEnterSmalltalkExecutive() enterSmalltalkExecutiveImplementation()
+#define instFormatFieldLSB() 8
+#define instFormatFieldWidth() 4
 #define memory() memory
 #define mostRecentlyUsedPage() GIV(mostRecentlyUsedPage)
 #define nextOpenPIC methodObject
@@ -1922,7 +1929,6 @@
 #define remapBufferCount() GIV(remapBufferCount)
 #define setDesiredCogCodeSize(dccs) (desiredCogCodeSize = (dccs))
 #define stackPageAtpages(index,pages) ((pages) + (index))
-#define typeEtAlWord(cm) (((long *)(cm))[1])
 #define validate() 0
 #define youngStart() GIV(youngStart)
 
@@ -7924,36 +7930,39 @@
 							}
 						}
 					}
-					/* begin commonVariable:at:cacheIndex: */
-					VM_LABEL(0commonVariableatcacheIndex);
-					stSize = GIV(atCache)[atIx + AtCacheSize];
-					if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
-					 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
-						fmt = GIV(atCache)[atIx + AtCacheFmt];
-						if (fmt <= 4) {
-							fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
-							result = longAt((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord));
-							goto l78;
-						}
-						if (fmt < 8) {
+					if (!GIV(primFailCode)) {
+						/* begin commonVariable:at:cacheIndex: */
+						VM_LABEL(0commonVariableatcacheIndex);
+						stSize = GIV(atCache)[atIx + AtCacheSize];
+						if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
+						 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
+							fmt = GIV(atCache)[atIx + AtCacheFmt];
+							if (fmt <= 4) {
+								assert(!(isContextNonInt(rcvr)));
+								fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
+								result = longAt((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord));
+								goto l78;
+							}
+							if (fmt < 8) {
 
-							/* Bitmap */
+								/* Bitmap */
 
-							result1 = long32At((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2));
-							result = positive32BitIntegerFor(result1);
-							goto l78;
+								result1 = long32At((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2));
+								result = positive32BitIntegerFor(result1);
+								goto l78;
+							}
+							if (fmt >= 16) {
+								result = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CharacterTable << ShiftForWord))) + BaseHeaderSize) + ((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << ShiftForWord));
+								goto l78;
+							}
+							else {
+								result = (((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << 1) | 1);
+								goto l78;
+							}
 						}
-						if (fmt >= 16) {
-							result = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CharacterTable << ShiftForWord))) + BaseHeaderSize) + ((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << ShiftForWord));
-							goto l78;
-						}
-						else {
-							result = (((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << 1) | 1);
-							goto l78;
-						}
+						result = (GIV(primFailCode) = PrimErrBadIndex);
+					l78:	/* end commonVariable:at:cacheIndex: */;
 					}
-					result = (GIV(primFailCode) = PrimErrBadIndex);
-				l78:	/* end commonVariable:at:cacheIndex: */;
 					if (!GIV(primFailCode)) {
 						/* begin fetchNextBytecode */
 						currentBytecode = byteAtPointer(++localIP);
@@ -7961,6 +7970,8 @@
 						longAtPointerput((localSP += (2 - 1) * BytesPerWord), result);
 						goto l76;
 					}
+					/* begin initPrimCall */
+					GIV(primFailCode) = 0;
 				}
 				GIV(messageSelector) = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SpecialSelectors << ShiftForWord))) + BaseHeaderSize) + ((16 * 2) << ShiftForWord));
 				GIV(argumentCount) = 1;
@@ -8023,59 +8034,62 @@
 							}
 						}
 					}
-					/* begin commonVariable:at:put:cacheIndex: */
-					VM_LABEL(0commonVariableatputcacheIndex);
-					stSize = GIV(atCache)[atIx + AtCacheSize];
-					if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
-					 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
-						fmt = GIV(atCache)[atIx + AtCacheFmt];
-						if (fmt <= 4) {
-							fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
-							/* begin storePointer:ofObject:withValue: */
-							if ((((usqInt) rcvr)) < (((usqInt) GIV(youngStart)))) {
-								possibleRootStoreIntovalue(rcvr, value);
+					if (!GIV(primFailCode)) {
+						/* begin commonVariable:at:put:cacheIndex: */
+						VM_LABEL(0commonVariableatputcacheIndex);
+						stSize = GIV(atCache)[atIx + AtCacheSize];
+						if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
+						 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
+							fmt = GIV(atCache)[atIx + AtCacheFmt];
+							if (fmt <= 4) {
+								assert(!(isContextNonInt(rcvr)));
+								fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
+								/* begin storePointer:ofObject:withValue: */
+								if ((((usqInt) rcvr)) < (((usqInt) GIV(youngStart)))) {
+									possibleRootStoreIntovalue(rcvr, value);
+								}
+								longAtput((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord), value);
+								goto l80;
 							}
-							longAtput((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord), value);
-							goto l80;
-						}
-						if (fmt < 8) {
+							if (fmt < 8) {
 
-							/* Bitmap */
+								/* Bitmap */
 
-							valToPut = positive32BitValueOf(value);
-							if (!GIV(primFailCode)) {
-								long32Atput((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2), valToPut);
+								valToPut = positive32BitValueOf(value);
+								if (!GIV(primFailCode)) {
+									long32Atput((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2), valToPut);
+								}
+								goto l80;
 							}
-							goto l80;
-						}
-						if (fmt >= 16) {
+							if (fmt >= 16) {
 
-							/* Note fmt >= 16 is an artificial flag for strings */
+								/* Note fmt >= 16 is an artificial flag for strings */
 
-							valToPut = asciiOfCharacter(value);
-							if (!(!GIV(primFailCode))) {
-								goto l80;
+								valToPut = asciiOfCharacter(value);
+								if (!(!GIV(primFailCode))) {
+									goto l80;
+								}
 							}
-						}
-						else {
-							valToPut = value;
-						}
-						if ((valToPut & 1)) {
-							valToPut = (valToPut >> 1);
-							if (!((valToPut >= 0)
-								 && (valToPut <= 255))) {
-								/* begin primitiveFail */
-								if (!GIV(primFailCode)) {
-									GIV(primFailCode) = 1;
+							else {
+								valToPut = value;
+							}
+							if ((valToPut & 1)) {
+								valToPut = (valToPut >> 1);
+								if (!((valToPut >= 0)
+									 && (valToPut <= 255))) {
+									/* begin primitiveFail */
+									if (!GIV(primFailCode)) {
+										GIV(primFailCode) = 1;
+									}
+									goto l80;
 								}
+								byteAtput((rcvr + BaseHeaderSize) + (((index >> 1)) - 1), valToPut);
 								goto l80;
 							}
-							byteAtput((rcvr + BaseHeaderSize) + (((index >> 1)) - 1), valToPut);
-							goto l80;
 						}
+						GIV(primFailCode) = PrimErrBadIndex;
+					l80:	/* end commonVariable:at:put:cacheIndex: */;
 					}
-					GIV(primFailCode) = PrimErrBadIndex;
-				l80:	/* end commonVariable:at:put:cacheIndex: */;
 					if (!GIV(primFailCode)) {
 						/* begin fetchNextBytecode */
 						currentBytecode = byteAtPointer(++localIP);
@@ -8083,6 +8097,8 @@
 						longAtPointerput((localSP += (3 - 1) * BytesPerWord), value);
 						goto l79;
 					}
+					/* begin initPrimCall */
+					GIV(primFailCode) = 0;
 				}
 				GIV(messageSelector) = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SpecialSelectors << ShiftForWord))) + BaseHeaderSize) + ((17 * 2) << ShiftForWord));
 				GIV(argumentCount) = 2;
@@ -11743,7 +11759,7 @@
 				 || ((heapMapAtWord(pointerForOop(fieldOop))) == 0)) {
 					print("object leak in ");
 					printHex(obj);
-					print(" class ");
+					print(" class = ");
 					printHex(fieldOop);
 					/* begin cr */
 					printf("\n");
@@ -11810,6 +11826,8 @@
 								printHex(obj);
 								print(" @ ");
 								printNum(fi);
+								print(" = ");
+								printHex(fieldOop);
 								/* begin cr */
 								printf("\n");
 								ok = 0;
@@ -12289,12 +12307,6 @@
 }
 
 sqInt
-classFieldOffset(void)
-{
-	return 0 - BaseHeaderSize;
-}
-
-sqInt
 classFloat(void)
 {
 	return longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassFloat << ShiftForWord));
@@ -12644,7 +12656,12 @@
 
 		atIx = (rcvr & AtCacheMask) + AtPutBase;
 		if (!((GIV(atCache)[atIx + AtCacheOop]) == rcvr)) {
-			installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy);
+			if (!(installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy))) {
+				assert(isContextNonInt(rcvr));
+				/* begin initPrimCall */
+				GIV(primFailCode) = 0;
+				primitiveContextAtPut(); return;
+			}
 		}
 		if (!GIV(primFailCode)) {
 			/* begin commonVariable:at:put:cacheIndex: */
@@ -12654,6 +12671,7 @@
 			 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 				fmt = GIV(atCache)[atIx + AtCacheFmt];
 				if (fmt <= 4) {
+					assert(!(isContextNonInt(rcvr)));
 					fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
 					/* begin storePointer:ofObject:withValue: */
 					if ((((usqInt) rcvr)) < (((usqInt) GIV(youngStart)))) {
@@ -12771,7 +12789,12 @@
 
 		atIx = rcvr & AtCacheMask;
 		if (!((GIV(atCache)[atIx + AtCacheOop]) == rcvr)) {
-			installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy);
+			if (!(installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy))) {
+				assert(isContextNonInt(rcvr));
+				/* begin initPrimCall */
+				GIV(primFailCode) = 0;
+				primitiveContextAt(); return;
+			}
 		}
 		if (!GIV(primFailCode)) {
 			/* begin commonVariable:at:cacheIndex: */
@@ -12781,6 +12804,7 @@
 			 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 				fmt = GIV(atCache)[atIx + AtCacheFmt];
 				if (fmt <= 4) {
+					assert(!(isContextNonInt(rcvr)));
 					fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
 					result = longAt((rcvr + BaseHeaderSize) + (((index + fixedFields) - 1) << ShiftForWord));
 					goto l1;
@@ -12842,18 +12866,6 @@
 }
 
 sqInt
-compactClassFieldLSB(void)
-{
-	return 12;
-}
-
-sqInt
-compactClassFieldWidth(void)
-{
-	return 5;
-}
-
-sqInt
 compactClassIndexOfHeader(sqInt header)
 {
 	return (((usqInt) header) >> 12) & 31;
@@ -18695,10 +18707,12 @@
 }
 
 
-/*	Install the oop of this object in the given cache (at or atPut), along
-	with its size, format and fixedSize */
+/*	Attempt to install the oop of this object in the given cache (at or
+	atPut), along with its size, format and fixedSize. Answer if this was
+	successful. 
+ */
 
-static void
+static sqInt
 installinAtCacheatstring(sqInt rcvr, sqInt *cache, sqInt atIx, sqInt stringy)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt ccIndex;
@@ -18714,11 +18728,8 @@
 	fmt = (((usqInt) hdr) >> 8) & 15;
 	if ((fmt == 3)
 	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+		GIV(primFailCode) = PrimErrBadReceiver;
+		return 0;
 	}
 	/* begin lengthOf:baseHeader:format: */
 	if ((hdr & TypeMask) == HeaderTypeSizeAndClass) {
@@ -18770,6 +18781,7 @@
 	: fmt));
 	cache[atIx + AtCacheFixedFields] = fixedFields;
 	cache[atIx + AtCacheSize] = (totalLength - fixedFields);
+	return 1;
 }
 
 
@@ -19265,6 +19277,12 @@
 }
 
 static sqInt
+isContextNonInt(sqInt oop)
+{
+	return ((((usqInt) (longAt(oop))) >> 12) & 31) == ClassMethodContextCompactIndex;
+}
+
+static sqInt
 isContext(sqInt oop)
 {
 	return ((oop & 1) == 0)
@@ -20287,7 +20305,103 @@
 	GIV(instructionPointer) = ((sqInt) top);
 }
 
+void
+longPrintOop(sqInt oop)
+{
+    sqInt byte;
+    sqInt bytecodesPerLine;
+    sqInt fieldOop;
+    sqInt fmt;
+    sqInt header;
+    sqInt index;
+    sqInt lastIndex;
+    sqInt startIP;
+    sqInt sz;
 
+	if (((oop & 1))
+	 || ((!(((oop >= heapBase) && (oop <= GIV(freeStart)))))
+	 || (((oop & (BytesPerWord - 1)) != 0)
+	 || ((((longAt(oop)) & TypeMask) == HeaderTypeFree)
+	 || (((((fmt = (((usqInt) (longAt(oop))) >> 8) & 15)) >= 5) && (((fmt = (((usqInt) (longAt(oop))) >> 8) & 15)) <= 11))))))) {
+		printOop(oop); return;
+	}
+	printHex(oop);
+	print(": a(n) ");
+	printNameOfClasscount(fetchClassOfNonInt(oop), 5);
+	if (fmt > 4) {
+		print(" nbytes ");
+		printNum(byteSizeOf(oop));
+	}
+	/* begin cr */
+	printf("\n");
+	lastIndex = ((64 < ((startIP = ((sqInt) (lastPointerOf(oop)) >> 2)))) ? 64 : ((startIP = ((sqInt) (lastPointerOf(oop)) >> 2))));
+	if (lastIndex > 0) {
+		for (index = 1; index <= lastIndex; index += 1) {
+			fieldOop = longAt((oop + BaseHeaderSize) + ((index - 1) << ShiftForWord));
+			/* begin space */
+			/* begin printChar: */
+			putchar(' ');
+			printHex(fieldOop);
+			/* begin space */
+			/* begin printChar: */
+			putchar(' ');
+			printOopShort(fieldOop);
+			/* begin cr */
+			printf("\n");
+		}
+	}
+	if (((((usqInt) (longAt(oop))) >> 8) & 15) >= 12) {
+		startIP = (startIP * BytesPerWord) + 1;
+		/* begin lengthOf: */
+		header = longAt(oop);
+		/* begin lengthOf:baseHeader:format: */
+		if ((header & TypeMask) == HeaderTypeSizeAndClass) {
+			sz = (longAt(oop - (BytesPerWord * 2))) & LongSizeMask;
+		}
+		else {
+			sz = header & SizeMask;
+		}
+		sz -= header & Size4Bit;
+		if (((((usqInt) header) >> 8) & 15) <= 4) {
+			lastIndex = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
+			goto l1;
+		}
+		if (((((usqInt) header) >> 8) & 15) < 8) {
+			lastIndex = ((usqInt) (sz - BaseHeaderSize)) >> 2;
+			goto l1;
+		}
+		else {
+			lastIndex = (sz - BaseHeaderSize) - (((((usqInt) header) >> 8) & 15) & 3);
+			goto l1;
+		}
+	l1:	/* end lengthOf: */;
+		if ((lastIndex - startIP) > 100) {
+			lastIndex = startIP + 100;
+		}
+		bytecodesPerLine = 8;
+		for (index = startIP; index <= lastIndex; index += 1) {
+			byte = byteAt((oop + BaseHeaderSize) + (index - 1));
+			printf(" %02x/%-3d", byte,byte);
+			if ((((index - startIP) + 1) % bytecodesPerLine) == 0) {
+				/* begin cr */
+				printf("\n");
+			}
+		}
+		if (!((((lastIndex - startIP) + 1) % bytecodesPerLine) == 0)) {
+			/* begin cr */
+			printf("\n");
+		}
+	}
+	else {
+		if (startIP > 64) {
+			print("...");
+			/* begin cr */
+			printf("\n");
+		}
+	}
+}
+
+
 /*	This method implements a simple method lookup cache. If an entry for the
 	given selector and class is found in the cache, set the values of
 	'newMethod' and 'primitiveFunctionPointer' and return true. Otherwise,
@@ -22718,7 +22832,18 @@
 	return GIV(nilObj);
 }
 
+sqInt
+noAssertHeaderOf(sqInt methodPointer)
+{
+    sqInt methodHeader;
 
+	methodHeader = longAt((methodPointer + BaseHeaderSize) + (HeaderIndex << ShiftForWord));
+	return (isCogMethodReference(methodHeader)
+		? (((CogMethod *) methodHeader)->methodHeader)
+		: methodHeader);
+}
+
+
 /*	This code is called if the receiver responds primitively to at:Put:.
 	The cogit can implement at: & at:put: quickly in machine code, and needs a
 	backup that provides error codes. But it does not want the at cache so it
@@ -22803,7 +22928,47 @@
 	}
 }
 
+static sqInt
+noInlineTemporaryin(sqInt offset, char *theFP)
+{
+    sqInt frameNumArgs;
+    sqInt frameNumArgs1;
 
+	return ((((usqInt)(longAt(theFP + FoxMethod)))) < heapBase
+		? (offset < ((frameNumArgs = (mframeCogMethod(theFP)->cmNumArgs)))
+				? longAt((theFP + FoxCallerSavedIP) + ((frameNumArgs - offset) * BytesPerWord))
+				: longAt(((theFP + FoxMFReceiver) - BytesPerWord) + ((frameNumArgs - offset) * BytesPerWord)))
+		: (offset < ((frameNumArgs1 = byteAt((theFP + FoxIFrameFlags) + 1)))
+				? longAt((theFP + FoxCallerSavedIP) + ((frameNumArgs1 - offset) * BytesPerWord))
+				: longAt(((theFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - offset) * BytesPerWord))));
+}
+
+static void
+noInlineTemporaryinput(sqInt offset, char *theFP, sqInt valueOop)
+{
+    sqInt frameNumArgs;
+    sqInt frameNumArgs1;
+
+	/* begin temporary:in:put: */
+	VM_LABEL(0temporaryinput);
+	if ((((usqInt)(longAt(theFP + FoxMethod)))) < heapBase) {
+		/* begin mtemporary:in:put: */
+		longAtput((offset < ((frameNumArgs = (mframeCogMethod(theFP)->cmNumArgs)))
+			? (theFP + FoxCallerSavedIP) + ((frameNumArgs - offset) * BytesPerWord)
+			: ((theFP + FoxMFReceiver) - BytesPerWord) + ((frameNumArgs - offset) * BytesPerWord)), valueOop);
+	}
+	else {
+		/* begin itemporary:in:put: */
+		if (offset < ((frameNumArgs1 = byteAt((theFP + FoxIFrameFlags) + 1)))) {
+			longAtput((theFP + FoxCallerSavedIP) + ((frameNumArgs1 - offset) * BytesPerWord), valueOop);
+		}
+		else {
+			longAtput(((theFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - offset) * BytesPerWord), valueOop);
+		}
+	}
+}
+
+
 /*	Answer true if there are no marked contexts on thePage. */
 
 static sqInt
@@ -25141,7 +25306,7 @@
     sqInt methodHeader;
     sqInt newCopy;
     sqInt objHeader;
-    sqInt receiver;
+    sqInt rcvr;
     char *sp;
     sqInt sp1;
     char *spouseFP;
@@ -25149,29 +25314,29 @@
     sqInt valuePointer;
     sqInt valuePointer1;
 
-	receiver = longAt(GIV(stackPointer));
-	if ((receiver & 1)) {
-		newCopy = receiver;
+	rcvr = longAt(GIV(stackPointer));
+	if ((rcvr & 1)) {
+		newCopy = rcvr;
 	}
 	else {
-		objHeader = longAt(receiver);
+		objHeader = longAt(rcvr);
 		if (((((usqInt) objHeader) >> 12) & 31) == ClassMethodContextCompactIndex) {
 			/* begin cloneContext: */
 			VM_LABEL(0cloneContext);
-			cloned = eeInstantiateMethodContextByteSize(byteSizeOf(receiver));
+			cloned = eeInstantiateMethodContextByteSize(byteSizeOf(rcvr));
 			if (cloned != 0) {
 				for (i = 0; i <= StackPointerIndex; i += 1) {
 					/* begin storePointerUnchecked:ofObject:withValue: */
-					valuePointer = externalInstVarofContext(i, receiver);
+					valuePointer = externalInstVarofContext(i, rcvr);
 					longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), valuePointer);
 				}
 				for (i = MethodIndex; i <= ReceiverIndex; i += 1) {
-					longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), longAt((receiver + BaseHeaderSize) + (i << ShiftForWord)));
+					longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), longAt((rcvr + BaseHeaderSize) + (i << ShiftForWord)));
 				}
-				if ((((longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
-				 && (!(isWidowedContext(receiver)))) {
+				if ((((longAt((rcvr + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+				 && (!(isWidowedContext(rcvr)))) {
 					/* begin frameOfMarriedContext: */
-					value = longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord));
+					value = longAt((rcvr + BaseHeaderSize) + (SenderIndex << ShiftForWord));
 					/* begin withoutSmallIntegerTags: */
 					assert((value & 1));
 					spouseFP = pointerForOop(value - 1);
@@ -25189,16 +25354,16 @@
 					}
 				}
 				else {
-					sp1 = (fetchStackPointerOf(receiver)) - 1;
+					sp1 = (fetchStackPointerOf(rcvr)) - 1;
 					for (i = 0; i <= sp1; i += 1) {
-						longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), longAt((receiver + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord)));
+						longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), longAt((rcvr + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord)));
 					}
 				}
 			}
 			newCopy = cloned;
 		}
 		else {
-			newCopy = clone(receiver);
+			newCopy = clone(rcvr);
 		}
 		if (newCopy == 0) {
 			(GIV(primFailCode) = PrimErrNoMemory); return;
@@ -26131,6 +26296,10 @@
 	}
 }
 
+
+/*	Special version of primitiveAt for accessing contexts.
+	Written to be varargs for use from mirror primitives. */
+
 static void
 primitiveContextAt(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ -26158,11 +26327,7 @@
 
 	index = longAt(GIV(stackPointer));
 	if (!((index & 1))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+		(GIV(primFailCode) = PrimErrBadArgument); return;
 	}
 	index = (index >> 1);
 
@@ -26176,7 +26341,7 @@
 
 		value = stObjectat(aContext, index);
 		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), value);
+		longAtput((sp = GIV(stackPointer) + ((GIV(argumentCount) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp;
 		return;
 	}
@@ -26258,11 +26423,7 @@
 		stSize = (sp11 >> 1);
 	l5:	/* end stackPointerForMaybeMarriedContext: */;
 		if (!(((index >= 1) && (index <= stSize)))) {
-			/* begin primitiveFail */
-			if (!GIV(primFailCode)) {
-				GIV(primFailCode) = 1;
-			}
-			return;
+			(GIV(primFailCode) = PrimErrBadIndex); return;
 		}
 		/* begin subscript:with:format: */
 		if (fmt <= 4) {
@@ -26279,7 +26440,7 @@
 		}
 	l3:	/* end subscript:with:format: */;
 		/* begin pop:thenPush: */
-		longAtput((sp1 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), value);
+		longAtput((sp1 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp1;
 		return;
 	}
@@ -26289,11 +26450,7 @@
 	assert((value1 & 1));
 	spouseFP = pointerForOop(value1 - 1);
 	if (!(((index >= 1) && (index <= (stackPointerIndexForFrame(spouseFP)))))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+		(GIV(primFailCode) = PrimErrBadIndex); return;
 	}
 	value = ((((usqInt)(longAt(spouseFP + FoxMethod)))) < heapBase
 		? ((index - 1) < ((frameNumArgs = (mframeCogMethod(spouseFP)->cmNumArgs)))
@@ -26303,10 +26460,14 @@
 				? longAt((spouseFP + FoxCallerSavedIP) + ((frameNumArgs1 - (index - 1)) * BytesPerWord))
 				: longAt(((spouseFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - (index - 1)) * BytesPerWord))));
 	/* begin pop:thenPush: */
-	longAtput((sp2 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), value);
+	longAtput((sp2 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 	GIV(stackPointer) = sp2;
 }
 
+
+/*	Special version of primitiveAtPut for accessing contexts.
+	Written to be varargs for use from mirror primitives. */
+
 static sqInt
 primitiveContextAtPut(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ -26337,18 +26498,14 @@
 	index = longAt(GIV(stackPointer) + (1 * BytesPerWord));
 	aContext = longAt(GIV(stackPointer) + (2 * BytesPerWord));
 	if (!((index & 1))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return null;
+		return (GIV(primFailCode) = PrimErrBadArgument);
 	}
 	hdr = longAt(aContext);
 	index = (index >> 1);
 	if (!(((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
 		stObjectatput(aContext, index, value);
 		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + ((3 - 1) * BytesPerWord)), value);
+		longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp;
 		return null;
 	}
@@ -26430,11 +26587,7 @@
 		stSize = (sp11 >> 1);
 	l4:	/* end stackPointerForMaybeMarriedContext: */;
 		if (!(((index >= 1) && (index <= stSize)))) {
-			/* begin primitiveFail */
-			if (!GIV(primFailCode)) {
-				GIV(primFailCode) = 1;
-			}
-			return null;
+			return (GIV(primFailCode) = PrimErrBadIndex);
 		}
 		/* begin subscript:with:storing:format: */
 		VM_LABEL(0subscriptwithstoringformat);
@@ -26486,7 +26639,7 @@
 			}
 		}
 		/* begin pop:thenPush: */
-		longAtput((sp1 = GIV(stackPointer) + ((3 - 1) * BytesPerWord)), value);
+		longAtput((sp1 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp1;
 		return null;
 	}
@@ -26496,15 +26649,10 @@
 	assert((value1 & 1));
 	spouseFP = pointerForOop(value1 - 1);
 	if (!(((index >= 1) && (index <= (stackPointerIndexForFrame(spouseFP)))))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return null;
+		return (GIV(primFailCode) = PrimErrBadIndex);
 	}
 	/* begin temporary:in:put: */
-	VM_LABEL(0temporaryinput);
-	;
+	VM_LABEL(1temporaryinput);
 	if ((((usqInt)(longAt(spouseFP + FoxMethod)))) < heapBase) {
 		/* begin mtemporary:in:put: */
 		longAtput(((index - 1) < ((frameNumArgs = (mframeCogMethod(spouseFP)->cmNumArgs)))
@@ -26521,11 +26669,15 @@
 		}
 	}
 	/* begin pop:thenPush: */
-	longAtput((sp2 = GIV(stackPointer) + ((3 - 1) * BytesPerWord)), value);
+	longAtput((sp2 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 	GIV(stackPointer) = sp2;
 	return null;
 }
 
+
+/*	Special version of primitiveSize for accessing contexts.
+	Written to be varargs for use from mirror primitives. */
+
 static void
 primitiveContextSize(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ -26625,11 +26777,9 @@
 	else {
 		sz = totalLength - fixedFields;
 	}
-	if (!GIV(primFailCode)) {
-		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + ((1 - 1) * BytesPerWord)), ((sz << 1) | 1));
-		GIV(stackPointer) = sp;
-	}
+	/* begin pop:thenPush: */
+	longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), ((sz << 1) | 1));
+	GIV(stackPointer) = sp;
 }
 
 
@@ -35122,31 +35272,77 @@
 static void
 primitiveSize(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt ccIndex;
+    sqInt class;
+    sqInt classFormat;
+    sqInt fixedFields;
+    sqInt fmt;
+    sqInt hdr;
     sqInt rcvr;
     char *sp;
     sqInt sz;
+    sqInt totalLength;
 
 	rcvr = longAt(GIV(stackPointer));
-	if ((rcvr & 1)) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+	if (((rcvr & 1))
+	 || ((
+	/* Integers are not indexable */
+
+(hdr = longAt(rcvr)),
+	((fmt = (((usqInt) hdr) >> 8) & 15)) < 2))) {
+		(GIV(primFailCode) = PrimErrBadReceiver); return;
 	}
-	if (((((usqInt) (longAt(rcvr))) >> 8) & 15) < 2) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+	if ((fmt == 3)
+	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
+		primitiveContextSize(); return;
 	}
-	sz = stSizeOf(rcvr);
-	if (!GIV(primFailCode)) {
-		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), ((sz << 1) | 1));
-		GIV(stackPointer) = sp;
+	/* begin lengthOf:baseHeader:format: */
+	if ((hdr & TypeMask) == HeaderTypeSizeAndClass) {
+		sz = (longAt(rcvr - (BytesPerWord * 2))) & LongSizeMask;
 	}
+	else {
+		sz = hdr & SizeMask;
+	}
+	sz -= hdr & Size4Bit;
+	if (fmt <= 4) {
+		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
+		goto l1;
+	}
+	if (fmt < 8) {
+		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> 2;
+		goto l1;
+	}
+	else {
+		totalLength = (sz - BaseHeaderSize) - (fmt & 3);
+		goto l1;
+	}
+l1:	/* end lengthOf:baseHeader:format: */;
+	/* begin fixedFieldsOf:format:length: */
+	if ((fmt > 4)
+	 || (fmt == 2)) {
+		fixedFields = 0;
+		goto l2;
+	}
+	if (fmt < 2) {
+		fixedFields = totalLength;
+		goto l2;
+	}
+	/* begin fetchClassOfNonInt: */
+	if (((ccIndex = (((usqInt) (longAt(rcvr))) >> 12) & 31)) == 0) {
+		class = (longAt(rcvr - BaseHeaderSize)) & AllButTypeMask;
+		goto l3;
+	}
+	else {
+		class = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord));
+		goto l3;
+	}
+l3:	/* end fetchClassOfNonInt: */;
+	classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1;
+	fixedFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1;
+l2:	/* end fixedFieldsOf:format:length: */;
+	/* begin pop:thenPush: */
+	longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), (((totalLength - fixedFields) << 1) | 1));
+	GIV(stackPointer) = sp;
 }
 
 
@@ -38908,6 +39104,7 @@
 printMethodDictionaryOf(sqInt behavior)
 {
     sqInt index;
+    sqInt meth;
     sqInt methodArray;
     sqInt selector;
 
@@ -38917,9 +39114,15 @@
 	for (index = SelectorStart; index <= ((fetchWordLengthOf(longAt((behavior + BaseHeaderSize) + (MethodDictionaryIndex << ShiftForWord)))) - 1); index += 1) {
 		selector = longAt(((longAt((behavior + BaseHeaderSize) + (MethodDictionaryIndex << ShiftForWord))) + BaseHeaderSize) + (index << ShiftForWord));
 		if (selector != GIV(nilObj)) {
+			meth = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord));
 			printOopShort(selector);
 			print(" => ");
-			printOopShort(longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord)));
+			printOopShort(meth);
+			print(" (");
+			printHex(selector);
+			print(" => ");
+			printHex(meth);
+			putchar(')');
 			/* begin cr */
 			printf("\n");
 		}
@@ -38930,6 +39133,7 @@
 printMethodDictionary(sqInt dictionary)
 {
     sqInt index;
+    sqInt meth;
     sqInt methodArray;
     sqInt selector;
 
@@ -38937,9 +39141,15 @@
 	for (index = SelectorStart; index <= ((fetchWordLengthOf(dictionary)) - 1); index += 1) {
 		selector = longAt((dictionary + BaseHeaderSize) + (index << ShiftForWord));
 		if (selector != GIV(nilObj)) {
+			meth = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord));
 			printOopShort(selector);
 			print(" => ");
-			printOopShort(longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord)));
+			printOopShort(meth);
+			print(" (");
+			printHex(selector);
+			print(" => ");
+			printHex(meth);
+			putchar(')');
 			/* begin cr */
 			printf("\n");
 		}
@@ -42987,6 +43197,7 @@
     sqInt fixedFields;
     sqInt fmt;
     sqInt hdr;
+    sqInt sp;
     sqInt stSize;
     sqInt sz;
     sqInt totalLength;
@@ -43003,44 +43214,61 @@
 	sz -= hdr & Size4Bit;
 	if (fmt <= 4) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
-		goto l1;
+		goto l2;
 	}
 	if (fmt < 8) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> 2;
-		goto l1;
+		goto l2;
 	}
 	else {
 		totalLength = (sz - BaseHeaderSize) - (fmt & 3);
-		goto l1;
+		goto l2;
 	}
-l1:	/* end lengthOf:baseHeader:format: */;
+l2:	/* end lengthOf:baseHeader:format: */;
 	/* begin fixedFieldsOf:format:length: */
 	if ((fmt > 4)
 	 || (fmt == 2)) {
 		fixedFields = 0;
-		goto l2;
+		goto l3;
 	}
 	if (fmt < 2) {
 		fixedFields = totalLength;
-		goto l2;
+		goto l3;
 	}
 	/* begin fetchClassOfNonInt: */
 	if (((ccIndex = (((usqInt) (longAt(array))) >> 12) & 31)) == 0) {
 		class = (longAt(array - BaseHeaderSize)) & AllButTypeMask;
-		goto l3;
+		goto l4;
 	}
 	else {
 		class = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord));
-		goto l3;
+		goto l4;
 	}
-l3:	/* end fetchClassOfNonInt: */;
+l4:	/* end fetchClassOfNonInt: */;
 	classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1;
 	fixedFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1;
-l2:	/* end fixedFieldsOf:format:length: */;
-	if (fmt == 3) {
-		assert(!(isContextHeader(hdr)));
+l3:	/* end fixedFieldsOf:format:length: */;
+	if ((fmt == 3)
+	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
+		/* begin fetchStackPointerOf: */
+		sp = longAt((array + BaseHeaderSize) + (StackPointerIndex << ShiftForWord));
+		if (!((sp & 1))) {
+			stSize = 0;
+			goto l1;
+		}
+		assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(array)));
+		stSize = (sp >> 1);
+	l1:	/* end fetchStackPointerOf: */;
+		if (((((usqInt) index)) >= (((usqInt) 1)))
+		 && (((((usqInt) index)) <= (((usqInt) stSize)))
+		 && ((((longAt((array + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+		 && (!(isWidowedContext(array)))))) {
+			return noInlineTemporaryin(index - 1, frameOfMarriedContext(array));
+		}
 	}
-	stSize = totalLength - fixedFields;
+	else {
+		stSize = totalLength - fixedFields;
+	}
 	if (((((usqInt) index)) >= (((usqInt) 1)))
 	 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 		/* begin subscript:with:format: */
@@ -43072,6 +43300,7 @@
     sqInt fixedFields;
     sqInt fmt;
     sqInt hdr;
+    sqInt sp;
     sqInt stSize;
     sqInt sz;
     sqInt totalLength;
@@ -43089,44 +43318,62 @@
 	sz -= hdr & Size4Bit;
 	if (fmt <= 4) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
-		goto l1;
+		goto l2;
 	}
 	if (fmt < 8) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> 2;
-		goto l1;
+		goto l2;
 	}
 	else {
 		totalLength = (sz - BaseHeaderSize) - (fmt & 3);
-		goto l1;
+		goto l2;
 	}
-l1:	/* end lengthOf:baseHeader:format: */;
+l2:	/* end lengthOf:baseHeader:format: */;
 	/* begin fixedFieldsOf:format:length: */
 	if ((fmt > 4)
 	 || (fmt == 2)) {
 		fixedFields = 0;
-		goto l2;
+		goto l3;
 	}
 	if (fmt < 2) {
 		fixedFields = totalLength;
-		goto l2;
+		goto l3;
 	}
 	/* begin fetchClassOfNonInt: */
 	if (((ccIndex = (((usqInt) (longAt(array))) >> 12) & 31)) == 0) {
 		class = (longAt(array - BaseHeaderSize)) & AllButTypeMask;
-		goto l3;
+		goto l4;
 	}
 	else {
 		class = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord));
-		goto l3;
+		goto l4;
 	}
-l3:	/* end fetchClassOfNonInt: */;
+l4:	/* end fetchClassOfNonInt: */;
 	classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1;
 	fixedFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1;
-l2:	/* end fixedFieldsOf:format:length: */;
-	if (fmt == 3) {
-		assert(!(isContextHeader(hdr)));
+l3:	/* end fixedFieldsOf:format:length: */;
+	if ((fmt == 3)
+	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
+		/* begin fetchStackPointerOf: */
+		sp = longAt((array + BaseHeaderSize) + (StackPointerIndex << ShiftForWord));
+		if (!((sp & 1))) {
+			stSize = 0;
+			goto l1;
+		}
+		assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(array)));
+		stSize = (sp >> 1);
+	l1:	/* end fetchStackPointerOf: */;
+		if (((((usqInt) index)) >= (((usqInt) 1)))
+		 && (((((usqInt) index)) <= (((usqInt) stSize)))
+		 && ((((longAt((array + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+		 && (!(isWidowedContext(array)))))) {
+			noInlineTemporaryinput(index - 1, frameOfMarriedContext(array), value);
+			return;
+		}
 	}
-	stSize = totalLength - fixedFields;
+	else {
+		stSize = totalLength - fixedFields;
+	}
 	if (((((usqInt) index)) >= (((usqInt) 1)))
 	 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 		/* begin subscript:with:storing:format: */

Modified: branches/Cog/nscogsrc/vm/cointerp.h
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.h	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/nscogsrc/vm/cointerp.h	2011-08-19 21:33:12 UTC (rev 2488)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
  */
 
 
@@ -45,7 +45,6 @@
 void checkAssertsEnabledInCoInterpreter(void);
 sqInt checkedLongAt(sqInt byteAddress);
 sqInt classArray(void);
-sqInt classFieldOffset(void);
 sqInt classFloat(void);
 sqInt classFloatCompactIndex(void);
 sqInt classHeader(sqInt oop);
@@ -53,8 +52,6 @@
 void clearTraceLog(void);
 CogMethod * cogMethodOf(sqInt aMethodOop);
 sqInt compactClassAt(sqInt ccIndex);
-sqInt compactClassFieldLSB(void);
-sqInt compactClassFieldWidth(void);
 sqInt compactClassIndexOfHeader(sqInt header);
 sqInt compactClassIndexOf(sqInt oop);
 sqInt compactClassTable(void);
@@ -103,6 +100,7 @@
 sqInt lengthOf(sqInt oop);
 sqInt literalCountOfHeader(sqInt headerPointer);
 sqInt literalofMethod(sqInt offset, sqInt methodPointer);
+void longPrintOop(sqInt oop);
 sqInt lookupreceiver(sqInt selector, sqInt rcvr);
 void markActiveMethodsAndReferents(void);
 void markAndTrace(sqInt oop);
@@ -119,6 +117,7 @@
 usqInt newMethodAddress(void);
 usqInt nextProfileTickAddress(void);
 sqInt nilObject(void);
+sqInt noAssertHeaderOf(sqInt methodPointer);
 sqInt nullHeaderForMachineCodeMethod(void);
 sqInt objectAfter(sqInt oop);
 sqInt objectBefore(sqInt address);
@@ -210,6 +209,9 @@
 
 
 /*** Macros ***/
+#define classFieldOffset() (0 - BaseHeaderSize)
+#define compactClassFieldLSB() 12
+#define compactClassFieldWidth() 5
 #define compilationBreakpoint(sel, len) do { \
 	if ((len) == breakSelectorLength \
 	 && !strncmp((char *)((sel) + BaseHeaderSize), breakSelector, breakSelectorLength)) { \
@@ -217,4 +219,6 @@
 		compilationBreakpointFor(sel); \
 	} \
 } while (0)
+#define instFormatFieldLSB() 8
+#define instFormatFieldWidth() 4
 

Modified: branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2011-08-19 21:33:12 UTC (rev 2488)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
    from
-	CoInterpreter VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CoInterpreter VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -417,7 +417,6 @@
 sqInt classExternalFunction(void);
 sqInt classExternalLibrary(void);
 sqInt classExternalStructure(void);
-sqInt classFieldOffset(void);
 sqInt classFloat(void);
 sqInt classFloatCompactIndex(void);
 sqInt classHeader(sqInt oop);
@@ -438,8 +437,6 @@
 static void commonAtPut(sqInt stringy);
 static void commonAt(sqInt stringy);
 sqInt compactClassAt(sqInt ccIndex);
-sqInt compactClassFieldLSB(void);
-sqInt compactClassFieldWidth(void);
 sqInt compactClassIndexOfHeader(sqInt header);
 sqInt compactClassIndexOf(sqInt oop);
 sqInt compactClassTable(void);
@@ -583,7 +580,7 @@
 static void initializeObjectMemory(sqInt bytesToShift);
 static void initializeStacknumSlotspageSizestackLimitOffsetstackPageHeadroom(char *theStackPages, sqInt stackSlots, sqInt slotsPerPage, sqInt stackLimitOffsetBytes, sqInt stackPageHeadroomBytes);
 static sqInt initStackPagesAndInterpret(void);
-static void installinAtCacheatstring(sqInt rcvr, sqInt *cache, sqInt atIx, sqInt stringy);
+static sqInt installinAtCacheatstring(sqInt rcvr, sqInt *cache, sqInt atIx, sqInt stringy);
 sqInt instanceSizeOf(sqInt classObj);
 sqInt instantiateClassindexableSize(sqInt classPointer, sqInt size);
 usqInt instructionPointerAddress(void);
@@ -600,6 +597,7 @@
 sqInt isCogMethodReference(sqInt methodHeader);
 sqInt isCompiledMethod(sqInt oop);
 static sqInt isContextHeader(sqInt aHeader);
+static sqInt isContextNonInt(sqInt oop);
 static sqInt isContext(sqInt oop);
 sqInt isFloatObject(sqInt oop);
 static sqInt isFree(StackPage * self_in_isFree);
@@ -644,6 +642,7 @@
 sqInt loadBitBltFrom(sqInt bb);
 static sqInt loadImageSegmentFromoutPointers(sqInt segmentWordArray, sqInt outPointerArray);
 void loadInitialContext(void);
+void longPrintOop(sqInt oop);
 static sqInt lookupInMethodCacheSelclass(sqInt selector, sqInt class);
 static sqInt lookupMethodInClass(sqInt class);
 static sqInt lookupMethodInDictionary(sqInt dictionary);
@@ -698,8 +697,11 @@
 static StackPage * newStackPage(void);
 usqInt nextProfileTickAddress(void);
 sqInt nilObject(void);
+sqInt noAssertHeaderOf(sqInt methodPointer);
 static void noAtCacheCommonAtPut(sqInt stringy);
 static void noAtCacheCommonAt(sqInt stringy);
+static sqInt noInlineTemporaryin(sqInt offset, char *theFP);
+static void noInlineTemporaryinput(sqInt offset, char *theFP, sqInt valueOop);
 static sqInt noMarkedContextsOnPage(StackPage *thePage);
 static sqInt nonWeakFieldsOf(sqInt oop);
 sqInt nullHeaderForMachineCodeMethod(void);
@@ -1892,12 +1894,15 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void);
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.117";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.119";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
 
 /*** Macros ***/
+#define classFieldOffset() (0 - BaseHeaderSize)
+#define compactClassFieldLSB() 12
+#define compactClassFieldWidth() 5
 #define compilationBreakpoint(sel, len) do { \
 	if ((len) == breakSelectorLength \
 	 && !strncmp((char *)((sel) + BaseHeaderSize), breakSelector, breakSelectorLength)) { \
@@ -1915,6 +1920,8 @@
 #define getCogCodeSize() integerObjectOf(GIV(cogCodeSize))
 #define getDesiredCogCodeSize() integerObjectOf(desiredCogCodeSize)
 #define initialEnterSmalltalkExecutive() enterSmalltalkExecutiveImplementation()
+#define instFormatFieldLSB() 8
+#define instFormatFieldWidth() 4
 #define memory() memory
 #define mostRecentlyUsedPage() GIV(mostRecentlyUsedPage)
 #define nextOpenPIC methodObject
@@ -1925,7 +1932,6 @@
 #define remapBufferCount() GIV(remapBufferCount)
 #define setDesiredCogCodeSize(dccs) (desiredCogCodeSize = (dccs))
 #define stackPageAtpages(index,pages) ((pages) + (index))
-#define typeEtAlWord(cm) (((long *)(cm))[1])
 #define validate() 0
 #define youngStart() GIV(youngStart)
 
@@ -7928,36 +7934,39 @@
 							}
 						}
 					}
-					/* begin commonVariable:at:cacheIndex: */
-					VM_LABEL(0commonVariableatcacheIndex);
-					stSize = GIV(atCache)[atIx + AtCacheSize];
-					if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
-					 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
-						fmt = GIV(atCache)[atIx + AtCacheFmt];
-						if (fmt <= 4) {
-							fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
-							result = longAt((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord));
-							goto l78;
-						}
-						if (fmt < 8) {
+					if (!GIV(primFailCode)) {
+						/* begin commonVariable:at:cacheIndex: */
+						VM_LABEL(0commonVariableatcacheIndex);
+						stSize = GIV(atCache)[atIx + AtCacheSize];
+						if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
+						 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
+							fmt = GIV(atCache)[atIx + AtCacheFmt];
+							if (fmt <= 4) {
+								assert(!(isContextNonInt(rcvr)));
+								fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
+								result = longAt((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord));
+								goto l78;
+							}
+							if (fmt < 8) {
 
-							/* Bitmap */
+								/* Bitmap */
 
-							result1 = long32At((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2));
-							result = positive32BitIntegerFor(result1);
-							goto l78;
+								result1 = long32At((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2));
+								result = positive32BitIntegerFor(result1);
+								goto l78;
+							}
+							if (fmt >= 16) {
+								result = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CharacterTable << ShiftForWord))) + BaseHeaderSize) + ((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << ShiftForWord));
+								goto l78;
+							}
+							else {
+								result = (((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << 1) | 1);
+								goto l78;
+							}
 						}
-						if (fmt >= 16) {
-							result = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CharacterTable << ShiftForWord))) + BaseHeaderSize) + ((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << ShiftForWord));
-							goto l78;
-						}
-						else {
-							result = (((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << 1) | 1);
-							goto l78;
-						}
+						result = (GIV(primFailCode) = PrimErrBadIndex);
+					l78:	/* end commonVariable:at:cacheIndex: */;
 					}
-					result = (GIV(primFailCode) = PrimErrBadIndex);
-				l78:	/* end commonVariable:at:cacheIndex: */;
 					if (!GIV(primFailCode)) {
 						/* begin fetchNextBytecode */
 						currentBytecode = byteAtPointer(++localIP);
@@ -7965,6 +7974,8 @@
 						longAtPointerput((localSP += (2 - 1) * BytesPerWord), result);
 						goto l76;
 					}
+					/* begin initPrimCall */
+					GIV(primFailCode) = 0;
 				}
 				GIV(messageSelector) = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SpecialSelectors << ShiftForWord))) + BaseHeaderSize) + ((16 * 2) << ShiftForWord));
 				GIV(argumentCount) = 1;
@@ -8027,59 +8038,62 @@
 							}
 						}
 					}
-					/* begin commonVariable:at:put:cacheIndex: */
-					VM_LABEL(0commonVariableatputcacheIndex);
-					stSize = GIV(atCache)[atIx + AtCacheSize];
-					if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
-					 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
-						fmt = GIV(atCache)[atIx + AtCacheFmt];
-						if (fmt <= 4) {
-							fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
-							/* begin storePointer:ofObject:withValue: */
-							if ((((usqInt) rcvr)) < (((usqInt) GIV(youngStart)))) {
-								possibleRootStoreIntovalue(rcvr, value);
+					if (!GIV(primFailCode)) {
+						/* begin commonVariable:at:put:cacheIndex: */
+						VM_LABEL(0commonVariableatputcacheIndex);
+						stSize = GIV(atCache)[atIx + AtCacheSize];
+						if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
+						 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
+							fmt = GIV(atCache)[atIx + AtCacheFmt];
+							if (fmt <= 4) {
+								assert(!(isContextNonInt(rcvr)));
+								fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
+								/* begin storePointer:ofObject:withValue: */
+								if ((((usqInt) rcvr)) < (((usqInt) GIV(youngStart)))) {
+									possibleRootStoreIntovalue(rcvr, value);
+								}
+								longAtput((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord), value);
+								goto l80;
 							}
-							longAtput((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord), value);
-							goto l80;
-						}
-						if (fmt < 8) {
+							if (fmt < 8) {
 
-							/* Bitmap */
+								/* Bitmap */
 
-							valToPut = positive32BitValueOf(value);
-							if (!GIV(primFailCode)) {
-								long32Atput((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2), valToPut);
+								valToPut = positive32BitValueOf(value);
+								if (!GIV(primFailCode)) {
+									long32Atput((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2), valToPut);
+								}
+								goto l80;
 							}
-							goto l80;
-						}
-						if (fmt >= 16) {
+							if (fmt >= 16) {
 
-							/* Note fmt >= 16 is an artificial flag for strings */
+								/* Note fmt >= 16 is an artificial flag for strings */
 
-							valToPut = asciiOfCharacter(value);
-							if (!(!GIV(primFailCode))) {
-								goto l80;
+								valToPut = asciiOfCharacter(value);
+								if (!(!GIV(primFailCode))) {
+									goto l80;
+								}
 							}
-						}
-						else {
-							valToPut = value;
-						}
-						if ((valToPut & 1)) {
-							valToPut = (valToPut >> 1);
-							if (!((valToPut >= 0)
-								 && (valToPut <= 255))) {
-								/* begin primitiveFail */
-								if (!GIV(primFailCode)) {
-									GIV(primFailCode) = 1;
+							else {
+								valToPut = value;
+							}
+							if ((valToPut & 1)) {
+								valToPut = (valToPut >> 1);
+								if (!((valToPut >= 0)
+									 && (valToPut <= 255))) {
+									/* begin primitiveFail */
+									if (!GIV(primFailCode)) {
+										GIV(primFailCode) = 1;
+									}
+									goto l80;
 								}
+								byteAtput((rcvr + BaseHeaderSize) + (((index >> 1)) - 1), valToPut);
 								goto l80;
 							}
-							byteAtput((rcvr + BaseHeaderSize) + (((index >> 1)) - 1), valToPut);
-							goto l80;
 						}
+						GIV(primFailCode) = PrimErrBadIndex;
+					l80:	/* end commonVariable:at:put:cacheIndex: */;
 					}
-					GIV(primFailCode) = PrimErrBadIndex;
-				l80:	/* end commonVariable:at:put:cacheIndex: */;
 					if (!GIV(primFailCode)) {
 						/* begin fetchNextBytecode */
 						currentBytecode = byteAtPointer(++localIP);
@@ -8087,6 +8101,8 @@
 						longAtPointerput((localSP += (3 - 1) * BytesPerWord), value);
 						goto l79;
 					}
+					/* begin initPrimCall */
+					GIV(primFailCode) = 0;
 				}
 				GIV(messageSelector) = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SpecialSelectors << ShiftForWord))) + BaseHeaderSize) + ((17 * 2) << ShiftForWord));
 				GIV(argumentCount) = 2;
@@ -11747,7 +11763,7 @@
 				 || ((heapMapAtWord(pointerForOop(fieldOop))) == 0)) {
 					print("object leak in ");
 					printHex(obj);
-					print(" class ");
+					print(" class = ");
 					printHex(fieldOop);
 					/* begin cr */
 					printf("\n");
@@ -11814,6 +11830,8 @@
 								printHex(obj);
 								print(" @ ");
 								printNum(fi);
+								print(" = ");
+								printHex(fieldOop);
 								/* begin cr */
 								printf("\n");
 								ok = 0;
@@ -12293,12 +12311,6 @@
 }
 
 sqInt
-classFieldOffset(void)
-{
-	return 0 - BaseHeaderSize;
-}
-
-sqInt
 classFloat(void)
 {
 	return longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassFloat << ShiftForWord));
@@ -12648,7 +12660,12 @@
 
 		atIx = (rcvr & AtCacheMask) + AtPutBase;
 		if (!((GIV(atCache)[atIx + AtCacheOop]) == rcvr)) {
-			installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy);
+			if (!(installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy))) {
+				assert(isContextNonInt(rcvr));
+				/* begin initPrimCall */
+				GIV(primFailCode) = 0;
+				primitiveContextAtPut(); return;
+			}
 		}
 		if (!GIV(primFailCode)) {
 			/* begin commonVariable:at:put:cacheIndex: */
@@ -12658,6 +12675,7 @@
 			 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 				fmt = GIV(atCache)[atIx + AtCacheFmt];
 				if (fmt <= 4) {
+					assert(!(isContextNonInt(rcvr)));
 					fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
 					/* begin storePointer:ofObject:withValue: */
 					if ((((usqInt) rcvr)) < (((usqInt) GIV(youngStart)))) {
@@ -12775,7 +12793,12 @@
 
 		atIx = rcvr & AtCacheMask;
 		if (!((GIV(atCache)[atIx + AtCacheOop]) == rcvr)) {
-			installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy);
+			if (!(installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy))) {
+				assert(isContextNonInt(rcvr));
+				/* begin initPrimCall */
+				GIV(primFailCode) = 0;
+				primitiveContextAt(); return;
+			}
 		}
 		if (!GIV(primFailCode)) {
 			/* begin commonVariable:at:cacheIndex: */
@@ -12785,6 +12808,7 @@
 			 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 				fmt = GIV(atCache)[atIx + AtCacheFmt];
 				if (fmt <= 4) {
+					assert(!(isContextNonInt(rcvr)));
 					fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
 					result = longAt((rcvr + BaseHeaderSize) + (((index + fixedFields) - 1) << ShiftForWord));
 					goto l1;
@@ -12846,18 +12870,6 @@
 }
 
 sqInt
-compactClassFieldLSB(void)
-{
-	return 12;
-}
-
-sqInt
-compactClassFieldWidth(void)
-{
-	return 5;
-}
-
-sqInt
 compactClassIndexOfHeader(sqInt header)
 {
 	return (((usqInt) header) >> 12) & 31;
@@ -18699,10 +18711,12 @@
 }
 
 
-/*	Install the oop of this object in the given cache (at or atPut), along
-	with its size, format and fixedSize */
+/*	Attempt to install the oop of this object in the given cache (at or
+	atPut), along with its size, format and fixedSize. Answer if this was
+	successful. 
+ */
 
-static void
+static sqInt
 installinAtCacheatstring(sqInt rcvr, sqInt *cache, sqInt atIx, sqInt stringy)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt ccIndex;
@@ -18718,11 +18732,8 @@
 	fmt = (((usqInt) hdr) >> 8) & 15;
 	if ((fmt == 3)
 	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+		GIV(primFailCode) = PrimErrBadReceiver;
+		return 0;
 	}
 	/* begin lengthOf:baseHeader:format: */
 	if ((hdr & TypeMask) == HeaderTypeSizeAndClass) {
@@ -18774,6 +18785,7 @@
 	: fmt));
 	cache[atIx + AtCacheFixedFields] = fixedFields;
 	cache[atIx + AtCacheSize] = (totalLength - fixedFields);
+	return 1;
 }
 
 
@@ -19269,6 +19281,12 @@
 }
 
 static sqInt
+isContextNonInt(sqInt oop)
+{
+	return ((((usqInt) (longAt(oop))) >> 12) & 31) == ClassMethodContextCompactIndex;
+}
+
+static sqInt
 isContext(sqInt oop)
 {
 	return ((oop & 1) == 0)
@@ -20291,7 +20309,103 @@
 	GIV(instructionPointer) = ((sqInt) top);
 }
 
+void
+longPrintOop(sqInt oop)
+{
+    sqInt byte;
+    sqInt bytecodesPerLine;
+    sqInt fieldOop;
+    sqInt fmt;
+    sqInt header;
+    sqInt index;
+    sqInt lastIndex;
+    sqInt startIP;
+    sqInt sz;
 
+	if (((oop & 1))
+	 || ((!(((oop >= heapBase) && (oop <= GIV(freeStart)))))
+	 || (((oop & (BytesPerWord - 1)) != 0)
+	 || ((((longAt(oop)) & TypeMask) == HeaderTypeFree)
+	 || (((((fmt = (((usqInt) (longAt(oop))) >> 8) & 15)) >= 5) && (((fmt = (((usqInt) (longAt(oop))) >> 8) & 15)) <= 11))))))) {
+		printOop(oop); return;
+	}
+	printHex(oop);
+	print(": a(n) ");
+	printNameOfClasscount(fetchClassOfNonInt(oop), 5);
+	if (fmt > 4) {
+		print(" nbytes ");
+		printNum(byteSizeOf(oop));
+	}
+	/* begin cr */
+	printf("\n");
+	lastIndex = ((64 < ((startIP = ((sqInt) (lastPointerOf(oop)) >> 2)))) ? 64 : ((startIP = ((sqInt) (lastPointerOf(oop)) >> 2))));
+	if (lastIndex > 0) {
+		for (index = 1; index <= lastIndex; index += 1) {
+			fieldOop = longAt((oop + BaseHeaderSize) + ((index - 1) << ShiftForWord));
+			/* begin space */
+			/* begin printChar: */
+			putchar(' ');
+			printHex(fieldOop);
+			/* begin space */
+			/* begin printChar: */
+			putchar(' ');
+			printOopShort(fieldOop);
+			/* begin cr */
+			printf("\n");
+		}
+	}
+	if (((((usqInt) (longAt(oop))) >> 8) & 15) >= 12) {
+		startIP = (startIP * BytesPerWord) + 1;
+		/* begin lengthOf: */
+		header = longAt(oop);
+		/* begin lengthOf:baseHeader:format: */
+		if ((header & TypeMask) == HeaderTypeSizeAndClass) {
+			sz = (longAt(oop - (BytesPerWord * 2))) & LongSizeMask;
+		}
+		else {
+			sz = header & SizeMask;
+		}
+		sz -= header & Size4Bit;
+		if (((((usqInt) header) >> 8) & 15) <= 4) {
+			lastIndex = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
+			goto l1;
+		}
+		if (((((usqInt) header) >> 8) & 15) < 8) {
+			lastIndex = ((usqInt) (sz - BaseHeaderSize)) >> 2;
+			goto l1;
+		}
+		else {
+			lastIndex = (sz - BaseHeaderSize) - (((((usqInt) header) >> 8) & 15) & 3);
+			goto l1;
+		}
+	l1:	/* end lengthOf: */;
+		if ((lastIndex - startIP) > 100) {
+			lastIndex = startIP + 100;
+		}
+		bytecodesPerLine = 8;
+		for (index = startIP; index <= lastIndex; index += 1) {
+			byte = byteAt((oop + BaseHeaderSize) + (index - 1));
+			printf(" %02x/%-3d", byte,byte);
+			if ((((index - startIP) + 1) % bytecodesPerLine) == 0) {
+				/* begin cr */
+				printf("\n");
+			}
+		}
+		if (!((((lastIndex - startIP) + 1) % bytecodesPerLine) == 0)) {
+			/* begin cr */
+			printf("\n");
+		}
+	}
+	else {
+		if (startIP > 64) {
+			print("...");
+			/* begin cr */
+			printf("\n");
+		}
+	}
+}
+
+
 /*	This method implements a simple method lookup cache. If an entry for the
 	given selector and class is found in the cache, set the values of
 	'newMethod' and 'primitiveFunctionPointer' and return true. Otherwise,
@@ -22722,7 +22836,18 @@
 	return GIV(nilObj);
 }
 
+sqInt
+noAssertHeaderOf(sqInt methodPointer)
+{
+    sqInt methodHeader;
 
+	methodHeader = longAt((methodPointer + BaseHeaderSize) + (HeaderIndex << ShiftForWord));
+	return (isCogMethodReference(methodHeader)
+		? (((CogMethod *) methodHeader)->methodHeader)
+		: methodHeader);
+}
+
+
 /*	This code is called if the receiver responds primitively to at:Put:.
 	The cogit can implement at: & at:put: quickly in machine code, and needs a
 	backup that provides error codes. But it does not want the at cache so it
@@ -22807,7 +22932,47 @@
 	}
 }
 
+static sqInt
+noInlineTemporaryin(sqInt offset, char *theFP)
+{
+    sqInt frameNumArgs;
+    sqInt frameNumArgs1;
 
+	return ((((usqInt)(longAt(theFP + FoxMethod)))) < heapBase
+		? (offset < ((frameNumArgs = (mframeCogMethod(theFP)->cmNumArgs)))
+				? longAt((theFP + FoxCallerSavedIP) + ((frameNumArgs - offset) * BytesPerWord))
+				: longAt(((theFP + FoxMFReceiver) - BytesPerWord) + ((frameNumArgs - offset) * BytesPerWord)))
+		: (offset < ((frameNumArgs1 = byteAt((theFP + FoxIFrameFlags) + 1)))
+				? longAt((theFP + FoxCallerSavedIP) + ((frameNumArgs1 - offset) * BytesPerWord))
+				: longAt(((theFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - offset) * BytesPerWord))));
+}
+
+static void
+noInlineTemporaryinput(sqInt offset, char *theFP, sqInt valueOop)
+{
+    sqInt frameNumArgs;
+    sqInt frameNumArgs1;
+
+	/* begin temporary:in:put: */
+	VM_LABEL(0temporaryinput);
+	if ((((usqInt)(longAt(theFP + FoxMethod)))) < heapBase) {
+		/* begin mtemporary:in:put: */
+		longAtput((offset < ((frameNumArgs = (mframeCogMethod(theFP)->cmNumArgs)))
+			? (theFP + FoxCallerSavedIP) + ((frameNumArgs - offset) * BytesPerWord)
+			: ((theFP + FoxMFReceiver) - BytesPerWord) + ((frameNumArgs - offset) * BytesPerWord)), valueOop);
+	}
+	else {
+		/* begin itemporary:in:put: */
+		if (offset < ((frameNumArgs1 = byteAt((theFP + FoxIFrameFlags) + 1)))) {
+			longAtput((theFP + FoxCallerSavedIP) + ((frameNumArgs1 - offset) * BytesPerWord), valueOop);
+		}
+		else {
+			longAtput(((theFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - offset) * BytesPerWord), valueOop);
+		}
+	}
+}
+
+
 /*	Answer true if there are no marked contexts on thePage. */
 
 static sqInt
@@ -25145,7 +25310,7 @@
     sqInt methodHeader;
     sqInt newCopy;
     sqInt objHeader;
-    sqInt receiver;
+    sqInt rcvr;
     char *sp;
     sqInt sp1;
     char *spouseFP;
@@ -25153,29 +25318,29 @@
     sqInt valuePointer;
     sqInt valuePointer1;
 
-	receiver = longAt(GIV(stackPointer));
-	if ((receiver & 1)) {
-		newCopy = receiver;
+	rcvr = longAt(GIV(stackPointer));
+	if ((rcvr & 1)) {
+		newCopy = rcvr;
 	}
 	else {
-		objHeader = longAt(receiver);
+		objHeader = longAt(rcvr);
 		if (((((usqInt) objHeader) >> 12) & 31) == ClassMethodContextCompactIndex) {
 			/* begin cloneContext: */
 			VM_LABEL(0cloneContext);
-			cloned = eeInstantiateMethodContextByteSize(byteSizeOf(receiver));
+			cloned = eeInstantiateMethodContextByteSize(byteSizeOf(rcvr));
 			if (cloned != 0) {
 				for (i = 0; i <= StackPointerIndex; i += 1) {
 					/* begin storePointerUnchecked:ofObject:withValue: */
-					valuePointer = externalInstVarofContext(i, receiver);
+					valuePointer = externalInstVarofContext(i, rcvr);
 					longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), valuePointer);
 				}
 				for (i = MethodIndex; i <= ReceiverIndex; i += 1) {
-					longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), longAt((receiver + BaseHeaderSize) + (i << ShiftForWord)));
+					longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), longAt((rcvr + BaseHeaderSize) + (i << ShiftForWord)));
 				}
-				if ((((longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
-				 && (!(isWidowedContext(receiver)))) {
+				if ((((longAt((rcvr + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+				 && (!(isWidowedContext(rcvr)))) {
 					/* begin frameOfMarriedContext: */
-					value = longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord));
+					value = longAt((rcvr + BaseHeaderSize) + (SenderIndex << ShiftForWord));
 					/* begin withoutSmallIntegerTags: */
 					assert((value & 1));
 					spouseFP = pointerForOop(value - 1);
@@ -25193,16 +25358,16 @@
 					}
 				}
 				else {
-					sp1 = (fetchStackPointerOf(receiver)) - 1;
+					sp1 = (fetchStackPointerOf(rcvr)) - 1;
 					for (i = 0; i <= sp1; i += 1) {
-						longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), longAt((receiver + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord)));
+						longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), longAt((rcvr + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord)));
 					}
 				}
 			}
 			newCopy = cloned;
 		}
 		else {
-			newCopy = clone(receiver);
+			newCopy = clone(rcvr);
 		}
 		if (newCopy == 0) {
 			(GIV(primFailCode) = PrimErrNoMemory); return;
@@ -26135,6 +26300,10 @@
 	}
 }
 
+
+/*	Special version of primitiveAt for accessing contexts.
+	Written to be varargs for use from mirror primitives. */
+
 static void
 primitiveContextAt(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ -26162,11 +26331,7 @@
 
 	index = longAt(GIV(stackPointer));
 	if (!((index & 1))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+		(GIV(primFailCode) = PrimErrBadArgument); return;
 	}
 	index = (index >> 1);
 
@@ -26180,7 +26345,7 @@
 
 		value = stObjectat(aContext, index);
 		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), value);
+		longAtput((sp = GIV(stackPointer) + ((GIV(argumentCount) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp;
 		return;
 	}
@@ -26262,11 +26427,7 @@
 		stSize = (sp11 >> 1);
 	l5:	/* end stackPointerForMaybeMarriedContext: */;
 		if (!(((index >= 1) && (index <= stSize)))) {
-			/* begin primitiveFail */
-			if (!GIV(primFailCode)) {
-				GIV(primFailCode) = 1;
-			}
-			return;
+			(GIV(primFailCode) = PrimErrBadIndex); return;
 		}
 		/* begin subscript:with:format: */
 		if (fmt <= 4) {
@@ -26283,7 +26444,7 @@
 		}
 	l3:	/* end subscript:with:format: */;
 		/* begin pop:thenPush: */
-		longAtput((sp1 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), value);
+		longAtput((sp1 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp1;
 		return;
 	}
@@ -26293,11 +26454,7 @@
 	assert((value1 & 1));
 	spouseFP = pointerForOop(value1 - 1);
 	if (!(((index >= 1) && (index <= (stackPointerIndexForFrame(spouseFP)))))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+		(GIV(primFailCode) = PrimErrBadIndex); return;
 	}
 	value = ((((usqInt)(longAt(spouseFP + FoxMethod)))) < heapBase
 		? ((index - 1) < ((frameNumArgs = (mframeCogMethod(spouseFP)->cmNumArgs)))
@@ -26307,10 +26464,14 @@
 				? longAt((spouseFP + FoxCallerSavedIP) + ((frameNumArgs1 - (index - 1)) * BytesPerWord))
 				: longAt(((spouseFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - (index - 1)) * BytesPerWord))));
 	/* begin pop:thenPush: */
-	longAtput((sp2 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), value);
+	longAtput((sp2 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 	GIV(stackPointer) = sp2;
 }
 
+
+/*	Special version of primitiveAtPut for accessing contexts.
+	Written to be varargs for use from mirror primitives. */
+
 static sqInt
 primitiveContextAtPut(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ -26341,18 +26502,14 @@
 	index = longAt(GIV(stackPointer) + (1 * BytesPerWord));
 	aContext = longAt(GIV(stackPointer) + (2 * BytesPerWord));
 	if (!((index & 1))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return null;
+		return (GIV(primFailCode) = PrimErrBadArgument);
 	}
 	hdr = longAt(aContext);
 	index = (index >> 1);
 	if (!(((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
 		stObjectatput(aContext, index, value);
 		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + ((3 - 1) * BytesPerWord)), value);
+		longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp;
 		return null;
 	}
@@ -26434,11 +26591,7 @@
 		stSize = (sp11 >> 1);
 	l4:	/* end stackPointerForMaybeMarriedContext: */;
 		if (!(((index >= 1) && (index <= stSize)))) {
-			/* begin primitiveFail */
-			if (!GIV(primFailCode)) {
-				GIV(primFailCode) = 1;
-			}
-			return null;
+			return (GIV(primFailCode) = PrimErrBadIndex);
 		}
 		/* begin subscript:with:storing:format: */
 		VM_LABEL(0subscriptwithstoringformat);
@@ -26490,7 +26643,7 @@
 			}
 		}
 		/* begin pop:thenPush: */
-		longAtput((sp1 = GIV(stackPointer) + ((3 - 1) * BytesPerWord)), value);
+		longAtput((sp1 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp1;
 		return null;
 	}
@@ -26500,15 +26653,10 @@
 	assert((value1 & 1));
 	spouseFP = pointerForOop(value1 - 1);
 	if (!(((index >= 1) && (index <= (stackPointerIndexForFrame(spouseFP)))))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return null;
+		return (GIV(primFailCode) = PrimErrBadIndex);
 	}
 	/* begin temporary:in:put: */
-	VM_LABEL(0temporaryinput);
-	;
+	VM_LABEL(1temporaryinput);
 	if ((((usqInt)(longAt(spouseFP + FoxMethod)))) < heapBase) {
 		/* begin mtemporary:in:put: */
 		longAtput(((index - 1) < ((frameNumArgs = (mframeCogMethod(spouseFP)->cmNumArgs)))
@@ -26525,11 +26673,15 @@
 		}
 	}
 	/* begin pop:thenPush: */
-	longAtput((sp2 = GIV(stackPointer) + ((3 - 1) * BytesPerWord)), value);
+	longAtput((sp2 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 	GIV(stackPointer) = sp2;
 	return null;
 }
 
+
+/*	Special version of primitiveSize for accessing contexts.
+	Written to be varargs for use from mirror primitives. */
+
 static void
 primitiveContextSize(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ -26629,11 +26781,9 @@
 	else {
 		sz = totalLength - fixedFields;
 	}
-	if (!GIV(primFailCode)) {
-		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + ((1 - 1) * BytesPerWord)), ((sz << 1) | 1));
-		GIV(stackPointer) = sp;
-	}
+	/* begin pop:thenPush: */
+	longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), ((sz << 1) | 1));
+	GIV(stackPointer) = sp;
 }
 
 
@@ -35126,31 +35276,77 @@
 static void
 primitiveSize(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt ccIndex;
+    sqInt class;
+    sqInt classFormat;
+    sqInt fixedFields;
+    sqInt fmt;
+    sqInt hdr;
     sqInt rcvr;
     char *sp;
     sqInt sz;
+    sqInt totalLength;
 
 	rcvr = longAt(GIV(stackPointer));
-	if ((rcvr & 1)) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+	if (((rcvr & 1))
+	 || ((
+	/* Integers are not indexable */
+
+(hdr = longAt(rcvr)),
+	((fmt = (((usqInt) hdr) >> 8) & 15)) < 2))) {
+		(GIV(primFailCode) = PrimErrBadReceiver); return;
 	}
-	if (((((usqInt) (longAt(rcvr))) >> 8) & 15) < 2) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+	if ((fmt == 3)
+	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
+		primitiveContextSize(); return;
 	}
-	sz = stSizeOf(rcvr);
-	if (!GIV(primFailCode)) {
-		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), ((sz << 1) | 1));
-		GIV(stackPointer) = sp;
+	/* begin lengthOf:baseHeader:format: */
+	if ((hdr & TypeMask) == HeaderTypeSizeAndClass) {
+		sz = (longAt(rcvr - (BytesPerWord * 2))) & LongSizeMask;
 	}
+	else {
+		sz = hdr & SizeMask;
+	}
+	sz -= hdr & Size4Bit;
+	if (fmt <= 4) {
+		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
+		goto l1;
+	}
+	if (fmt < 8) {
+		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> 2;
+		goto l1;
+	}
+	else {
+		totalLength = (sz - BaseHeaderSize) - (fmt & 3);
+		goto l1;
+	}
+l1:	/* end lengthOf:baseHeader:format: */;
+	/* begin fixedFieldsOf:format:length: */
+	if ((fmt > 4)
+	 || (fmt == 2)) {
+		fixedFields = 0;
+		goto l2;
+	}
+	if (fmt < 2) {
+		fixedFields = totalLength;
+		goto l2;
+	}
+	/* begin fetchClassOfNonInt: */
+	if (((ccIndex = (((usqInt) (longAt(rcvr))) >> 12) & 31)) == 0) {
+		class = (longAt(rcvr - BaseHeaderSize)) & AllButTypeMask;
+		goto l3;
+	}
+	else {
+		class = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord));
+		goto l3;
+	}
+l3:	/* end fetchClassOfNonInt: */;
+	classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1;
+	fixedFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1;
+l2:	/* end fixedFieldsOf:format:length: */;
+	/* begin pop:thenPush: */
+	longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), (((totalLength - fixedFields) << 1) | 1));
+	GIV(stackPointer) = sp;
 }
 
 
@@ -38912,6 +39108,7 @@
 printMethodDictionaryOf(sqInt behavior)
 {
     sqInt index;
+    sqInt meth;
     sqInt methodArray;
     sqInt selector;
 
@@ -38921,9 +39118,15 @@
 	for (index = SelectorStart; index <= ((fetchWordLengthOf(longAt((behavior + BaseHeaderSize) + (MethodDictionaryIndex << ShiftForWord)))) - 1); index += 1) {
 		selector = longAt(((longAt((behavior + BaseHeaderSize) + (MethodDictionaryIndex << ShiftForWord))) + BaseHeaderSize) + (index << ShiftForWord));
 		if (selector != GIV(nilObj)) {
+			meth = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord));
 			printOopShort(selector);
 			print(" => ");
-			printOopShort(longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord)));
+			printOopShort(meth);
+			print(" (");
+			printHex(selector);
+			print(" => ");
+			printHex(meth);
+			putchar(')');
 			/* begin cr */
 			printf("\n");
 		}
@@ -38934,6 +39137,7 @@
 printMethodDictionary(sqInt dictionary)
 {
     sqInt index;
+    sqInt meth;
     sqInt methodArray;
     sqInt selector;
 
@@ -38941,9 +39145,15 @@
 	for (index = SelectorStart; index <= ((fetchWordLengthOf(dictionary)) - 1); index += 1) {
 		selector = longAt((dictionary + BaseHeaderSize) + (index << ShiftForWord));
 		if (selector != GIV(nilObj)) {
+			meth = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord));
 			printOopShort(selector);
 			print(" => ");
-			printOopShort(longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord)));
+			printOopShort(meth);
+			print(" (");
+			printHex(selector);
+			print(" => ");
+			printHex(meth);
+			putchar(')');
 			/* begin cr */
 			printf("\n");
 		}
@@ -42991,6 +43201,7 @@
     sqInt fixedFields;
     sqInt fmt;
     sqInt hdr;
+    sqInt sp;
     sqInt stSize;
     sqInt sz;
     sqInt totalLength;
@@ -43007,44 +43218,61 @@
 	sz -= hdr & Size4Bit;
 	if (fmt <= 4) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
-		goto l1;
+		goto l2;
 	}
 	if (fmt < 8) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> 2;
-		goto l1;
+		goto l2;
 	}
 	else {
 		totalLength = (sz - BaseHeaderSize) - (fmt & 3);
-		goto l1;
+		goto l2;
 	}
-l1:	/* end lengthOf:baseHeader:format: */;
+l2:	/* end lengthOf:baseHeader:format: */;
 	/* begin fixedFieldsOf:format:length: */
 	if ((fmt > 4)
 	 || (fmt == 2)) {
 		fixedFields = 0;
-		goto l2;
+		goto l3;
 	}
 	if (fmt < 2) {
 		fixedFields = totalLength;
-		goto l2;
+		goto l3;
 	}
 	/* begin fetchClassOfNonInt: */
 	if (((ccIndex = (((usqInt) (longAt(array))) >> 12) & 31)) == 0) {
 		class = (longAt(array - BaseHeaderSize)) & AllButTypeMask;
-		goto l3;
+		goto l4;
 	}
 	else {
 		class = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord));
-		goto l3;
+		goto l4;
 	}
-l3:	/* end fetchClassOfNonInt: */;
+l4:	/* end fetchClassOfNonInt: */;
 	classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1;
 	fixedFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1;
-l2:	/* end fixedFieldsOf:format:length: */;
-	if (fmt == 3) {
-		assert(!(isContextHeader(hdr)));
+l3:	/* end fixedFieldsOf:format:length: */;
+	if ((fmt == 3)
+	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
+		/* begin fetchStackPointerOf: */
+		sp = longAt((array + BaseHeaderSize) + (StackPointerIndex << ShiftForWord));
+		if (!((sp & 1))) {
+			stSize = 0;
+			goto l1;
+		}
+		assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(array)));
+		stSize = (sp >> 1);
+	l1:	/* end fetchStackPointerOf: */;
+		if (((((usqInt) index)) >= (((usqInt) 1)))
+		 && (((((usqInt) index)) <= (((usqInt) stSize)))
+		 && ((((longAt((array + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+		 && (!(isWidowedContext(array)))))) {
+			return noInlineTemporaryin(index - 1, frameOfMarriedContext(array));
+		}
 	}
-	stSize = totalLength - fixedFields;
+	else {
+		stSize = totalLength - fixedFields;
+	}
 	if (((((usqInt) index)) >= (((usqInt) 1)))
 	 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 		/* begin subscript:with:format: */
@@ -43076,6 +43304,7 @@
     sqInt fixedFields;
     sqInt fmt;
     sqInt hdr;
+    sqInt sp;
     sqInt stSize;
     sqInt sz;
     sqInt totalLength;
@@ -43093,44 +43322,62 @@
 	sz -= hdr & Size4Bit;
 	if (fmt <= 4) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
-		goto l1;
+		goto l2;
 	}
 	if (fmt < 8) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> 2;
-		goto l1;
+		goto l2;
 	}
 	else {
 		totalLength = (sz - BaseHeaderSize) - (fmt & 3);
-		goto l1;
+		goto l2;
 	}
-l1:	/* end lengthOf:baseHeader:format: */;
+l2:	/* end lengthOf:baseHeader:format: */;
 	/* begin fixedFieldsOf:format:length: */
 	if ((fmt > 4)
 	 || (fmt == 2)) {
 		fixedFields = 0;
-		goto l2;
+		goto l3;
 	}
 	if (fmt < 2) {
 		fixedFields = totalLength;
-		goto l2;
+		goto l3;
 	}
 	/* begin fetchClassOfNonInt: */
 	if (((ccIndex = (((usqInt) (longAt(array))) >> 12) & 31)) == 0) {
 		class = (longAt(array - BaseHeaderSize)) & AllButTypeMask;
-		goto l3;
+		goto l4;
 	}
 	else {
 		class = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord));
-		goto l3;
+		goto l4;
 	}
-l3:	/* end fetchClassOfNonInt: */;
+l4:	/* end fetchClassOfNonInt: */;
 	classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1;
 	fixedFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1;
-l2:	/* end fixedFieldsOf:format:length: */;
-	if (fmt == 3) {
-		assert(!(isContextHeader(hdr)));
+l3:	/* end fixedFieldsOf:format:length: */;
+	if ((fmt == 3)
+	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
+		/* begin fetchStackPointerOf: */
+		sp = longAt((array + BaseHeaderSize) + (StackPointerIndex << ShiftForWord));
+		if (!((sp & 1))) {
+			stSize = 0;
+			goto l1;
+		}
+		assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(array)));
+		stSize = (sp >> 1);
+	l1:	/* end fetchStackPointerOf: */;
+		if (((((usqInt) index)) >= (((usqInt) 1)))
+		 && (((((usqInt) index)) <= (((usqInt) stSize)))
+		 && ((((longAt((array + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+		 && (!(isWidowedContext(array)))))) {
+			noInlineTemporaryinput(index - 1, frameOfMarriedContext(array), value);
+			return;
+		}
 	}
-	stSize = totalLength - fixedFields;
+	else {
+		stSize = totalLength - fixedFields;
+	}
 	if (((((usqInt) index)) >= (((usqInt) 1)))
 	 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 		/* begin subscript:with:storing:format: */

Modified: branches/Cog/nscogsrc/vm/interp.h
===================================================================
--- branches/Cog/nscogsrc/vm/interp.h	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/nscogsrc/vm/interp.h	2011-08-19 21:33:12 UTC (rev 2488)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
  */
 
 #define VM_PROXY_MAJOR 1

Modified: branches/Cog/nscogsrc/vm/vmCallback.h
===================================================================
--- branches/Cog/nscogsrc/vm/vmCallback.h	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/nscogsrc/vm/vmCallback.h	2011-08-19 21:33:12 UTC (rev 2488)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
  */
 
 #define VM_CALLBACK_INC 1


Property changes on: branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
___________________________________________________________________
Modified: checkindate
   - Tue Aug 16 15:27:50 PDT 2011
   + Fri Aug 19 14:31:01 PDT 2011

Added: branches/Cog/scripts/mknsvmlinuxarchive
===================================================================
--- branches/Cog/scripts/mknsvmlinuxarchive	                        (rev 0)
+++ branches/Cog/scripts/mknsvmlinuxarchive	2011-08-19 21:33:12 UTC (rev 2488)
@@ -0,0 +1,7 @@
+#!/bin/sh
+SVNREV="`svnversion | sed 's/^.*://'`"
+echo $SVNREV
+export SVNREV
+rm nsvmlinux/lib/nsvm/{npsqueakregister,npsqueakrun}
+ln ~/Squeak/SqueakV41.sources nsvmlinux/lib/nsvm/*
+tar cvzf nsvmlinux-`date +%g.%U.$SVNREV`.tgz nsvmlinux


Property changes on: branches/Cog/scripts/mknsvmlinuxarchive
___________________________________________________________________
Added: svn:executable
   + *

Modified: branches/Cog/src/vm/cogit.c
===================================================================
--- branches/Cog/src/vm/cogit.c	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/src/vm/cogit.c	2011-08-19 21:33:12 UTC (rev 2488)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CCodeGenerator VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	StackToRegisterMappingCogit VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9 " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -145,6 +145,7 @@
 #define BytesPerWord 4
 #define Call 9
 #define CDQ 103
+#define ClassMethodContextCompactIndex 14
 #define ClassReg -5
 #define ClosureFirstCopiedValueIndex 3
 #define ClosureNumArgsIndex 2
@@ -603,7 +604,6 @@
 static sqInt genGetHashFieldNonIntOfasSmallIntegerInto(sqInt instReg, sqInt destReg);
 static sqInt genGetLeafCallStackPointer(void);
 static void genGetLeafCallStackPointerFunction(AbstractInstruction * self_in_genGetLeafCallStackPointerFunction);
-static AbstractInstruction * genGetSizeOfintoformatRegscratchReg(sqInt sourceReg, sqInt destReg, sqInt formatReg, sqInt scratchReg);
 static sqInt genInnerPICAbortTrampoline(char *name);
 static sqInt genInnerPrimitiveAt(sqInt retNoffset);
 static sqInt genInnerPrimitiveSize(sqInt retNoffset);
@@ -765,7 +765,6 @@
 static sqInt hasPCDependentInstructions(AbstractInstruction * self_in_hasPCDependentInstructions);
 static sqInt hasSSE2Instructions(AbstractInstruction * self_in_hasSSE2Instructions);
 static sqInt hasSSEInstructions(AbstractInstruction * self_in_hasSSEInstructions);
-static sqInt hasValidHeaderPostGC(CogMethod *cogMethod);
 static sqInt incrementUsageOfTargetIfLinkedSendmcpcignored(sqInt annotation, char *mcpc, sqInt superfluity);
 static sqInt initialClosedPICUsageCount(void);
 static void initializeBackend(void);
@@ -861,6 +860,7 @@
 static AbstractInstruction * gNegateR(sqInt reg);
 static sqInt needsFrameIfInBlock(sqInt isInBlock);
 static sqInt needsFrameNever(sqInt isInBlock);
+static sqInt noAssertMethodClassAssociationOf(sqInt methodPointer);
 static sqInt noCogMethodsMaximallyMarked(void);
 static void nopsFromto(AbstractInstruction * self_in_nopsFromto, sqInt startAddr, sqInt endAddr);
 static sqInt noTargetsFreeInClosedPIC(CogMethod *cPIC);
@@ -1672,7 +1672,6 @@
 #define traceSimStack() 0
 #define traceSpill(ign) 0
 #define tryLockVMOwner() (ceTryLockVMOwner() != 0)
-#define typeEtAlWord(cm) (((long *)(cm))[1])
 #define unalignedLongAt(inst,byteAddress) longAt(byteAddress)
 #define unalignedLongAtput(inst,byteAddress,aWord) longAtput(byteAddress,aWord)
 #define unlockVMOwner() ceUnlockVMOwner()
@@ -1905,7 +1904,7 @@
 	cogMethod = ((CogMethod *) methodZoneBase);
 	while (cogMethod < (limitZony())) {
 		if (((cogMethod->cmType)) == CMMethod) {
-			if (!(hasValidHeaderPostGC(cogMethod))) {
+			if (!(((cogMethod->objectHeader)) == (nullHeaderForMachineCodeMethod()))) {
 				return 0;
 			}
 		}
@@ -2377,7 +2376,9 @@
     sqInt cacheTag;
     sqInt entryPoint;
     sqInt literal;
+    sqInt off;
     sqInt offset;
+    sqInt table;
     CogMethod *targetMethod;
 
 	if (annotation == IsObjectReference) {
@@ -2415,9 +2416,55 @@
 		}
 		entryPoint = callTargetFromReturnAddress(backEnd, ((sqInt)mcpc));
 		if (entryPoint > methodZoneBase) {
-			offset = ((entryPoint & entryPointMask) == checkedEntryAlignment
-				? cmEntryOffset
-				: cmNoCheckEntryOffset);
+			/* begin offsetAndSendTableFor:annotation:into: */
+			VM_LABEL(0offsetAndSendTableForannotationinto);
+			
+#      if NewspeakVM
+			if ((entryPoint & entryPointMask) == checkedEntryAlignment) {
+				assert(annotation == IsSendCall);
+				
+				/* It's a linked send; find which kind. */
+
+				offset = cmEntryOffset;
+
+			}
+			else {
+				if ((entryPoint & entryPointMask) == dynSuperEntryAlignment) {
+					assert(annotation == IsNSSendCall);
+					
+					/* It's a linked send; find which kind. */
+
+					offset = cmDynSuperEntryOffset;
+
+				}
+				else {
+					assert(annotation == IsSendCall);
+					
+					/* It's a linked send; find which kind. */
+
+					offset = cmNoCheckEntryOffset;
+
+				}
+			}
+
+#      else /* NewspeakVM */
+			if ((entryPoint & entryPointMask) == checkedEntryAlignment) {
+				
+				/* It's a linked send; find which kind. */
+
+				offset = cmEntryOffset;
+
+			}
+			else {
+				
+				/* It's a linked send; find which kind. */
+
+				offset = cmNoCheckEntryOffset;
+
+			}
+
+#      endif /* NewspeakVM */
+
 			targetMethod = ((CogMethod *) (entryPoint - offset));
 			if (!(asserta((((targetMethod->cmType)) == CMMethod)
 				 || ((((targetMethod->cmType)) == CMClosedPIC)
@@ -3094,7 +3141,7 @@
     CogMethod *cogMethod;
 
 	assert((!(methodHasCogMethod(aMethodObj)))
-	 || ((methodClassAssociationOf(aMethodObj)) == (nilObject())));
+	 || ((noAssertMethodClassAssociationOf(aMethodObj)) == (nilObject())));
 	compilationBreakpoint(aSelectorOop, lengthOf(aSelectorOop));
 	if (aMethodObj == breakMethod) {
 		haltmsg("Compilation of breakMethod");
@@ -3106,6 +3153,11 @@
 		null;
 	}
 	else {
+		if (!(methodHasCogMethod(aMethodObj))) {
+			assert((rawHeaderOf(aMethodObj)) == ((cogMethod->methodHeader)));
+			(cogMethod->methodObject = aMethodObj);
+			rawHeaderOfput(aMethodObj, ((sqInt)cogMethod));
+		}
 		return cogMethod;
 	}
 
@@ -3177,7 +3229,7 @@
 			(dest->objectHeader = objectHeaderValue);
 			if (((dest->cmType)) == CMMethod) {
 				assert(((((sqInt)(rawHeaderOf((dest->methodObject))))) == (((sqInt)source)))
-				 || ((methodClassAssociationOf((dest->methodObject))) == (nilObject())));
+				 || ((noAssertMethodClassAssociationOf((dest->methodObject))) == (nilObject())));
 				if ((((sqInt)(rawHeaderOf((dest->methodObject))))) == (((sqInt)source))) {
 					rawHeaderOfput((dest->methodObject), ((sqInt)dest));
 				}
@@ -7483,7 +7535,7 @@
 	assert((cogMethodDoesntLookKosher(cogMethod)) == 0);
 	if (((cogMethod->cmType)) == CMMethod) {
 		assert(((((sqInt)(rawHeaderOf((cogMethod->methodObject))))) == (((sqInt)cogMethod)))
-		 || ((methodClassAssociationOf((cogMethod->methodObject))) == (nilObject())));
+		 || ((noAssertMethodClassAssociationOf((cogMethod->methodObject))) == (nilObject())));
 		if ((((sqInt)(rawHeaderOf((cogMethod->methodObject))))) == (((sqInt)cogMethod))) {
 			rawHeaderOfput((cogMethod->methodObject), (cogMethod->methodHeader));
 		}
@@ -8777,11 +8829,11 @@
 	/* begin MoveMw:r:R: */
 	genoperandoperandoperand(MoveMwrR, 0, instReg, destReg);
 	/* begin LogicalShiftRightCq:R: */
-	quickConstant1 = (compactClassFieldLSB()) - ShiftForWord;
-	genoperandoperand(LogicalShiftRightCqR, quickConstant1, destReg);
+	quickConstant = (compactClassFieldLSB()) - ShiftForWord;
+	genoperandoperand(LogicalShiftRightCqR, quickConstant, destReg);
 	/* begin AndCq:R: */
-	quickConstant = ((1 << (compactClassFieldWidth())) - 1) << ShiftForWord;
-	genoperandoperand(AndCqR, quickConstant, destReg);
+	quickConstant1 = ((1 << (compactClassFieldWidth())) - 1) << ShiftForWord;
+	genoperandoperand(AndCqR, quickConstant1, destReg);
 	/* begin JumpNonZero: */
 	jumpCompact = genoperand(JumpNonZero, ((sqInt)0));
 	/* begin MoveMw:r:R: */
@@ -8823,11 +8875,11 @@
 	/* begin MoveMw:r:R: */
 	genoperandoperandoperand(MoveMwrR, 0, instReg, scratchReg);
 	/* begin LogicalShiftRightCq:R: */
-	quickConstant1 = (compactClassFieldLSB()) - ShiftForWord;
-	genoperandoperand(LogicalShiftRightCqR, quickConstant1, scratchReg);
+	quickConstant = (compactClassFieldLSB()) - ShiftForWord;
+	genoperandoperand(LogicalShiftRightCqR, quickConstant, scratchReg);
 	/* begin AndCq:R: */
-	quickConstant = ((1 << (compactClassFieldWidth())) - 1) << ShiftForWord;
-	genoperandoperand(AndCqR, quickConstant, scratchReg);
+	quickConstant1 = ((1 << (compactClassFieldWidth())) - 1) << ShiftForWord;
+	genoperandoperand(AndCqR, quickConstant1, scratchReg);
 	/* begin JumpNonZero: */
 	jumpCompact = genoperand(JumpNonZero, ((sqInt)0));
 	/* begin MoveMw:r:R: */
@@ -8859,11 +8911,11 @@
 	/* begin MoveMw:r:R: */
 	genoperandoperandoperand(MoveMwrR, 0, instReg, destReg);
 	/* begin LogicalShiftRightCq:R: */
-	quickConstant1 = compactClassFieldLSB();
-	genoperandoperand(LogicalShiftRightCqR, quickConstant1, destReg);
+	quickConstant = compactClassFieldLSB();
+	genoperandoperand(LogicalShiftRightCqR, quickConstant, destReg);
 	/* begin AndCq:R: */
-	quickConstant = (1 << (compactClassFieldWidth())) - 1;
-	genoperandoperand(AndCqR, quickConstant, destReg);
+	quickConstant1 = (1 << (compactClassFieldWidth())) - 1;
+	genoperandoperand(AndCqR, quickConstant1, destReg);
 	return 0;
 }
 
@@ -8950,138 +9002,145 @@
 }
 
 
-/*	Get the size of the non-immediate object in sourceReg into destReg using
-	formatReg and scratchReg as temps. None of these registers can overlap.
-	Answer the jump
-	taken if the object in sourceReg is not indexable. Hack: If the object hs
-	a pointer
-	format other than 2 leave the number of fixed fields in formatReg. Used by
-	primitiveSize, primitiveAt, primitiveAtPut, primitiveStringAt &
-	primitiveStringAtPut  */
+/*	Generate the abort for a PIC. This abort performs either a call of
+	ceInterpretMethodFromPIC:receiver: to handle invoking an uncogged
+	target or a call of ceMNUFromPICMNUMethod:receiver: to handle an
+	MNU dispatch in a closed PIC. It distinguishes the two by testing
+	ClassReg. If the register is zero then this is an MNU. */
+
+static sqInt
+genInnerPICAbortTrampoline(char *name)
+{
+    AbstractInstruction *jumpMNUCase;
+
+	/* begin CmpCq:R: */
+	genoperandoperand(CmpCqR, 0, ClassReg);
+	/* begin JumpZero: */
+	jumpMNUCase = genoperand(JumpZero, ((sqInt)0));
+	compileTrampolineForcallJumpBarnumArgsargargargargsaveRegsresultReg(ceInterpretMethodFromPICreceiver, 1, 2, SendNumArgsReg, ReceiverResultReg, null, null, 0, null);
+	jmpTarget(jumpMNUCase, gLabel());
+	return genTrampolineForcalledcallJumpBarnumArgsargargargargsaveRegsresultRegappendOpcodes(ceMNUFromPICMNUMethodreceiver, name, 1, 2, SendNumArgsReg, ReceiverResultReg, null, null, 0, null, 1);
+}
+
+
 /*	c.f. StackInterpreter>>stSizeOf: lengthOf:baseHeader:format:
 	fixedFieldsOf:format:length: 
  */
-/*	and one wonders why Squeak V1 through V3 are slow... */
 
-static AbstractInstruction *
-genGetSizeOfintoformatRegscratchReg(sqInt sourceReg, sqInt destReg, sqInt formatReg, sqInt scratchReg)
+static sqInt
+genInnerPrimitiveAt(sqInt retNoffset)
 {
+    sqInt jic;
     AbstractInstruction *jmpFmtGe8;
+    sqInt jnx;
+    AbstractInstruction *jumpBounds;
+    AbstractInstruction *jumpFmtEq2;
+    AbstractInstruction *jumpFmtGt4;
     AbstractInstruction *jumpFmtIs2;
     AbstractInstruction *jumpFmtLe4;
+    AbstractInstruction *jumpFmtLt8;
     AbstractInstruction *jumpGotByteSize;
     AbstractInstruction *jumpGotWordSize;
+    AbstractInstruction *jumpIsContext;
+    AbstractInstruction *jumpIsContext1;
+    AbstractInstruction *jumpLarge;
     AbstractInstruction *jumpNotIndexable;
+    AbstractInstruction *jumpNotIndexable1;
+    AbstractInstruction *jumpNotSI;
     AbstractInstruction *jumpShortHeader;
+    AbstractInstruction *jumpSI;
     AbstractInstruction *jumpSkip;
+    sqInt quickConstant;
+    sqInt quickConstant1;
+    sqInt quickConstant11;
+    sqInt quickConstant2;
+    sqInt quickConstant3;
+    sqInt quickConstant4;
 
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, ReceiverResultReg, TempReg);
+	jumpSI = genJumpSmallIntegerInScratchReg(TempReg);
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, Arg0Reg, TempReg);
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, Arg0Reg, Arg1Reg);
+	jumpNotSI = genJumpNotSmallIntegerInScratchReg(TempReg);
+	/* begin genGetSizeOf:into:formatReg:scratchReg:abortJumpsInto: */
+	VM_LABEL(0genGetSizeOfintoformatRegscratchRegabortJumpsInto);
 	/* begin MoveMw:r:R: */
-	genoperandoperandoperand(MoveMwrR, 0, sourceReg, formatReg);
+	genoperandoperandoperand(MoveMwrR, 0, ReceiverResultReg, SendNumArgsReg);
 	/* begin MoveR:R: */
-	genoperandoperand(MoveRR, formatReg, destReg);
+	genoperandoperand(MoveRR, SendNumArgsReg, ClassReg);
 	/* begin LogicalShiftRightCq:R: */
-	genoperandoperand(LogicalShiftRightCqR, 8, formatReg);
+	quickConstant4 = instFormatFieldLSB();
+	genoperandoperand(LogicalShiftRightCqR, quickConstant4, SendNumArgsReg);
 	/* begin AndCq:R: */
-	genoperandoperand(AndCqR, 15, formatReg);
+	quickConstant11 = (1 << (instFormatFieldWidth())) - 1;
+	genoperandoperand(AndCqR, quickConstant11, SendNumArgsReg);
 	/* begin CmpCq:R: */
-	genoperandoperand(CmpCqR, 2, formatReg);
+	genoperandoperand(CmpCqR, 2, SendNumArgsReg);
 	/* begin JumpLess: */
-	jumpNotIndexable = genoperand(JumpLess, ((sqInt)0));
+	jumpNotIndexable1 = genoperand(JumpLess, ((sqInt)0));
 	/* begin MoveR:R: */
-	genoperandoperand(MoveRR, destReg, scratchReg);
+	genoperandoperand(MoveRR, ClassReg, TempReg);
+	/* begin LogicalShiftRightCq:R: */
+	quickConstant2 = compactClassFieldLSB();
+	genoperandoperand(LogicalShiftRightCqR, quickConstant2, TempReg);
 	/* begin AndCq:R: */
-	genoperandoperand(AndCqR, TypeMask, scratchReg);
+	quickConstant3 = (1 << (compactClassFieldWidth())) - 1;
+	genoperandoperand(AndCqR, quickConstant3, TempReg);
 	/* begin CmpCq:R: */
-	genoperandoperand(CmpCqR, HeaderTypeSizeAndClass, scratchReg);
+	genoperandoperand(CmpCqR, ClassMethodContextCompactIndex, TempReg);
+	/* begin JumpZero: */
+	jumpIsContext1 = genoperand(JumpZero, ((sqInt)0));
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, ClassReg, TempReg);
+	/* begin AndCq:R: */
+	genoperandoperand(AndCqR, TypeMask, TempReg);
+	/* begin CmpCq:R: */
+	genoperandoperand(CmpCqR, HeaderTypeSizeAndClass, TempReg);
 	/* begin JumpNonZero: */
 	jumpShortHeader = genoperand(JumpNonZero, ((sqInt)0));
 	assert(Size4Bit == 0);
 	/* begin MoveMw:r:R: */
-	genoperandoperandoperand(MoveMwrR, 0 - (2 * BytesPerWord), sourceReg, destReg);
+	genoperandoperandoperand(MoveMwrR, 0 - (2 * BytesPerWord), ReceiverResultReg, ClassReg);
 	/* begin AndCq:R: */
-	genoperandoperand(AndCqR, ((sqInt) LongSizeMask), destReg);
+	genoperandoperand(AndCqR, ((sqInt) LongSizeMask), ClassReg);
 	/* begin Jump: */
 	jumpSkip = genoperand(Jump, ((sqInt)0));
-	jmpTarget(jumpShortHeader, gAndCqR(SizeMask, destReg));
-	jmpTarget(jumpSkip, gSubCqR(BaseHeaderSize, destReg));
+	jmpTarget(jumpShortHeader, gAndCqR(SizeMask, ClassReg));
+	jmpTarget(jumpSkip, gSubCqR(BaseHeaderSize, ClassReg));
 	/* begin CmpCq:R: */
-	genoperandoperand(CmpCqR, 4, formatReg);
+	genoperandoperand(CmpCqR, 4, SendNumArgsReg);
 	/* begin JumpLessOrEqual: */
 	jumpFmtLe4 = genoperand(JumpLessOrEqual, ((sqInt)0));
 	/* begin CmpCq:R: */
-	genoperandoperand(CmpCqR, 8, formatReg);
+	genoperandoperand(CmpCqR, 8, SendNumArgsReg);
 	/* begin JumpLess: */
 	jmpFmtGe8 = genoperand(JumpLess, ((sqInt)0));
 	/* begin AndCq:R: */
-	genoperandoperand(AndCqR, 3, formatReg);
+	genoperandoperand(AndCqR, 3, SendNumArgsReg);
 	/* begin SubR:R: */
-	genoperandoperand(SubRR, formatReg, destReg);
+	genoperandoperand(SubRR, SendNumArgsReg, ClassReg);
 	/* begin Jump: */
 	jumpGotByteSize = genoperand(Jump, ((sqInt)0));
-	jmpTarget(jmpFmtGe8, gLogicalShiftRightCqR(2, destReg));
+	jmpTarget(jmpFmtGe8, gLogicalShiftRightCqR(2, ClassReg));
 	/* begin Jump: */
 	jumpGotWordSize = genoperand(Jump, ((sqInt)0));
 	jmpTarget(jumpFmtLe4, gLabel());
 	/* begin LogicalShiftRightCq:R: */
-	genoperandoperand(LogicalShiftRightCqR, ShiftForWord, destReg);
+	genoperandoperand(LogicalShiftRightCqR, ShiftForWord, ClassReg);
 	/* begin CmpCq:R: */
-	genoperandoperand(CmpCqR, 2, formatReg);
+	genoperandoperand(CmpCqR, 2, SendNumArgsReg);
 	/* begin JumpZero: */
 	jumpFmtIs2 = genoperand(JumpZero, ((sqInt)0));
-	genGetFixedFieldsOfPointerNonIntintoscratchReg(sourceReg, formatReg, scratchReg);
+	genGetFixedFieldsOfPointerNonIntintoscratchReg(ReceiverResultReg, SendNumArgsReg, TempReg);
 	/* begin SubR:R: */
-	genoperandoperand(SubRR, formatReg, destReg);
+	genoperandoperand(SubRR, SendNumArgsReg, ClassReg);
 	jmpTarget(jumpFmtIs2, jmpTarget(jumpGotWordSize, jmpTarget(jumpGotByteSize, gLabel())));
-	return jumpNotIndexable;
-}
+		jumpNotIndexable = jumpNotIndexable1;
+	jumpIsContext = jumpIsContext1;
 
-
-/*	Generate the abort for a PIC. This abort performs either a call of
-	ceInterpretMethodFromPIC:receiver: to handle invoking an uncogged
-	target or a call of ceMNUFromPICMNUMethod:receiver: to handle an
-	MNU dispatch in a closed PIC. It distinguishes the two by testing
-	ClassReg. If the register is zero then this is an MNU. */
-
-static sqInt
-genInnerPICAbortTrampoline(char *name)
-{
-    AbstractInstruction *jumpMNUCase;
-
-	/* begin CmpCq:R: */
-	genoperandoperand(CmpCqR, 0, ClassReg);
-	/* begin JumpZero: */
-	jumpMNUCase = genoperand(JumpZero, ((sqInt)0));
-	compileTrampolineForcallJumpBarnumArgsargargargargsaveRegsresultReg(ceInterpretMethodFromPICreceiver, 1, 2, SendNumArgsReg, ReceiverResultReg, null, null, 0, null);
-	jmpTarget(jumpMNUCase, gLabel());
-	return genTrampolineForcalledcallJumpBarnumArgsargargargargsaveRegsresultRegappendOpcodes(ceMNUFromPICMNUMethodreceiver, name, 1, 2, SendNumArgsReg, ReceiverResultReg, null, null, 0, null, 1);
-}
-
-
-/*	c.f. StackInterpreter>>stSizeOf: lengthOf:baseHeader:format:
-	fixedFieldsOf:format:length: 
- */
-
-static sqInt
-genInnerPrimitiveAt(sqInt retNoffset)
-{
-    AbstractInstruction *jumpBounds;
-    AbstractInstruction *jumpFmtEq2;
-    AbstractInstruction *jumpFmtGt4;
-    AbstractInstruction *jumpFmtLt8;
-    AbstractInstruction *jumpLarge;
-    AbstractInstruction *jumpNotIndexable;
-    AbstractInstruction *jumpNotSI;
-    AbstractInstruction *jumpSI;
-
-	/* begin MoveR:R: */
-	genoperandoperand(MoveRR, ReceiverResultReg, TempReg);
-	jumpSI = genJumpSmallIntegerInScratchReg(TempReg);
-	/* begin MoveR:R: */
-	genoperandoperand(MoveRR, Arg0Reg, TempReg);
-	/* begin MoveR:R: */
-	genoperandoperand(MoveRR, Arg0Reg, Arg1Reg);
-	jumpNotSI = genJumpNotSmallIntegerInScratchReg(TempReg);
-	jumpNotIndexable = genGetSizeOfintoformatRegscratchReg(ReceiverResultReg, ClassReg, SendNumArgsReg, TempReg);
 	genConvertSmallIntegerToIntegerInScratchReg(Arg1Reg);
 	/* begin SubCq:R: */
 	genoperandoperand(SubCqR, 1, Arg1Reg);
@@ -9092,9 +9151,11 @@
 	/* begin MoveMw:r:R: */
 	genoperandoperandoperand(MoveMwrR, 0, ReceiverResultReg, ClassReg);
 	/* begin LogicalShiftRightCq:R: */
-	genoperandoperand(LogicalShiftRightCqR, 8, ClassReg);
+	quickConstant = instFormatFieldLSB();
+	genoperandoperand(LogicalShiftRightCqR, quickConstant, ClassReg);
 	/* begin AndCq:R: */
-	genoperandoperand(AndCqR, 15, ClassReg);
+	quickConstant1 = (1 << (instFormatFieldWidth())) - 1;
+	genoperandoperand(AndCqR, quickConstant1, ClassReg);
 	/* begin CmpCq:R: */
 	genoperandoperand(CmpCqR, 4, ClassReg);
 	/* begin JumpGreater: */
@@ -9142,7 +9203,7 @@
 	genoperandoperand(MoveRR, TempReg, ReceiverResultReg);
 	/* begin RetN: */
 	genoperand(RetN, retNoffset);
-	jmpTarget(jumpSI, jmpTarget(jumpNotSI, jmpTarget(jumpNotIndexable, jmpTarget(jumpBounds, gLabel()))));
+	jmpTarget(jumpSI, jmpTarget(jumpNotSI, jmpTarget(jumpNotIndexable, jmpTarget(jumpIsContext, jmpTarget(jumpBounds, gLabel())))));
 	return 0;
 }
 
@@ -9154,20 +9215,111 @@
 static sqInt
 genInnerPrimitiveSize(sqInt retNoffset)
 {
+    sqInt jic;
+    AbstractInstruction *jmpFmtGe8;
+    sqInt jnx;
+    AbstractInstruction *jumpFmtIs2;
+    AbstractInstruction *jumpFmtLe4;
+    AbstractInstruction *jumpGotByteSize;
+    AbstractInstruction *jumpGotWordSize;
+    AbstractInstruction *jumpIsContext;
+    AbstractInstruction *jumpIsContext1;
     AbstractInstruction *jumpNotIndexable;
+    AbstractInstruction *jumpNotIndexable1;
     AbstractInstruction *jumpNotSI;
+    AbstractInstruction *jumpShortHeader;
+    AbstractInstruction *jumpSkip;
+    sqInt quickConstant;
+    sqInt quickConstant1;
+    sqInt quickConstant2;
+    sqInt quickConstant3;
 
 	/* begin MoveR:R: */
 	genoperandoperand(MoveRR, ReceiverResultReg, TempReg);
 	jumpNotSI = genJumpSmallIntegerInScratchReg(TempReg);
-	jumpNotIndexable = genGetSizeOfintoformatRegscratchReg(ReceiverResultReg, ClassReg, SendNumArgsReg, TempReg);
+	/* begin genGetSizeOf:into:formatReg:scratchReg:abortJumpsInto: */
+	VM_LABEL(1genGetSizeOfintoformatRegscratchRegabortJumpsInto);
+	/* begin MoveMw:r:R: */
+	genoperandoperandoperand(MoveMwrR, 0, ReceiverResultReg, SendNumArgsReg);
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, SendNumArgsReg, ClassReg);
+	/* begin LogicalShiftRightCq:R: */
+	quickConstant = instFormatFieldLSB();
+	genoperandoperand(LogicalShiftRightCqR, quickConstant, SendNumArgsReg);
+	/* begin AndCq:R: */
+	quickConstant1 = (1 << (instFormatFieldWidth())) - 1;
+	genoperandoperand(AndCqR, quickConstant1, SendNumArgsReg);
+	/* begin CmpCq:R: */
+	genoperandoperand(CmpCqR, 2, SendNumArgsReg);
+	/* begin JumpLess: */
+	jumpNotIndexable1 = genoperand(JumpLess, ((sqInt)0));
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, ClassReg, TempReg);
+	/* begin LogicalShiftRightCq:R: */
+	quickConstant2 = compactClassFieldLSB();
+	genoperandoperand(LogicalShiftRightCqR, quickConstant2, TempReg);
+	/* begin AndCq:R: */
+	quickConstant3 = (1 << (compactClassFieldWidth())) - 1;
+	genoperandoperand(AndCqR, quickConstant3, TempReg);
+	/* begin CmpCq:R: */
+	genoperandoperand(CmpCqR, ClassMethodContextCompactIndex, TempReg);
+	/* begin JumpZero: */
+	jumpIsContext1 = genoperand(JumpZero, ((sqInt)0));
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, ClassReg, TempReg);
+	/* begin AndCq:R: */
+	genoperandoperand(AndCqR, TypeMask, TempReg);
+	/* begin CmpCq:R: */
+	genoperandoperand(CmpCqR, HeaderTypeSizeAndClass, TempReg);
+	/* begin JumpNonZero: */
+	jumpShortHeader = genoperand(JumpNonZero, ((sqInt)0));
+	assert(Size4Bit == 0);
+	/* begin MoveMw:r:R: */
+	genoperandoperandoperand(MoveMwrR, 0 - (2 * BytesPerWord), ReceiverResultReg, ClassReg);
+	/* begin AndCq:R: */
+	genoperandoperand(AndCqR, ((sqInt) LongSizeMask), ClassReg);
+	/* begin Jump: */
+	jumpSkip = genoperand(Jump, ((sqInt)0));
+	jmpTarget(jumpShortHeader, gAndCqR(SizeMask, ClassReg));
+	jmpTarget(jumpSkip, gSubCqR(BaseHeaderSize, ClassReg));
+	/* begin CmpCq:R: */
+	genoperandoperand(CmpCqR, 4, SendNumArgsReg);
+	/* begin JumpLessOrEqual: */
+	jumpFmtLe4 = genoperand(JumpLessOrEqual, ((sqInt)0));
+	/* begin CmpCq:R: */
+	genoperandoperand(CmpCqR, 8, SendNumArgsReg);
+	/* begin JumpLess: */
+	jmpFmtGe8 = genoperand(JumpLess, ((sqInt)0));
+	/* begin AndCq:R: */
+	genoperandoperand(AndCqR, 3, SendNumArgsReg);
+	/* begin SubR:R: */
+	genoperandoperand(SubRR, SendNumArgsReg, ClassReg);
+	/* begin Jump: */
+	jumpGotByteSize = genoperand(Jump, ((sqInt)0));
+	jmpTarget(jmpFmtGe8, gLogicalShiftRightCqR(2, ClassReg));
+	/* begin Jump: */
+	jumpGotWordSize = genoperand(Jump, ((sqInt)0));
+	jmpTarget(jumpFmtLe4, gLabel());
+	/* begin LogicalShiftRightCq:R: */
+	genoperandoperand(LogicalShiftRightCqR, ShiftForWord, ClassReg);
+	/* begin CmpCq:R: */
+	genoperandoperand(CmpCqR, 2, SendNumArgsReg);
+	/* begin JumpZero: */
+	jumpFmtIs2 = genoperand(JumpZero, ((sqInt)0));
+	genGetFixedFieldsOfPointerNonIntintoscratchReg(ReceiverResultReg, SendNumArgsReg, TempReg);
+	/* begin SubR:R: */
+	genoperandoperand(SubRR, SendNumArgsReg, ClassReg);
+	jmpTarget(jumpFmtIs2, jmpTarget(jumpGotWordSize, jmpTarget(jumpGotByteSize, gLabel())));
+		jumpNotIndexable = jumpNotIndexable1;
+	jumpIsContext = jumpIsContext1;
+
 	genConvertIntegerToSmallIntegerInScratchReg(ClassReg);
 	/* begin MoveR:R: */
 	genoperandoperand(MoveRR, ClassReg, ReceiverResultReg);
 	flag("currently caller pushes result");
 	/* begin RetN: */
 	genoperand(RetN, retNoffset);
-	jmpTarget(jumpNotSI, jmpTarget(jumpNotIndexable, gLabel()));
+	jmpTarget(jumpNotSI, jmpTarget(jumpNotIndexable, jmpTarget(jumpIsContext, gLabel())));
 	return 0;
 }
 
@@ -9185,6 +9337,8 @@
     AbstractInstruction *jumpShortHeader;
     AbstractInstruction *jumpSI;
     AbstractInstruction *jumpSkip;
+    sqInt quickConstant;
+    sqInt quickConstant1;
 
 	/* begin MoveR:R: */
 	genoperandoperand(MoveRR, ReceiverResultReg, TempReg);
@@ -9199,9 +9353,11 @@
 	/* begin MoveR:R: */
 	genoperandoperand(MoveRR, TempReg, ClassReg);
 	/* begin LogicalShiftRightCq:R: */
-	genoperandoperand(LogicalShiftRightCqR, 8, TempReg);
+	quickConstant = instFormatFieldLSB();
+	genoperandoperand(LogicalShiftRightCqR, quickConstant, TempReg);
 	/* begin AndCq:R: */
-	genoperandoperand(AndCqR, 15, TempReg);
+	quickConstant1 = (1 << (instFormatFieldWidth())) - 1;
+	genoperandoperand(AndCqR, quickConstant1, TempReg);
 	/* begin MoveR:R: */
 	genoperandoperand(MoveRR, TempReg, SendNumArgsReg);
 	/* begin AndCq:R: */
@@ -9748,8 +9904,13 @@
 static sqInt
 genPrimitiveAt(void)
 {
+    sqInt r;
+
 	assert((numRegArgs()) >= 1);
-	return genInnerPrimitiveAt(0);
+	if (((r = genInnerPrimitiveAt(0))) < 0) {
+		return r;
+	}
+	return compileInterpreterPrimitive(functionPointerForCompiledMethodprimitiveIndex(methodObj, primitiveIndex));
 }
 
 static sqInt
@@ -10345,14 +10506,24 @@
 static sqInt
 genPrimitiveSize(void)
 {
-	return genInnerPrimitiveSize(0);
+    sqInt r;
+
+	if (((r = genInnerPrimitiveSize(0))) < 0) {
+		return r;
+	}
+	return compileInterpreterPrimitive(functionPointerForCompiledMethodprimitiveIndex(methodObj, primitiveIndex));
 }
 
 static sqInt
 genPrimitiveStringAt(void)
 {
+    sqInt r;
+
 	assert((numRegArgs()) >= 1);
-	return genInnerPrimitiveStringAt(0);
+	if (((r = genInnerPrimitiveStringAt(0))) < 0) {
+		return r;
+	}
+	return compileInterpreterPrimitive(functionPointerForCompiledMethodprimitiveIndex(methodObj, primitiveIndex));
 }
 
 static sqInt
@@ -12176,11 +12347,11 @@
 	/* begin MoveMw:r:R: */
 	genoperandoperandoperand(MoveMwrR, 0, sourceReg, destReg);
 	/* begin LogicalShiftRightCq:R: */
-	quickConstant1 = (compactClassFieldLSB()) - ShiftForWord;
-	genoperandoperand(LogicalShiftRightCqR, quickConstant1, destReg);
+	quickConstant = (compactClassFieldLSB()) - ShiftForWord;
+	genoperandoperand(LogicalShiftRightCqR, quickConstant, destReg);
 	/* begin AndCq:R: */
-	quickConstant = ((1 << (compactClassFieldWidth())) - 1) << ShiftForWord;
-	genoperandoperand(AndCqR, quickConstant, destReg);
+	quickConstant1 = ((1 << (compactClassFieldWidth())) - 1) << ShiftForWord;
+	genoperandoperand(AndCqR, quickConstant1, destReg);
 	/* begin JumpNonZero: */
 	jumpCompact = genoperand(JumpNonZero, ((sqInt)0));
 	/* begin MoveMw:r:R: */
@@ -12249,12 +12420,6 @@
 }
 
 static sqInt
-hasValidHeaderPostGC(CogMethod *cogMethod)
-{
-	return ((cogMethod->objectHeader)) == (nullHeaderForMachineCodeMethod());
-}
-
-static sqInt
 incrementUsageOfTargetIfLinkedSendmcpcignored(sqInt annotation, char *mcpc, sqInt superfluity)
 {
     sqInt entryPoint;
@@ -12274,7 +12439,7 @@
 		entryPoint = callTargetFromReturnAddress(backEnd, ((sqInt)mcpc));
 		if (entryPoint > methodZoneBase) {
 			/* begin offsetAndSendTableFor:annotation:into: */
-			VM_LABEL(0offsetAndSendTableForannotationinto);
+			VM_LABEL(1offsetAndSendTableForannotationinto);
 			
 #      if NewspeakVM
 			if ((entryPoint & entryPointMask) == checkedEntryAlignment) {
@@ -13431,7 +13596,8 @@
 				if (((cogMethod->cmType)) == CMMethod) {
 					assert(((cogMethod->objectHeader)) == (nullHeaderForMachineCodeMethod()));
 					(cogMethod->methodObject = remapOop((cogMethod->methodObject)));
-					assert((rawHeaderOf((cogMethod->methodObject))) == (((sqInt)cogMethod)));
+					assert(((rawHeaderOf((cogMethod->methodObject))) == (((sqInt)cogMethod)))
+					 || ((noAssertMethodClassAssociationOf((cogMethod->methodObject))) == (nilObject())));
 					if (isYoung((cogMethod->methodObject))) {
 						hasYoungObj = 1;
 					}
@@ -13832,7 +13998,7 @@
 		entryPoint = callTargetFromReturnAddress(backEnd, ((sqInt)mcpc));
 		if (entryPoint > methodZoneBase) {
 			/* begin offsetAndSendTableFor:annotation:into: */
-			VM_LABEL(1offsetAndSendTableForannotationinto);
+			VM_LABEL(2offsetAndSendTableForannotationinto);
 			
 #      if NewspeakVM
 			if ((entryPoint & entryPointMask) == checkedEntryAlignment) {
@@ -14179,7 +14345,13 @@
 	return 0;
 }
 
+static sqInt
+noAssertMethodClassAssociationOf(sqInt methodPointer)
+{
+	return literalofMethod((literalCountOfHeader(noAssertHeaderOf(methodPointer))) - 1, methodPointer);
+}
 
+
 /*	Check that no metod is maximally marked. A maximal mark is an indication
 	the method has been scanned to increase the usage count of its referent
 	methods.  */
@@ -14975,7 +15147,7 @@
 			return 0;
 		}
 		/* begin offsetAndSendTableFor:annotation:into: */
-		VM_LABEL(2offsetAndSendTableForannotationinto);
+		VM_LABEL(3offsetAndSendTableForannotationinto);
 		
 #    if NewspeakVM
 		if ((entryPoint & entryPointMask) == checkedEntryAlignment) {
@@ -16187,7 +16359,7 @@
 		entryPoint = callTargetFromReturnAddress(backEnd, ((sqInt)mcpc));
 		if (entryPoint > methodZoneBase) {
 			/* begin offsetAndSendTableFor:annotation:into: */
-			VM_LABEL(3offsetAndSendTableForannotationinto);
+			VM_LABEL(4offsetAndSendTableForannotationinto);
 			
 #      if NewspeakVM
 			if ((entryPoint & entryPointMask) == checkedEntryAlignment) {
@@ -16273,7 +16445,7 @@
 		entryPoint = callTargetFromReturnAddress(backEnd, ((sqInt)mcpc));
 		if (entryPoint > methodZoneBase) {
 			/* begin offsetAndSendTableFor:annotation:into: */
-			VM_LABEL(4offsetAndSendTableForannotationinto);
+			VM_LABEL(5offsetAndSendTableForannotationinto);
 			
 #      if NewspeakVM
 			if ((entryPoint & entryPointMask) == checkedEntryAlignment) {
@@ -16367,7 +16539,7 @@
 
 		if (entryPoint > methodZoneBase) {
 			/* begin offsetAndSendTableFor:annotation:into: */
-			VM_LABEL(5offsetAndSendTableForannotationinto);
+			VM_LABEL(6offsetAndSendTableForannotationinto);
 			
 #      if NewspeakVM
 			if ((entryPoint & entryPointMask) == checkedEntryAlignment) {
@@ -16453,7 +16625,7 @@
 		entryPoint = callTargetFromReturnAddress(backEnd, ((sqInt)mcpc));
 		if (entryPoint > methodZoneBase) {
 			/* begin offsetAndSendTableFor:annotation:into: */
-			VM_LABEL(6offsetAndSendTableForannotationinto);
+			VM_LABEL(7offsetAndSendTableForannotationinto);
 			
 #      if NewspeakVM
 			if ((entryPoint & entryPointMask) == checkedEntryAlignment) {

Modified: branches/Cog/src/vm/cogit.h
===================================================================
--- branches/Cog/src/vm/cogit.h	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/src/vm/cogit.h	2011-08-19 21:33:12 UTC (rev 2488)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CCodeGenerator VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
  */
 
 

Modified: branches/Cog/src/vm/cogmethod.h
===================================================================
--- branches/Cog/src/vm/cogmethod.h	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/src/vm/cogmethod.h	2011-08-19 21:33:12 UTC (rev 2488)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CCodeGenerator VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
  */
 
 typedef struct {

Modified: branches/Cog/src/vm/cointerp.c
===================================================================
--- branches/Cog/src/vm/cointerp.c	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/src/vm/cointerp.c	2011-08-19 21:33:12 UTC (rev 2488)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
    from
-	CoInterpreter VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CoInterpreter VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -409,7 +409,6 @@
 sqInt classExternalFunction(void);
 sqInt classExternalLibrary(void);
 sqInt classExternalStructure(void);
-sqInt classFieldOffset(void);
 sqInt classFloat(void);
 sqInt classFloatCompactIndex(void);
 sqInt classHeader(sqInt oop);
@@ -430,8 +429,6 @@
 static void commonAtPut(sqInt stringy);
 static void commonAt(sqInt stringy);
 sqInt compactClassAt(sqInt ccIndex);
-sqInt compactClassFieldLSB(void);
-sqInt compactClassFieldWidth(void);
 sqInt compactClassIndexOfHeader(sqInt header);
 sqInt compactClassIndexOf(sqInt oop);
 sqInt compactClassTable(void);
@@ -572,7 +569,7 @@
 static void initializeObjectMemory(sqInt bytesToShift);
 static void initializeStacknumSlotspageSizestackLimitOffsetstackPageHeadroom(char *theStackPages, sqInt stackSlots, sqInt slotsPerPage, sqInt stackLimitOffsetBytes, sqInt stackPageHeadroomBytes);
 static sqInt initStackPagesAndInterpret(void);
-static void installinAtCacheatstring(sqInt rcvr, sqInt *cache, sqInt atIx, sqInt stringy);
+static sqInt installinAtCacheatstring(sqInt rcvr, sqInt *cache, sqInt atIx, sqInt stringy);
 sqInt instanceSizeOf(sqInt classObj);
 sqInt instantiateClassindexableSize(sqInt classPointer, sqInt size);
 usqInt instructionPointerAddress(void);
@@ -589,6 +586,7 @@
 sqInt isCogMethodReference(sqInt methodHeader);
 sqInt isCompiledMethod(sqInt oop);
 static sqInt isContextHeader(sqInt aHeader);
+static sqInt isContextNonInt(sqInt oop);
 static sqInt isContext(sqInt oop);
 sqInt isFloatObject(sqInt oop);
 static sqInt isFree(StackPage * self_in_isFree);
@@ -633,6 +631,7 @@
 sqInt loadBitBltFrom(sqInt bb);
 static sqInt loadImageSegmentFromoutPointers(sqInt segmentWordArray, sqInt outPointerArray);
 void loadInitialContext(void);
+void longPrintOop(sqInt oop);
 static sqInt lookupInMethodCacheSelclass(sqInt selector, sqInt class);
 static sqInt lookupMethodInClass(sqInt class);
 static sqInt lookupMethodInDictionary(sqInt dictionary);
@@ -686,8 +685,11 @@
 static StackPage * newStackPage(void);
 usqInt nextProfileTickAddress(void);
 sqInt nilObject(void);
+sqInt noAssertHeaderOf(sqInt methodPointer);
 static void noAtCacheCommonAtPut(sqInt stringy);
 static void noAtCacheCommonAt(sqInt stringy);
+static sqInt noInlineTemporaryin(sqInt offset, char *theFP);
+static void noInlineTemporaryinput(sqInt offset, char *theFP, sqInt valueOop);
 static sqInt noMarkedContextsOnPage(StackPage *thePage);
 static sqInt nonWeakFieldsOf(sqInt oop);
 sqInt nullHeaderForMachineCodeMethod(void);
@@ -1136,9 +1138,9 @@
 _iss StackPage * stackPage;
 _iss sqInt nilObj;
 _iss usqInt instructionPointer;
+_iss sqInt argumentCount;
 _iss usqInt method;
 _iss usqInt freeStart;
-_iss sqInt argumentCount;
 _iss usqInt newMethod;
 _iss sqInt messageSelector;
 _iss StackPage * pages;
@@ -1880,12 +1882,15 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void);
-const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.117]";
+const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.119]";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
 
 /*** Macros ***/
+#define classFieldOffset() (0 - BaseHeaderSize)
+#define compactClassFieldLSB() 12
+#define compactClassFieldWidth() 5
 #define compilationBreakpoint(sel, len) do { \
 	if ((len) == breakSelectorLength \
 	 && !strncmp((char *)((sel) + BaseHeaderSize), breakSelector, breakSelectorLength)) { \
@@ -1903,6 +1908,8 @@
 #define getCogCodeSize() integerObjectOf(GIV(cogCodeSize))
 #define getDesiredCogCodeSize() integerObjectOf(desiredCogCodeSize)
 #define initialEnterSmalltalkExecutive() enterSmalltalkExecutiveImplementation()
+#define instFormatFieldLSB() 8
+#define instFormatFieldWidth() 4
 #define memory() memory
 #define mostRecentlyUsedPage() GIV(mostRecentlyUsedPage)
 #define nextOpenPIC methodObject
@@ -1913,7 +1920,6 @@
 #define remapBufferCount() GIV(remapBufferCount)
 #define setDesiredCogCodeSize(dccs) (desiredCogCodeSize = (dccs))
 #define stackPageAtpages(index,pages) ((pages) + (index))
-#define typeEtAlWord(cm) (((long *)(cm))[1])
 #define validate() 0
 #define youngStart() GIV(youngStart)
 
@@ -7684,36 +7690,39 @@
 							}
 						}
 					}
-					/* begin commonVariable:at:cacheIndex: */
-					VM_LABEL(0commonVariableatcacheIndex);
-					stSize = GIV(atCache)[atIx + AtCacheSize];
-					if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
-					 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
-						fmt = GIV(atCache)[atIx + AtCacheFmt];
-						if (fmt <= 4) {
-							fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
-							result = longAt((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord));
-							goto l73;
-						}
-						if (fmt < 8) {
+					if (!GIV(primFailCode)) {
+						/* begin commonVariable:at:cacheIndex: */
+						VM_LABEL(0commonVariableatcacheIndex);
+						stSize = GIV(atCache)[atIx + AtCacheSize];
+						if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
+						 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
+							fmt = GIV(atCache)[atIx + AtCacheFmt];
+							if (fmt <= 4) {
+								assert(!(isContextNonInt(rcvr)));
+								fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
+								result = longAt((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord));
+								goto l73;
+							}
+							if (fmt < 8) {
 
-							/* Bitmap */
+								/* Bitmap */
 
-							result1 = long32At((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2));
-							result = positive32BitIntegerFor(result1);
-							goto l73;
+								result1 = long32At((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2));
+								result = positive32BitIntegerFor(result1);
+								goto l73;
+							}
+							if (fmt >= 16) {
+								result = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CharacterTable << ShiftForWord))) + BaseHeaderSize) + ((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << ShiftForWord));
+								goto l73;
+							}
+							else {
+								result = (((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << 1) | 1);
+								goto l73;
+							}
 						}
-						if (fmt >= 16) {
-							result = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CharacterTable << ShiftForWord))) + BaseHeaderSize) + ((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << ShiftForWord));
-							goto l73;
-						}
-						else {
-							result = (((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << 1) | 1);
-							goto l73;
-						}
+						result = (GIV(primFailCode) = PrimErrBadIndex);
+					l73:	/* end commonVariable:at:cacheIndex: */;
 					}
-					result = (GIV(primFailCode) = PrimErrBadIndex);
-				l73:	/* end commonVariable:at:cacheIndex: */;
 					if (!GIV(primFailCode)) {
 						/* begin fetchNextBytecode */
 						currentBytecode = byteAtPointer(++localIP);
@@ -7721,6 +7730,8 @@
 						longAtPointerput((localSP += (2 - 1) * BytesPerWord), result);
 						goto l71;
 					}
+					/* begin initPrimCall */
+					GIV(primFailCode) = 0;
 				}
 				GIV(messageSelector) = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SpecialSelectors << ShiftForWord))) + BaseHeaderSize) + ((16 * 2) << ShiftForWord));
 				GIV(argumentCount) = 1;
@@ -7783,59 +7794,62 @@
 							}
 						}
 					}
-					/* begin commonVariable:at:put:cacheIndex: */
-					VM_LABEL(0commonVariableatputcacheIndex);
-					stSize = GIV(atCache)[atIx + AtCacheSize];
-					if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
-					 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
-						fmt = GIV(atCache)[atIx + AtCacheFmt];
-						if (fmt <= 4) {
-							fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
-							/* begin storePointer:ofObject:withValue: */
-							if ((((usqInt) rcvr)) < (((usqInt) GIV(youngStart)))) {
-								possibleRootStoreIntovalue(rcvr, value);
+					if (!GIV(primFailCode)) {
+						/* begin commonVariable:at:put:cacheIndex: */
+						VM_LABEL(0commonVariableatputcacheIndex);
+						stSize = GIV(atCache)[atIx + AtCacheSize];
+						if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
+						 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
+							fmt = GIV(atCache)[atIx + AtCacheFmt];
+							if (fmt <= 4) {
+								assert(!(isContextNonInt(rcvr)));
+								fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
+								/* begin storePointer:ofObject:withValue: */
+								if ((((usqInt) rcvr)) < (((usqInt) GIV(youngStart)))) {
+									possibleRootStoreIntovalue(rcvr, value);
+								}
+								longAtput((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord), value);
+								goto l75;
 							}
-							longAtput((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord), value);
-							goto l75;
-						}
-						if (fmt < 8) {
+							if (fmt < 8) {
 
-							/* Bitmap */
+								/* Bitmap */
 
-							valToPut = positive32BitValueOf(value);
-							if (!GIV(primFailCode)) {
-								long32Atput((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2), valToPut);
+								valToPut = positive32BitValueOf(value);
+								if (!GIV(primFailCode)) {
+									long32Atput((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2), valToPut);
+								}
+								goto l75;
 							}
-							goto l75;
-						}
-						if (fmt >= 16) {
+							if (fmt >= 16) {
 
-							/* Note fmt >= 16 is an artificial flag for strings */
+								/* Note fmt >= 16 is an artificial flag for strings */
 
-							valToPut = asciiOfCharacter(value);
-							if (!(!GIV(primFailCode))) {
-								goto l75;
+								valToPut = asciiOfCharacter(value);
+								if (!(!GIV(primFailCode))) {
+									goto l75;
+								}
 							}
-						}
-						else {
-							valToPut = value;
-						}
-						if ((valToPut & 1)) {
-							valToPut = (valToPut >> 1);
-							if (!((valToPut >= 0)
-								 && (valToPut <= 255))) {
-								/* begin primitiveFail */
-								if (!GIV(primFailCode)) {
-									GIV(primFailCode) = 1;
+							else {
+								valToPut = value;
+							}
+							if ((valToPut & 1)) {
+								valToPut = (valToPut >> 1);
+								if (!((valToPut >= 0)
+									 && (valToPut <= 255))) {
+									/* begin primitiveFail */
+									if (!GIV(primFailCode)) {
+										GIV(primFailCode) = 1;
+									}
+									goto l75;
 								}
+								byteAtput((rcvr + BaseHeaderSize) + (((index >> 1)) - 1), valToPut);
 								goto l75;
 							}
-							byteAtput((rcvr + BaseHeaderSize) + (((index >> 1)) - 1), valToPut);
-							goto l75;
 						}
+						GIV(primFailCode) = PrimErrBadIndex;
+					l75:	/* end commonVariable:at:put:cacheIndex: */;
 					}
-					GIV(primFailCode) = PrimErrBadIndex;
-				l75:	/* end commonVariable:at:put:cacheIndex: */;
 					if (!GIV(primFailCode)) {
 						/* begin fetchNextBytecode */
 						currentBytecode = byteAtPointer(++localIP);
@@ -7843,6 +7857,8 @@
 						longAtPointerput((localSP += (3 - 1) * BytesPerWord), value);
 						goto l74;
 					}
+					/* begin initPrimCall */
+					GIV(primFailCode) = 0;
 				}
 				GIV(messageSelector) = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SpecialSelectors << ShiftForWord))) + BaseHeaderSize) + ((17 * 2) << ShiftForWord));
 				GIV(argumentCount) = 2;
@@ -11364,7 +11380,7 @@
 				 || ((heapMapAtWord(pointerForOop(fieldOop))) == 0)) {
 					print("object leak in ");
 					printHex(obj);
-					print(" class ");
+					print(" class = ");
 					printHex(fieldOop);
 					/* begin cr */
 					printf("\n");
@@ -11431,6 +11447,8 @@
 								printHex(obj);
 								print(" @ ");
 								printNum(fi);
+								print(" = ");
+								printHex(fieldOop);
 								/* begin cr */
 								printf("\n");
 								ok = 0;
@@ -11910,12 +11928,6 @@
 }
 
 sqInt
-classFieldOffset(void)
-{
-	return 0 - BaseHeaderSize;
-}
-
-sqInt
 classFloat(void)
 {
 	return longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassFloat << ShiftForWord));
@@ -12265,7 +12277,12 @@
 
 		atIx = (rcvr & AtCacheMask) + AtPutBase;
 		if (!((GIV(atCache)[atIx + AtCacheOop]) == rcvr)) {
-			installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy);
+			if (!(installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy))) {
+				assert(isContextNonInt(rcvr));
+				/* begin initPrimCall */
+				GIV(primFailCode) = 0;
+				primitiveContextAtPut(); return;
+			}
 		}
 		if (!GIV(primFailCode)) {
 			/* begin commonVariable:at:put:cacheIndex: */
@@ -12275,6 +12292,7 @@
 			 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 				fmt = GIV(atCache)[atIx + AtCacheFmt];
 				if (fmt <= 4) {
+					assert(!(isContextNonInt(rcvr)));
 					fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
 					/* begin storePointer:ofObject:withValue: */
 					if ((((usqInt) rcvr)) < (((usqInt) GIV(youngStart)))) {
@@ -12392,7 +12410,12 @@
 
 		atIx = rcvr & AtCacheMask;
 		if (!((GIV(atCache)[atIx + AtCacheOop]) == rcvr)) {
-			installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy);
+			if (!(installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy))) {
+				assert(isContextNonInt(rcvr));
+				/* begin initPrimCall */
+				GIV(primFailCode) = 0;
+				primitiveContextAt(); return;
+			}
 		}
 		if (!GIV(primFailCode)) {
 			/* begin commonVariable:at:cacheIndex: */
@@ -12402,6 +12425,7 @@
 			 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 				fmt = GIV(atCache)[atIx + AtCacheFmt];
 				if (fmt <= 4) {
+					assert(!(isContextNonInt(rcvr)));
 					fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
 					result = longAt((rcvr + BaseHeaderSize) + (((index + fixedFields) - 1) << ShiftForWord));
 					goto l1;
@@ -12463,18 +12487,6 @@
 }
 
 sqInt
-compactClassFieldLSB(void)
-{
-	return 12;
-}
-
-sqInt
-compactClassFieldWidth(void)
-{
-	return 5;
-}
-
-sqInt
 compactClassIndexOfHeader(sqInt header)
 {
 	return (((usqInt) header) >> 12) & 31;
@@ -18026,10 +18038,12 @@
 }
 
 
-/*	Install the oop of this object in the given cache (at or atPut), along
-	with its size, format and fixedSize */
+/*	Attempt to install the oop of this object in the given cache (at or
+	atPut), along with its size, format and fixedSize. Answer if this was
+	successful. 
+ */
 
-static void
+static sqInt
 installinAtCacheatstring(sqInt rcvr, sqInt *cache, sqInt atIx, sqInt stringy)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt ccIndex;
@@ -18045,11 +18059,8 @@
 	fmt = (((usqInt) hdr) >> 8) & 15;
 	if ((fmt == 3)
 	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+		GIV(primFailCode) = PrimErrBadReceiver;
+		return 0;
 	}
 	/* begin lengthOf:baseHeader:format: */
 	if ((hdr & TypeMask) == HeaderTypeSizeAndClass) {
@@ -18101,6 +18112,7 @@
 	: fmt));
 	cache[atIx + AtCacheFixedFields] = fixedFields;
 	cache[atIx + AtCacheSize] = (totalLength - fixedFields);
+	return 1;
 }
 
 
@@ -18596,6 +18608,12 @@
 }
 
 static sqInt
+isContextNonInt(sqInt oop)
+{
+	return ((((usqInt) (longAt(oop))) >> 12) & 31) == ClassMethodContextCompactIndex;
+}
+
+static sqInt
 isContext(sqInt oop)
 {
 	return ((oop & 1) == 0)
@@ -19618,7 +19636,103 @@
 	GIV(instructionPointer) = ((sqInt) top);
 }
 
+void
+longPrintOop(sqInt oop)
+{
+    sqInt byte;
+    sqInt bytecodesPerLine;
+    sqInt fieldOop;
+    sqInt fmt;
+    sqInt header;
+    sqInt index;
+    sqInt lastIndex;
+    sqInt startIP;
+    sqInt sz;
 
+	if (((oop & 1))
+	 || ((!(((oop >= heapBase) && (oop <= GIV(freeStart)))))
+	 || (((oop & (BytesPerWord - 1)) != 0)
+	 || ((((longAt(oop)) & TypeMask) == HeaderTypeFree)
+	 || (((((fmt = (((usqInt) (longAt(oop))) >> 8) & 15)) >= 5) && (((fmt = (((usqInt) (longAt(oop))) >> 8) & 15)) <= 11))))))) {
+		printOop(oop); return;
+	}
+	printHex(oop);
+	print(": a(n) ");
+	printNameOfClasscount(fetchClassOfNonInt(oop), 5);
+	if (fmt > 4) {
+		print(" nbytes ");
+		printNum(byteSizeOf(oop));
+	}
+	/* begin cr */
+	printf("\n");
+	lastIndex = ((64 < ((startIP = ((sqInt) (lastPointerOf(oop)) >> 2)))) ? 64 : ((startIP = ((sqInt) (lastPointerOf(oop)) >> 2))));
+	if (lastIndex > 0) {
+		for (index = 1; index <= lastIndex; index += 1) {
+			fieldOop = longAt((oop + BaseHeaderSize) + ((index - 1) << ShiftForWord));
+			/* begin space */
+			/* begin printChar: */
+			putchar(' ');
+			printHex(fieldOop);
+			/* begin space */
+			/* begin printChar: */
+			putchar(' ');
+			printOopShort(fieldOop);
+			/* begin cr */
+			printf("\n");
+		}
+	}
+	if (((((usqInt) (longAt(oop))) >> 8) & 15) >= 12) {
+		startIP = (startIP * BytesPerWord) + 1;
+		/* begin lengthOf: */
+		header = longAt(oop);
+		/* begin lengthOf:baseHeader:format: */
+		if ((header & TypeMask) == HeaderTypeSizeAndClass) {
+			sz = (longAt(oop - (BytesPerWord * 2))) & LongSizeMask;
+		}
+		else {
+			sz = header & SizeMask;
+		}
+		sz -= header & Size4Bit;
+		if (((((usqInt) header) >> 8) & 15) <= 4) {
+			lastIndex = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
+			goto l1;
+		}
+		if (((((usqInt) header) >> 8) & 15) < 8) {
+			lastIndex = ((usqInt) (sz - BaseHeaderSize)) >> 2;
+			goto l1;
+		}
+		else {
+			lastIndex = (sz - BaseHeaderSize) - (((((usqInt) header) >> 8) & 15) & 3);
+			goto l1;
+		}
+	l1:	/* end lengthOf: */;
+		if ((lastIndex - startIP) > 100) {
+			lastIndex = startIP + 100;
+		}
+		bytecodesPerLine = 8;
+		for (index = startIP; index <= lastIndex; index += 1) {
+			byte = byteAt((oop + BaseHeaderSize) + (index - 1));
+			printf(" %02x/%-3d", byte,byte);
+			if ((((index - startIP) + 1) % bytecodesPerLine) == 0) {
+				/* begin cr */
+				printf("\n");
+			}
+		}
+		if (!((((lastIndex - startIP) + 1) % bytecodesPerLine) == 0)) {
+			/* begin cr */
+			printf("\n");
+		}
+	}
+	else {
+		if (startIP > 64) {
+			print("...");
+			/* begin cr */
+			printf("\n");
+		}
+	}
+}
+
+
 /*	This method implements a simple method lookup cache. If an entry for the
 	given selector and class is found in the cache, set the values of
 	'newMethod' and 'primitiveFunctionPointer' and return true. Otherwise,
@@ -22036,7 +22150,18 @@
 	return GIV(nilObj);
 }
 
+sqInt
+noAssertHeaderOf(sqInt methodPointer)
+{
+    sqInt methodHeader;
 
+	methodHeader = longAt((methodPointer + BaseHeaderSize) + (HeaderIndex << ShiftForWord));
+	return (isCogMethodReference(methodHeader)
+		? (((CogMethod *) methodHeader)->methodHeader)
+		: methodHeader);
+}
+
+
 /*	This code is called if the receiver responds primitively to at:Put:.
 	The cogit can implement at: & at:put: quickly in machine code, and needs a
 	backup that provides error codes. But it does not want the at cache so it
@@ -22121,7 +22246,47 @@
 	}
 }
 
+static sqInt
+noInlineTemporaryin(sqInt offset, char *theFP)
+{
+    sqInt frameNumArgs;
+    sqInt frameNumArgs1;
 
+	return ((((usqInt)(longAt(theFP + FoxMethod)))) < heapBase
+		? (offset < ((frameNumArgs = (mframeCogMethod(theFP)->cmNumArgs)))
+				? longAt((theFP + FoxCallerSavedIP) + ((frameNumArgs - offset) * BytesPerWord))
+				: longAt(((theFP + FoxMFReceiver) - BytesPerWord) + ((frameNumArgs - offset) * BytesPerWord)))
+		: (offset < ((frameNumArgs1 = byteAt((theFP + FoxIFrameFlags) + 1)))
+				? longAt((theFP + FoxCallerSavedIP) + ((frameNumArgs1 - offset) * BytesPerWord))
+				: longAt(((theFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - offset) * BytesPerWord))));
+}
+
+static void
+noInlineTemporaryinput(sqInt offset, char *theFP, sqInt valueOop)
+{
+    sqInt frameNumArgs;
+    sqInt frameNumArgs1;
+
+	/* begin temporary:in:put: */
+	VM_LABEL(0temporaryinput);
+	if ((((usqInt)(longAt(theFP + FoxMethod)))) < heapBase) {
+		/* begin mtemporary:in:put: */
+		longAtput((offset < ((frameNumArgs = (mframeCogMethod(theFP)->cmNumArgs)))
+			? (theFP + FoxCallerSavedIP) + ((frameNumArgs - offset) * BytesPerWord)
+			: ((theFP + FoxMFReceiver) - BytesPerWord) + ((frameNumArgs - offset) * BytesPerWord)), valueOop);
+	}
+	else {
+		/* begin itemporary:in:put: */
+		if (offset < ((frameNumArgs1 = byteAt((theFP + FoxIFrameFlags) + 1)))) {
+			longAtput((theFP + FoxCallerSavedIP) + ((frameNumArgs1 - offset) * BytesPerWord), valueOop);
+		}
+		else {
+			longAtput(((theFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - offset) * BytesPerWord), valueOop);
+		}
+	}
+}
+
+
 /*	Answer true if there are no marked contexts on thePage. */
 
 static sqInt
@@ -24459,7 +24624,7 @@
     sqInt methodHeader;
     sqInt newCopy;
     sqInt objHeader;
-    sqInt receiver;
+    sqInt rcvr;
     char *sp;
     sqInt sp1;
     char *spouseFP;
@@ -24467,29 +24632,29 @@
     sqInt valuePointer;
     sqInt valuePointer1;
 
-	receiver = longAt(GIV(stackPointer));
-	if ((receiver & 1)) {
-		newCopy = receiver;
+	rcvr = longAt(GIV(stackPointer));
+	if ((rcvr & 1)) {
+		newCopy = rcvr;
 	}
 	else {
-		objHeader = longAt(receiver);
+		objHeader = longAt(rcvr);
 		if (((((usqInt) objHeader) >> 12) & 31) == ClassMethodContextCompactIndex) {
 			/* begin cloneContext: */
 			VM_LABEL(0cloneContext);
-			cloned = eeInstantiateMethodContextByteSize(byteSizeOf(receiver));
+			cloned = eeInstantiateMethodContextByteSize(byteSizeOf(rcvr));
 			if (cloned != 0) {
 				for (i = 0; i <= StackPointerIndex; i += 1) {
 					/* begin storePointerUnchecked:ofObject:withValue: */
-					valuePointer = externalInstVarofContext(i, receiver);
+					valuePointer = externalInstVarofContext(i, rcvr);
 					longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), valuePointer);
 				}
 				for (i = MethodIndex; i <= ReceiverIndex; i += 1) {
-					longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), longAt((receiver + BaseHeaderSize) + (i << ShiftForWord)));
+					longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), longAt((rcvr + BaseHeaderSize) + (i << ShiftForWord)));
 				}
-				if ((((longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
-				 && (!(isWidowedContext(receiver)))) {
+				if ((((longAt((rcvr + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+				 && (!(isWidowedContext(rcvr)))) {
 					/* begin frameOfMarriedContext: */
-					value = longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord));
+					value = longAt((rcvr + BaseHeaderSize) + (SenderIndex << ShiftForWord));
 					/* begin withoutSmallIntegerTags: */
 					assert((value & 1));
 					spouseFP = pointerForOop(value - 1);
@@ -24507,16 +24672,16 @@
 					}
 				}
 				else {
-					sp1 = (fetchStackPointerOf(receiver)) - 1;
+					sp1 = (fetchStackPointerOf(rcvr)) - 1;
 					for (i = 0; i <= sp1; i += 1) {
-						longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), longAt((receiver + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord)));
+						longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), longAt((rcvr + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord)));
 					}
 				}
 			}
 			newCopy = cloned;
 		}
 		else {
-			newCopy = clone(receiver);
+			newCopy = clone(rcvr);
 		}
 		if (newCopy == 0) {
 			(GIV(primFailCode) = PrimErrNoMemory); return;
@@ -25449,6 +25614,10 @@
 	}
 }
 
+
+/*	Special version of primitiveAt for accessing contexts.
+	Written to be varargs for use from mirror primitives. */
+
 static void
 primitiveContextAt(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ -25476,11 +25645,7 @@
 
 	index = longAt(GIV(stackPointer));
 	if (!((index & 1))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+		(GIV(primFailCode) = PrimErrBadArgument); return;
 	}
 	index = (index >> 1);
 
@@ -25494,7 +25659,7 @@
 
 		value = stObjectat(aContext, index);
 		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), value);
+		longAtput((sp = GIV(stackPointer) + ((GIV(argumentCount) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp;
 		return;
 	}
@@ -25576,11 +25741,7 @@
 		stSize = (sp11 >> 1);
 	l5:	/* end stackPointerForMaybeMarriedContext: */;
 		if (!(((index >= 1) && (index <= stSize)))) {
-			/* begin primitiveFail */
-			if (!GIV(primFailCode)) {
-				GIV(primFailCode) = 1;
-			}
-			return;
+			(GIV(primFailCode) = PrimErrBadIndex); return;
 		}
 		/* begin subscript:with:format: */
 		if (fmt <= 4) {
@@ -25597,7 +25758,7 @@
 		}
 	l3:	/* end subscript:with:format: */;
 		/* begin pop:thenPush: */
-		longAtput((sp1 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), value);
+		longAtput((sp1 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp1;
 		return;
 	}
@@ -25607,11 +25768,7 @@
 	assert((value1 & 1));
 	spouseFP = pointerForOop(value1 - 1);
 	if (!(((index >= 1) && (index <= (stackPointerIndexForFrame(spouseFP)))))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+		(GIV(primFailCode) = PrimErrBadIndex); return;
 	}
 	value = ((((usqInt)(longAt(spouseFP + FoxMethod)))) < heapBase
 		? ((index - 1) < ((frameNumArgs = (mframeCogMethod(spouseFP)->cmNumArgs)))
@@ -25621,10 +25778,14 @@
 				? longAt((spouseFP + FoxCallerSavedIP) + ((frameNumArgs1 - (index - 1)) * BytesPerWord))
 				: longAt(((spouseFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - (index - 1)) * BytesPerWord))));
 	/* begin pop:thenPush: */
-	longAtput((sp2 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), value);
+	longAtput((sp2 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 	GIV(stackPointer) = sp2;
 }
 
+
+/*	Special version of primitiveAtPut for accessing contexts.
+	Written to be varargs for use from mirror primitives. */
+
 static sqInt
 primitiveContextAtPut(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ -25655,18 +25816,14 @@
 	index = longAt(GIV(stackPointer) + (1 * BytesPerWord));
 	aContext = longAt(GIV(stackPointer) + (2 * BytesPerWord));
 	if (!((index & 1))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return null;
+		return (GIV(primFailCode) = PrimErrBadArgument);
 	}
 	hdr = longAt(aContext);
 	index = (index >> 1);
 	if (!(((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
 		stObjectatput(aContext, index, value);
 		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + ((3 - 1) * BytesPerWord)), value);
+		longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp;
 		return null;
 	}
@@ -25748,11 +25905,7 @@
 		stSize = (sp11 >> 1);
 	l4:	/* end stackPointerForMaybeMarriedContext: */;
 		if (!(((index >= 1) && (index <= stSize)))) {
-			/* begin primitiveFail */
-			if (!GIV(primFailCode)) {
-				GIV(primFailCode) = 1;
-			}
-			return null;
+			return (GIV(primFailCode) = PrimErrBadIndex);
 		}
 		/* begin subscript:with:storing:format: */
 		VM_LABEL(0subscriptwithstoringformat);
@@ -25804,7 +25957,7 @@
 			}
 		}
 		/* begin pop:thenPush: */
-		longAtput((sp1 = GIV(stackPointer) + ((3 - 1) * BytesPerWord)), value);
+		longAtput((sp1 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp1;
 		return null;
 	}
@@ -25814,15 +25967,10 @@
 	assert((value1 & 1));
 	spouseFP = pointerForOop(value1 - 1);
 	if (!(((index >= 1) && (index <= (stackPointerIndexForFrame(spouseFP)))))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return null;
+		return (GIV(primFailCode) = PrimErrBadIndex);
 	}
 	/* begin temporary:in:put: */
-	VM_LABEL(0temporaryinput);
-	;
+	VM_LABEL(1temporaryinput);
 	if ((((usqInt)(longAt(spouseFP + FoxMethod)))) < heapBase) {
 		/* begin mtemporary:in:put: */
 		longAtput(((index - 1) < ((frameNumArgs = (mframeCogMethod(spouseFP)->cmNumArgs)))
@@ -25839,11 +25987,15 @@
 		}
 	}
 	/* begin pop:thenPush: */
-	longAtput((sp2 = GIV(stackPointer) + ((3 - 1) * BytesPerWord)), value);
+	longAtput((sp2 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 	GIV(stackPointer) = sp2;
 	return null;
 }
 
+
+/*	Special version of primitiveSize for accessing contexts.
+	Written to be varargs for use from mirror primitives. */
+
 static void
 primitiveContextSize(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ -25943,11 +26095,9 @@
 	else {
 		sz = totalLength - fixedFields;
 	}
-	if (!GIV(primFailCode)) {
-		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + ((1 - 1) * BytesPerWord)), ((sz << 1) | 1));
-		GIV(stackPointer) = sp;
-	}
+	/* begin pop:thenPush: */
+	longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), ((sz << 1) | 1));
+	GIV(stackPointer) = sp;
 }
 
 
@@ -34440,31 +34590,77 @@
 static void
 primitiveSize(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt ccIndex;
+    sqInt class;
+    sqInt classFormat;
+    sqInt fixedFields;
+    sqInt fmt;
+    sqInt hdr;
     sqInt rcvr;
     char *sp;
     sqInt sz;
+    sqInt totalLength;
 
 	rcvr = longAt(GIV(stackPointer));
-	if ((rcvr & 1)) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+	if (((rcvr & 1))
+	 || ((
+	/* Integers are not indexable */
+
+(hdr = longAt(rcvr)),
+	((fmt = (((usqInt) hdr) >> 8) & 15)) < 2))) {
+		(GIV(primFailCode) = PrimErrBadReceiver); return;
 	}
-	if (((((usqInt) (longAt(rcvr))) >> 8) & 15) < 2) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+	if ((fmt == 3)
+	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
+		primitiveContextSize(); return;
 	}
-	sz = stSizeOf(rcvr);
-	if (!GIV(primFailCode)) {
-		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), ((sz << 1) | 1));
-		GIV(stackPointer) = sp;
+	/* begin lengthOf:baseHeader:format: */
+	if ((hdr & TypeMask) == HeaderTypeSizeAndClass) {
+		sz = (longAt(rcvr - (BytesPerWord * 2))) & LongSizeMask;
 	}
+	else {
+		sz = hdr & SizeMask;
+	}
+	sz -= hdr & Size4Bit;
+	if (fmt <= 4) {
+		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
+		goto l1;
+	}
+	if (fmt < 8) {
+		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> 2;
+		goto l1;
+	}
+	else {
+		totalLength = (sz - BaseHeaderSize) - (fmt & 3);
+		goto l1;
+	}
+l1:	/* end lengthOf:baseHeader:format: */;
+	/* begin fixedFieldsOf:format:length: */
+	if ((fmt > 4)
+	 || (fmt == 2)) {
+		fixedFields = 0;
+		goto l2;
+	}
+	if (fmt < 2) {
+		fixedFields = totalLength;
+		goto l2;
+	}
+	/* begin fetchClassOfNonInt: */
+	if (((ccIndex = (((usqInt) (longAt(rcvr))) >> 12) & 31)) == 0) {
+		class = (longAt(rcvr - BaseHeaderSize)) & AllButTypeMask;
+		goto l3;
+	}
+	else {
+		class = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord));
+		goto l3;
+	}
+l3:	/* end fetchClassOfNonInt: */;
+	classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1;
+	fixedFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1;
+l2:	/* end fixedFieldsOf:format:length: */;
+	/* begin pop:thenPush: */
+	longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), (((totalLength - fixedFields) << 1) | 1));
+	GIV(stackPointer) = sp;
 }
 
 
@@ -38226,6 +38422,7 @@
 printMethodDictionaryOf(sqInt behavior)
 {
     sqInt index;
+    sqInt meth;
     sqInt methodArray;
     sqInt selector;
 
@@ -38235,9 +38432,15 @@
 	for (index = SelectorStart; index <= ((fetchWordLengthOf(longAt((behavior + BaseHeaderSize) + (MethodDictionaryIndex << ShiftForWord)))) - 1); index += 1) {
 		selector = longAt(((longAt((behavior + BaseHeaderSize) + (MethodDictionaryIndex << ShiftForWord))) + BaseHeaderSize) + (index << ShiftForWord));
 		if (selector != GIV(nilObj)) {
+			meth = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord));
 			printOopShort(selector);
 			print(" => ");
-			printOopShort(longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord)));
+			printOopShort(meth);
+			print(" (");
+			printHex(selector);
+			print(" => ");
+			printHex(meth);
+			putchar(')');
 			/* begin cr */
 			printf("\n");
 		}
@@ -38248,6 +38451,7 @@
 printMethodDictionary(sqInt dictionary)
 {
     sqInt index;
+    sqInt meth;
     sqInt methodArray;
     sqInt selector;
 
@@ -38255,9 +38459,15 @@
 	for (index = SelectorStart; index <= ((fetchWordLengthOf(dictionary)) - 1); index += 1) {
 		selector = longAt((dictionary + BaseHeaderSize) + (index << ShiftForWord));
 		if (selector != GIV(nilObj)) {
+			meth = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord));
 			printOopShort(selector);
 			print(" => ");
-			printOopShort(longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord)));
+			printOopShort(meth);
+			print(" (");
+			printHex(selector);
+			print(" => ");
+			printHex(meth);
+			putchar(')');
 			/* begin cr */
 			printf("\n");
 		}
@@ -42305,6 +42515,7 @@
     sqInt fixedFields;
     sqInt fmt;
     sqInt hdr;
+    sqInt sp;
     sqInt stSize;
     sqInt sz;
     sqInt totalLength;
@@ -42321,44 +42532,61 @@
 	sz -= hdr & Size4Bit;
 	if (fmt <= 4) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
-		goto l1;
+		goto l2;
 	}
 	if (fmt < 8) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> 2;
-		goto l1;
+		goto l2;
 	}
 	else {
 		totalLength = (sz - BaseHeaderSize) - (fmt & 3);
-		goto l1;
+		goto l2;
 	}
-l1:	/* end lengthOf:baseHeader:format: */;
+l2:	/* end lengthOf:baseHeader:format: */;
 	/* begin fixedFieldsOf:format:length: */
 	if ((fmt > 4)
 	 || (fmt == 2)) {
 		fixedFields = 0;
-		goto l2;
+		goto l3;
 	}
 	if (fmt < 2) {
 		fixedFields = totalLength;
-		goto l2;
+		goto l3;
 	}
 	/* begin fetchClassOfNonInt: */
 	if (((ccIndex = (((usqInt) (longAt(array))) >> 12) & 31)) == 0) {
 		class = (longAt(array - BaseHeaderSize)) & AllButTypeMask;
-		goto l3;
+		goto l4;
 	}
 	else {
 		class = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord));
-		goto l3;
+		goto l4;
 	}
-l3:	/* end fetchClassOfNonInt: */;
+l4:	/* end fetchClassOfNonInt: */;
 	classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1;
 	fixedFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1;
-l2:	/* end fixedFieldsOf:format:length: */;
-	if (fmt == 3) {
-		assert(!(isContextHeader(hdr)));
+l3:	/* end fixedFieldsOf:format:length: */;
+	if ((fmt == 3)
+	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
+		/* begin fetchStackPointerOf: */
+		sp = longAt((array + BaseHeaderSize) + (StackPointerIndex << ShiftForWord));
+		if (!((sp & 1))) {
+			stSize = 0;
+			goto l1;
+		}
+		assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(array)));
+		stSize = (sp >> 1);
+	l1:	/* end fetchStackPointerOf: */;
+		if (((((usqInt) index)) >= (((usqInt) 1)))
+		 && (((((usqInt) index)) <= (((usqInt) stSize)))
+		 && ((((longAt((array + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+		 && (!(isWidowedContext(array)))))) {
+			return noInlineTemporaryin(index - 1, frameOfMarriedContext(array));
+		}
 	}
-	stSize = totalLength - fixedFields;
+	else {
+		stSize = totalLength - fixedFields;
+	}
 	if (((((usqInt) index)) >= (((usqInt) 1)))
 	 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 		/* begin subscript:with:format: */
@@ -42390,6 +42618,7 @@
     sqInt fixedFields;
     sqInt fmt;
     sqInt hdr;
+    sqInt sp;
     sqInt stSize;
     sqInt sz;
     sqInt totalLength;
@@ -42407,44 +42636,62 @@
 	sz -= hdr & Size4Bit;
 	if (fmt <= 4) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
-		goto l1;
+		goto l2;
 	}
 	if (fmt < 8) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> 2;
-		goto l1;
+		goto l2;
 	}
 	else {
 		totalLength = (sz - BaseHeaderSize) - (fmt & 3);
-		goto l1;
+		goto l2;
 	}
-l1:	/* end lengthOf:baseHeader:format: */;
+l2:	/* end lengthOf:baseHeader:format: */;
 	/* begin fixedFieldsOf:format:length: */
 	if ((fmt > 4)
 	 || (fmt == 2)) {
 		fixedFields = 0;
-		goto l2;
+		goto l3;
 	}
 	if (fmt < 2) {
 		fixedFields = totalLength;
-		goto l2;
+		goto l3;
 	}
 	/* begin fetchClassOfNonInt: */
 	if (((ccIndex = (((usqInt) (longAt(array))) >> 12) & 31)) == 0) {
 		class = (longAt(array - BaseHeaderSize)) & AllButTypeMask;
-		goto l3;
+		goto l4;
 	}
 	else {
 		class = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord));
-		goto l3;
+		goto l4;
 	}
-l3:	/* end fetchClassOfNonInt: */;
+l4:	/* end fetchClassOfNonInt: */;
 	classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1;
 	fixedFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1;
-l2:	/* end fixedFieldsOf:format:length: */;
-	if (fmt == 3) {
-		assert(!(isContextHeader(hdr)));
+l3:	/* end fixedFieldsOf:format:length: */;
+	if ((fmt == 3)
+	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
+		/* begin fetchStackPointerOf: */
+		sp = longAt((array + BaseHeaderSize) + (StackPointerIndex << ShiftForWord));
+		if (!((sp & 1))) {
+			stSize = 0;
+			goto l1;
+		}
+		assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(array)));
+		stSize = (sp >> 1);
+	l1:	/* end fetchStackPointerOf: */;
+		if (((((usqInt) index)) >= (((usqInt) 1)))
+		 && (((((usqInt) index)) <= (((usqInt) stSize)))
+		 && ((((longAt((array + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+		 && (!(isWidowedContext(array)))))) {
+			noInlineTemporaryinput(index - 1, frameOfMarriedContext(array), value);
+			return;
+		}
 	}
-	stSize = totalLength - fixedFields;
+	else {
+		stSize = totalLength - fixedFields;
+	}
 	if (((((usqInt) index)) >= (((usqInt) 1)))
 	 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 		/* begin subscript:with:storing:format: */

Modified: branches/Cog/src/vm/cointerp.h
===================================================================
--- branches/Cog/src/vm/cointerp.h	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/src/vm/cointerp.h	2011-08-19 21:33:12 UTC (rev 2488)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
  */
 
 
@@ -45,7 +45,6 @@
 void checkAssertsEnabledInCoInterpreter(void);
 sqInt checkedLongAt(sqInt byteAddress);
 sqInt classArray(void);
-sqInt classFieldOffset(void);
 sqInt classFloat(void);
 sqInt classFloatCompactIndex(void);
 sqInt classHeader(sqInt oop);
@@ -53,8 +52,6 @@
 void clearTraceLog(void);
 CogMethod * cogMethodOf(sqInt aMethodOop);
 sqInt compactClassAt(sqInt ccIndex);
-sqInt compactClassFieldLSB(void);
-sqInt compactClassFieldWidth(void);
 sqInt compactClassIndexOfHeader(sqInt header);
 sqInt compactClassIndexOf(sqInt oop);
 sqInt compactClassTable(void);
@@ -103,6 +100,7 @@
 sqInt lengthOf(sqInt oop);
 sqInt literalCountOfHeader(sqInt headerPointer);
 sqInt literalofMethod(sqInt offset, sqInt methodPointer);
+void longPrintOop(sqInt oop);
 sqInt lookupreceiver(sqInt selector, sqInt rcvr);
 void markActiveMethodsAndReferents(void);
 void markAndTrace(sqInt oop);
@@ -119,6 +117,7 @@
 usqInt newMethodAddress(void);
 usqInt nextProfileTickAddress(void);
 sqInt nilObject(void);
+sqInt noAssertHeaderOf(sqInt methodPointer);
 sqInt nullHeaderForMachineCodeMethod(void);
 sqInt objectAfter(sqInt oop);
 sqInt objectBefore(sqInt address);
@@ -210,6 +209,9 @@
 
 
 /*** Macros ***/
+#define classFieldOffset() (0 - BaseHeaderSize)
+#define compactClassFieldLSB() 12
+#define compactClassFieldWidth() 5
 #define compilationBreakpoint(sel, len) do { \
 	if ((len) == breakSelectorLength \
 	 && !strncmp((char *)((sel) + BaseHeaderSize), breakSelector, breakSelectorLength)) { \
@@ -217,4 +219,6 @@
 		compilationBreakpointFor(sel); \
 	} \
 } while (0)
+#define instFormatFieldLSB() 8
+#define instFormatFieldWidth() 4
 

Modified: branches/Cog/src/vm/cointerpmt.c
===================================================================
--- branches/Cog/src/vm/cointerpmt.c	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/src/vm/cointerpmt.c	2011-08-19 21:33:12 UTC (rev 2488)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
    from
-	CoInterpreterMT VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CoInterpreterMT VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
  */
-static char __buildInfo[] = "CoInterpreterMT VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreterMT VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -456,7 +456,6 @@
 sqInt classExternalFunction(void);
 sqInt classExternalLibrary(void);
 sqInt classExternalStructure(void);
-sqInt classFieldOffset(void);
 sqInt classFloat(void);
 sqInt classFloatCompactIndex(void);
 sqInt classHeader(sqInt oop);
@@ -477,8 +476,6 @@
 static void commonAtPut(sqInt stringy);
 static void commonAt(sqInt stringy);
 sqInt compactClassAt(sqInt ccIndex);
-sqInt compactClassFieldLSB(void);
-sqInt compactClassFieldWidth(void);
 sqInt compactClassIndexOfHeader(sqInt header);
 sqInt compactClassIndexOf(sqInt oop);
 sqInt compactClassTable(void);
@@ -627,7 +624,7 @@
 static void initializeObjectMemory(sqInt bytesToShift);
 static void initializeStacknumSlotspageSizestackLimitOffsetstackPageHeadroom(char *theStackPages, sqInt stackSlots, sqInt slotsPerPage, sqInt stackLimitOffsetBytes, sqInt stackPageHeadroomBytes);
 static sqInt initStackPagesAndInterpret(void);
-static void installinAtCacheatstring(sqInt rcvr, sqInt *cache, sqInt atIx, sqInt stringy);
+static sqInt installinAtCacheatstring(sqInt rcvr, sqInt *cache, sqInt atIx, sqInt stringy);
 sqInt instanceSizeOf(sqInt classObj);
 sqInt instantiateClassindexableSize(sqInt classPointer, sqInt size);
 usqInt instructionPointerAddress(void);
@@ -646,6 +643,7 @@
 sqInt isCogMethodReference(sqInt methodHeader);
 sqInt isCompiledMethod(sqInt oop);
 static sqInt isContextHeader(sqInt aHeader);
+static sqInt isContextNonInt(sqInt oop);
 static sqInt isContext(sqInt oop);
 sqInt isFloatObject(sqInt oop);
 static sqInt isFree(StackPage * self_in_isFree);
@@ -690,6 +688,7 @@
 sqInt loadBitBltFrom(sqInt bb);
 static sqInt loadImageSegmentFromoutPointers(sqInt segmentWordArray, sqInt outPointerArray);
 void loadInitialContext(void);
+void longPrintOop(sqInt oop);
 static sqInt lookupInMethodCacheSelclass(sqInt selector, sqInt class);
 static sqInt lookupMethodInClass(sqInt class);
 static sqInt lookupMethodInDictionary(sqInt dictionary);
@@ -743,8 +742,11 @@
 static StackPage * newStackPage(void);
 usqInt nextProfileTickAddress(void);
 sqInt nilObject(void);
+sqInt noAssertHeaderOf(sqInt methodPointer);
 static void noAtCacheCommonAtPut(sqInt stringy);
 static void noAtCacheCommonAt(sqInt stringy);
+static sqInt noInlineTemporaryin(sqInt offset, char *theFP);
+static void noInlineTemporaryinput(sqInt offset, char *theFP, sqInt valueOop);
 static sqInt noMarkedContextsOnPage(StackPage *thePage);
 static sqInt nonWeakFieldsOf(sqInt oop);
 sqInt nullHeaderForMachineCodeMethod(void);
@@ -1219,8 +1221,8 @@
 _iss StackPage * stackPage;
 _iss sqInt nilObj;
 _iss usqInt instructionPointer;
+_iss sqInt argumentCount;
 _iss usqInt method;
-_iss sqInt argumentCount;
 _iss usqInt freeStart;
 _iss usqInt newMethod;
 _iss usqInt youngStart;
@@ -1980,13 +1982,16 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void);
-const char *interpreterVersion = "Croquet Closure Cog MT VM [CoInterpreterMT VMMaker.oscog-eem.117]";
+const char *interpreterVersion = "Croquet Closure Cog MT VM [CoInterpreterMT VMMaker.oscog-eem.119]";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 sqInt willNotThreadWarnCount;
 
 
 /*** Macros ***/
+#define classFieldOffset() (0 - BaseHeaderSize)
+#define compactClassFieldLSB() 12
+#define compactClassFieldWidth() 5
 #define compilationBreakpoint(sel, len) do { \
 	if ((len) == breakSelectorLength \
 	 && !strncmp((char *)((sel) + BaseHeaderSize), breakSelector, breakSelectorLength)) { \
@@ -2005,6 +2010,8 @@
 #define getDesiredCogCodeSize() integerObjectOf(desiredCogCodeSize)
 #define getMaxWaitingPriority() GIV(maxWaitingPriority)
 #define getNumThreads() GIV(numThreads)
+#define instFormatFieldLSB() 8
+#define instFormatFieldWidth() 4
 #define memory() memory
 #define mostRecentlyUsedPage() GIV(mostRecentlyUsedPage)
 #define nextOpenPIC methodObject
@@ -2015,7 +2022,6 @@
 #define remapBufferCount() GIV(remapBufferCount)
 #define setDesiredCogCodeSize(dccs) (desiredCogCodeSize = (dccs))
 #define stackPageAtpages(index,pages) ((pages) + (index))
-#define typeEtAlWord(cm) (((long *)(cm))[1])
 #define validate() 0
 #define youngStart() GIV(youngStart)
 
@@ -7786,36 +7792,39 @@
 							}
 						}
 					}
-					/* begin commonVariable:at:cacheIndex: */
-					VM_LABEL(0commonVariableatcacheIndex);
-					stSize = GIV(atCache)[atIx + AtCacheSize];
-					if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
-					 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
-						fmt = GIV(atCache)[atIx + AtCacheFmt];
-						if (fmt <= 4) {
-							fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
-							result = longAt((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord));
-							goto l73;
-						}
-						if (fmt < 8) {
+					if (!GIV(primFailCode)) {
+						/* begin commonVariable:at:cacheIndex: */
+						VM_LABEL(0commonVariableatcacheIndex);
+						stSize = GIV(atCache)[atIx + AtCacheSize];
+						if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
+						 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
+							fmt = GIV(atCache)[atIx + AtCacheFmt];
+							if (fmt <= 4) {
+								assert(!(isContextNonInt(rcvr)));
+								fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
+								result = longAt((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord));
+								goto l73;
+							}
+							if (fmt < 8) {
 
-							/* Bitmap */
+								/* Bitmap */
 
-							result1 = long32At((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2));
-							result = positive32BitIntegerFor(result1);
-							goto l73;
+								result1 = long32At((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2));
+								result = positive32BitIntegerFor(result1);
+								goto l73;
+							}
+							if (fmt >= 16) {
+								result = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CharacterTable << ShiftForWord))) + BaseHeaderSize) + ((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << ShiftForWord));
+								goto l73;
+							}
+							else {
+								result = (((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << 1) | 1);
+								goto l73;
+							}
 						}
-						if (fmt >= 16) {
-							result = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CharacterTable << ShiftForWord))) + BaseHeaderSize) + ((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << ShiftForWord));
-							goto l73;
-						}
-						else {
-							result = (((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << 1) | 1);
-							goto l73;
-						}
+						result = (GIV(primFailCode) = PrimErrBadIndex);
+					l73:	/* end commonVariable:at:cacheIndex: */;
 					}
-					result = (GIV(primFailCode) = PrimErrBadIndex);
-				l73:	/* end commonVariable:at:cacheIndex: */;
 					if (!GIV(primFailCode)) {
 						/* begin fetchNextBytecode */
 						currentBytecode = byteAtPointer(++localIP);
@@ -7823,6 +7832,8 @@
 						longAtPointerput((localSP += (2 - 1) * BytesPerWord), result);
 						goto l71;
 					}
+					/* begin initPrimCall */
+					GIV(primFailCode) = 0;
 				}
 				GIV(messageSelector) = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SpecialSelectors << ShiftForWord))) + BaseHeaderSize) + ((16 * 2) << ShiftForWord));
 				GIV(argumentCount) = 1;
@@ -7885,59 +7896,62 @@
 							}
 						}
 					}
-					/* begin commonVariable:at:put:cacheIndex: */
-					VM_LABEL(0commonVariableatputcacheIndex);
-					stSize = GIV(atCache)[atIx + AtCacheSize];
-					if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
-					 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
-						fmt = GIV(atCache)[atIx + AtCacheFmt];
-						if (fmt <= 4) {
-							fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
-							/* begin storePointer:ofObject:withValue: */
-							if ((((usqInt) rcvr)) < (((usqInt) GIV(youngStart)))) {
-								possibleRootStoreIntovalue(rcvr, value);
+					if (!GIV(primFailCode)) {
+						/* begin commonVariable:at:put:cacheIndex: */
+						VM_LABEL(0commonVariableatputcacheIndex);
+						stSize = GIV(atCache)[atIx + AtCacheSize];
+						if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
+						 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
+							fmt = GIV(atCache)[atIx + AtCacheFmt];
+							if (fmt <= 4) {
+								assert(!(isContextNonInt(rcvr)));
+								fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
+								/* begin storePointer:ofObject:withValue: */
+								if ((((usqInt) rcvr)) < (((usqInt) GIV(youngStart)))) {
+									possibleRootStoreIntovalue(rcvr, value);
+								}
+								longAtput((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord), value);
+								goto l75;
 							}
-							longAtput((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord), value);
-							goto l75;
-						}
-						if (fmt < 8) {
+							if (fmt < 8) {
 
-							/* Bitmap */
+								/* Bitmap */
 
-							valToPut = positive32BitValueOf(value);
-							if (!GIV(primFailCode)) {
-								long32Atput((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2), valToPut);
+								valToPut = positive32BitValueOf(value);
+								if (!GIV(primFailCode)) {
+									long32Atput((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2), valToPut);
+								}
+								goto l75;
 							}
-							goto l75;
-						}
-						if (fmt >= 16) {
+							if (fmt >= 16) {
 
-							/* Note fmt >= 16 is an artificial flag for strings */
+								/* Note fmt >= 16 is an artificial flag for strings */
 
-							valToPut = asciiOfCharacter(value);
-							if (!(!GIV(primFailCode))) {
-								goto l75;
+								valToPut = asciiOfCharacter(value);
+								if (!(!GIV(primFailCode))) {
+									goto l75;
+								}
 							}
-						}
-						else {
-							valToPut = value;
-						}
-						if ((valToPut & 1)) {
-							valToPut = (valToPut >> 1);
-							if (!((valToPut >= 0)
-								 && (valToPut <= 255))) {
-								/* begin primitiveFail */
-								if (!GIV(primFailCode)) {
-									GIV(primFailCode) = 1;
+							else {
+								valToPut = value;
+							}
+							if ((valToPut & 1)) {
+								valToPut = (valToPut >> 1);
+								if (!((valToPut >= 0)
+									 && (valToPut <= 255))) {
+									/* begin primitiveFail */
+									if (!GIV(primFailCode)) {
+										GIV(primFailCode) = 1;
+									}
+									goto l75;
 								}
+								byteAtput((rcvr + BaseHeaderSize) + (((index >> 1)) - 1), valToPut);
 								goto l75;
 							}
-							byteAtput((rcvr + BaseHeaderSize) + (((index >> 1)) - 1), valToPut);
-							goto l75;
 						}
+						GIV(primFailCode) = PrimErrBadIndex;
+					l75:	/* end commonVariable:at:put:cacheIndex: */;
 					}
-					GIV(primFailCode) = PrimErrBadIndex;
-				l75:	/* end commonVariable:at:put:cacheIndex: */;
 					if (!GIV(primFailCode)) {
 						/* begin fetchNextBytecode */
 						currentBytecode = byteAtPointer(++localIP);
@@ -7945,6 +7959,8 @@
 						longAtPointerput((localSP += (3 - 1) * BytesPerWord), value);
 						goto l74;
 					}
+					/* begin initPrimCall */
+					GIV(primFailCode) = 0;
 				}
 				GIV(messageSelector) = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SpecialSelectors << ShiftForWord))) + BaseHeaderSize) + ((17 * 2) << ShiftForWord));
 				GIV(argumentCount) = 2;
@@ -11724,7 +11740,7 @@
 				 || ((heapMapAtWord(pointerForOop(fieldOop))) == 0)) {
 					print("object leak in ");
 					printHex(obj);
-					print(" class ");
+					print(" class = ");
 					printHex(fieldOop);
 					/* begin cr */
 					printf("\n");
@@ -11791,6 +11807,8 @@
 								printHex(obj);
 								print(" @ ");
 								printNum(fi);
+								print(" = ");
+								printHex(fieldOop);
 								/* begin cr */
 								printf("\n");
 								ok = 0;
@@ -12326,12 +12344,6 @@
 }
 
 sqInt
-classFieldOffset(void)
-{
-	return 0 - BaseHeaderSize;
-}
-
-sqInt
 classFloat(void)
 {
 	return longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassFloat << ShiftForWord));
@@ -12681,7 +12693,12 @@
 
 		atIx = (rcvr & AtCacheMask) + AtPutBase;
 		if (!((GIV(atCache)[atIx + AtCacheOop]) == rcvr)) {
-			installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy);
+			if (!(installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy))) {
+				assert(isContextNonInt(rcvr));
+				/* begin initPrimCall */
+				GIV(primFailCode) = 0;
+				primitiveContextAtPut(); return;
+			}
 		}
 		if (!GIV(primFailCode)) {
 			/* begin commonVariable:at:put:cacheIndex: */
@@ -12691,6 +12708,7 @@
 			 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 				fmt = GIV(atCache)[atIx + AtCacheFmt];
 				if (fmt <= 4) {
+					assert(!(isContextNonInt(rcvr)));
 					fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
 					/* begin storePointer:ofObject:withValue: */
 					if ((((usqInt) rcvr)) < (((usqInt) GIV(youngStart)))) {
@@ -12808,7 +12826,12 @@
 
 		atIx = rcvr & AtCacheMask;
 		if (!((GIV(atCache)[atIx + AtCacheOop]) == rcvr)) {
-			installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy);
+			if (!(installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy))) {
+				assert(isContextNonInt(rcvr));
+				/* begin initPrimCall */
+				GIV(primFailCode) = 0;
+				primitiveContextAt(); return;
+			}
 		}
 		if (!GIV(primFailCode)) {
 			/* begin commonVariable:at:cacheIndex: */
@@ -12818,6 +12841,7 @@
 			 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 				fmt = GIV(atCache)[atIx + AtCacheFmt];
 				if (fmt <= 4) {
+					assert(!(isContextNonInt(rcvr)));
 					fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
 					result = longAt((rcvr + BaseHeaderSize) + (((index + fixedFields) - 1) << ShiftForWord));
 					goto l1;
@@ -12879,18 +12903,6 @@
 }
 
 sqInt
-compactClassFieldLSB(void)
-{
-	return 12;
-}
-
-sqInt
-compactClassFieldWidth(void)
-{
-	return 5;
-}
-
-sqInt
 compactClassIndexOfHeader(sqInt header)
 {
 	return (((usqInt) header) >> 12) & 31;
@@ -18672,6 +18684,7 @@
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt activeContext;
     sqInt activeProc;
+    sqInt activeProc1;
     sqInt aMethodObj;
     StackPage *newPage;
     sqInt stackPageBytes;
@@ -18692,8 +18705,8 @@
 		clearLeakMapAndMapAccessibleObjects();
 		assert(checkHeapIntegrity());
 	}
-	activeProc = longAt(((longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SchedulerAssociation << ShiftForWord))) + BaseHeaderSize) + (ValueIndex << ShiftForWord))) + BaseHeaderSize) + (ActiveProcessIndex << ShiftForWord));
-	activeContext = longAt((activeProc + BaseHeaderSize) + (SuspendedContextIndex << ShiftForWord));
+	activeProc1 = longAt(((longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SchedulerAssociation << ShiftForWord))) + BaseHeaderSize) + (ValueIndex << ShiftForWord))) + BaseHeaderSize) + (ActiveProcessIndex << ShiftForWord));
+	activeContext = longAt((activeProc1 + BaseHeaderSize) + (SuspendedContextIndex << ShiftForWord));
 	/* begin marryContextInNewStackPageAndInitializeInterpreterRegisters: */
 	VM_LABEL(0marryContextInNewStackPageAndInitializeInterpreterRegisters);
 	assert(GIV(stackPage) == 0);
@@ -18716,6 +18729,7 @@
 	top = longAt(GIV(stackPointer));
 	GIV(stackPointer) += BytesPerWord;
 	GIV(instructionPointer) = ((sqInt) top);
+	activeProc = longAt(((longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SchedulerAssociation << ShiftForWord))) + BaseHeaderSize) + (ValueIndex << ShiftForWord))) + BaseHeaderSize) + (ActiveProcessIndex << ShiftForWord));
 	assert((ownerIndexOfProcess(activeProc)) == 0);
 	GIV(activeProcessAffined) = (ownerIndexOfThreadId((GIV(processHasThreadId)
 	? longAt((activeProc + BaseHeaderSize) + (ThreadIdIndex << ShiftForWord))
@@ -18726,10 +18740,12 @@
 }
 
 
-/*	Install the oop of this object in the given cache (at or atPut), along
-	with its size, format and fixedSize */
+/*	Attempt to install the oop of this object in the given cache (at or
+	atPut), along with its size, format and fixedSize. Answer if this was
+	successful. 
+ */
 
-static void
+static sqInt
 installinAtCacheatstring(sqInt rcvr, sqInt *cache, sqInt atIx, sqInt stringy)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt ccIndex;
@@ -18745,11 +18761,8 @@
 	fmt = (((usqInt) hdr) >> 8) & 15;
 	if ((fmt == 3)
 	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+		GIV(primFailCode) = PrimErrBadReceiver;
+		return 0;
 	}
 	/* begin lengthOf:baseHeader:format: */
 	if ((hdr & TypeMask) == HeaderTypeSizeAndClass) {
@@ -18801,6 +18814,7 @@
 	: fmt));
 	cache[atIx + AtCacheFixedFields] = fixedFields;
 	cache[atIx + AtCacheSize] = (totalLength - fixedFields);
+	return 1;
 }
 
 
@@ -19321,6 +19335,12 @@
 }
 
 static sqInt
+isContextNonInt(sqInt oop)
+{
+	return ((((usqInt) (longAt(oop))) >> 12) & 31) == ClassMethodContextCompactIndex;
+}
+
+static sqInt
 isContext(sqInt oop)
 {
 	return ((oop & 1) == 0)
@@ -20308,6 +20328,7 @@
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt activeContext;
     sqInt activeProc;
+    sqInt activeProc1;
     sqInt aMethodObj;
     StackPage *newPage;
     char *theFP;
@@ -20317,8 +20338,8 @@
 		clearLeakMapAndMapAccessibleObjects();
 		assert(checkHeapIntegrity());
 	}
-	activeProc = longAt(((longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SchedulerAssociation << ShiftForWord))) + BaseHeaderSize) + (ValueIndex << ShiftForWord))) + BaseHeaderSize) + (ActiveProcessIndex << ShiftForWord));
-	activeContext = longAt((activeProc + BaseHeaderSize) + (SuspendedContextIndex << ShiftForWord));
+	activeProc1 = longAt(((longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SchedulerAssociation << ShiftForWord))) + BaseHeaderSize) + (ValueIndex << ShiftForWord))) + BaseHeaderSize) + (ActiveProcessIndex << ShiftForWord));
+	activeContext = longAt((activeProc1 + BaseHeaderSize) + (SuspendedContextIndex << ShiftForWord));
 	/* begin marryContextInNewStackPageAndInitializeInterpreterRegisters: */
 	VM_LABEL(1marryContextInNewStackPageAndInitializeInterpreterRegisters);
 	assert(GIV(stackPage) == 0);
@@ -20341,13 +20362,110 @@
 	top = longAt(GIV(stackPointer));
 	GIV(stackPointer) += BytesPerWord;
 	GIV(instructionPointer) = ((sqInt) top);
+	activeProc = longAt(((longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SchedulerAssociation << ShiftForWord))) + BaseHeaderSize) + (ValueIndex << ShiftForWord))) + BaseHeaderSize) + (ActiveProcessIndex << ShiftForWord));
 	assert((ownerIndexOfProcess(activeProc)) == 0);
 	GIV(activeProcessAffined) = (ownerIndexOfThreadId((GIV(processHasThreadId)
 	? longAt((activeProc + BaseHeaderSize) + (ThreadIdIndex << ShiftForWord))
 	: GIV(nilObj)))) != 0;
 }
 
+void
+longPrintOop(sqInt oop)
+{
+    sqInt byte;
+    sqInt bytecodesPerLine;
+    sqInt fieldOop;
+    sqInt fmt;
+    sqInt header;
+    sqInt index;
+    sqInt lastIndex;
+    sqInt startIP;
+    sqInt sz;
 
+	if (((oop & 1))
+	 || ((!(((oop >= heapBase) && (oop <= GIV(freeStart)))))
+	 || (((oop & (BytesPerWord - 1)) != 0)
+	 || ((((longAt(oop)) & TypeMask) == HeaderTypeFree)
+	 || (((((fmt = (((usqInt) (longAt(oop))) >> 8) & 15)) >= 5) && (((fmt = (((usqInt) (longAt(oop))) >> 8) & 15)) <= 11))))))) {
+		printOop(oop); return;
+	}
+	printHex(oop);
+	print(": a(n) ");
+	printNameOfClasscount(fetchClassOfNonInt(oop), 5);
+	if (fmt > 4) {
+		print(" nbytes ");
+		printNum(byteSizeOf(oop));
+	}
+	/* begin cr */
+	printf("\n");
+	lastIndex = ((64 < ((startIP = ((sqInt) (lastPointerOf(oop)) >> 2)))) ? 64 : ((startIP = ((sqInt) (lastPointerOf(oop)) >> 2))));
+	if (lastIndex > 0) {
+		for (index = 1; index <= lastIndex; index += 1) {
+			fieldOop = longAt((oop + BaseHeaderSize) + ((index - 1) << ShiftForWord));
+			/* begin space */
+			/* begin printChar: */
+			putchar(' ');
+			printHex(fieldOop);
+			/* begin space */
+			/* begin printChar: */
+			putchar(' ');
+			printOopShort(fieldOop);
+			/* begin cr */
+			printf("\n");
+		}
+	}
+	if (((((usqInt) (longAt(oop))) >> 8) & 15) >= 12) {
+		startIP = (startIP * BytesPerWord) + 1;
+		/* begin lengthOf: */
+		header = longAt(oop);
+		/* begin lengthOf:baseHeader:format: */
+		if ((header & TypeMask) == HeaderTypeSizeAndClass) {
+			sz = (longAt(oop - (BytesPerWord * 2))) & LongSizeMask;
+		}
+		else {
+			sz = header & SizeMask;
+		}
+		sz -= header & Size4Bit;
+		if (((((usqInt) header) >> 8) & 15) <= 4) {
+			lastIndex = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
+			goto l1;
+		}
+		if (((((usqInt) header) >> 8) & 15) < 8) {
+			lastIndex = ((usqInt) (sz - BaseHeaderSize)) >> 2;
+			goto l1;
+		}
+		else {
+			lastIndex = (sz - BaseHeaderSize) - (((((usqInt) header) >> 8) & 15) & 3);
+			goto l1;
+		}
+	l1:	/* end lengthOf: */;
+		if ((lastIndex - startIP) > 100) {
+			lastIndex = startIP + 100;
+		}
+		bytecodesPerLine = 8;
+		for (index = startIP; index <= lastIndex; index += 1) {
+			byte = byteAt((oop + BaseHeaderSize) + (index - 1));
+			printf(" %02x/%-3d", byte,byte);
+			if ((((index - startIP) + 1) % bytecodesPerLine) == 0) {
+				/* begin cr */
+				printf("\n");
+			}
+		}
+		if (!((((lastIndex - startIP) + 1) % bytecodesPerLine) == 0)) {
+			/* begin cr */
+			printf("\n");
+		}
+	}
+	else {
+		if (startIP > 64) {
+			print("...");
+			/* begin cr */
+			printf("\n");
+		}
+	}
+}
+
+
 /*	This method implements a simple method lookup cache. If an entry for the
 	given selector and class is found in the cache, set the values of
 	'newMethod' and 'primitiveFunctionPointer' and return true. Otherwise,
@@ -22793,7 +22911,18 @@
 	return GIV(nilObj);
 }
 
+sqInt
+noAssertHeaderOf(sqInt methodPointer)
+{
+    sqInt methodHeader;
 
+	methodHeader = longAt((methodPointer + BaseHeaderSize) + (HeaderIndex << ShiftForWord));
+	return (isCogMethodReference(methodHeader)
+		? (((CogMethod *) methodHeader)->methodHeader)
+		: methodHeader);
+}
+
+
 /*	This code is called if the receiver responds primitively to at:Put:.
 	The cogit can implement at: & at:put: quickly in machine code, and needs a
 	backup that provides error codes. But it does not want the at cache so it
@@ -22878,7 +23007,47 @@
 	}
 }
 
+static sqInt
+noInlineTemporaryin(sqInt offset, char *theFP)
+{
+    sqInt frameNumArgs;
+    sqInt frameNumArgs1;
 
+	return ((((usqInt)(longAt(theFP + FoxMethod)))) < heapBase
+		? (offset < ((frameNumArgs = (mframeCogMethod(theFP)->cmNumArgs)))
+				? longAt((theFP + FoxCallerSavedIP) + ((frameNumArgs - offset) * BytesPerWord))
+				: longAt(((theFP + FoxMFReceiver) - BytesPerWord) + ((frameNumArgs - offset) * BytesPerWord)))
+		: (offset < ((frameNumArgs1 = byteAt((theFP + FoxIFrameFlags) + 1)))
+				? longAt((theFP + FoxCallerSavedIP) + ((frameNumArgs1 - offset) * BytesPerWord))
+				: longAt(((theFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - offset) * BytesPerWord))));
+}
+
+static void
+noInlineTemporaryinput(sqInt offset, char *theFP, sqInt valueOop)
+{
+    sqInt frameNumArgs;
+    sqInt frameNumArgs1;
+
+	/* begin temporary:in:put: */
+	VM_LABEL(0temporaryinput);
+	if ((((usqInt)(longAt(theFP + FoxMethod)))) < heapBase) {
+		/* begin mtemporary:in:put: */
+		longAtput((offset < ((frameNumArgs = (mframeCogMethod(theFP)->cmNumArgs)))
+			? (theFP + FoxCallerSavedIP) + ((frameNumArgs - offset) * BytesPerWord)
+			: ((theFP + FoxMFReceiver) - BytesPerWord) + ((frameNumArgs - offset) * BytesPerWord)), valueOop);
+	}
+	else {
+		/* begin itemporary:in:put: */
+		if (offset < ((frameNumArgs1 = byteAt((theFP + FoxIFrameFlags) + 1)))) {
+			longAtput((theFP + FoxCallerSavedIP) + ((frameNumArgs1 - offset) * BytesPerWord), valueOop);
+		}
+		else {
+			longAtput(((theFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - offset) * BytesPerWord), valueOop);
+		}
+	}
+}
+
+
 /*	Answer true if there are no marked contexts on thePage. */
 
 static sqInt
@@ -25664,7 +25833,7 @@
     sqInt methodHeader;
     sqInt newCopy;
     sqInt objHeader;
-    sqInt receiver;
+    sqInt rcvr;
     char *sp;
     sqInt sp1;
     char *spouseFP;
@@ -25672,29 +25841,29 @@
     sqInt valuePointer;
     sqInt valuePointer1;
 
-	receiver = longAt(GIV(stackPointer));
-	if ((receiver & 1)) {
-		newCopy = receiver;
+	rcvr = longAt(GIV(stackPointer));
+	if ((rcvr & 1)) {
+		newCopy = rcvr;
 	}
 	else {
-		objHeader = longAt(receiver);
+		objHeader = longAt(rcvr);
 		if (((((usqInt) objHeader) >> 12) & 31) == ClassMethodContextCompactIndex) {
 			/* begin cloneContext: */
 			VM_LABEL(0cloneContext);
-			cloned = eeInstantiateMethodContextByteSize(byteSizeOf(receiver));
+			cloned = eeInstantiateMethodContextByteSize(byteSizeOf(rcvr));
 			if (cloned != 0) {
 				for (i = 0; i <= StackPointerIndex; i += 1) {
 					/* begin storePointerUnchecked:ofObject:withValue: */
-					valuePointer = externalInstVarofContext(i, receiver);
+					valuePointer = externalInstVarofContext(i, rcvr);
 					longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), valuePointer);
 				}
 				for (i = MethodIndex; i <= ReceiverIndex; i += 1) {
-					longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), longAt((receiver + BaseHeaderSize) + (i << ShiftForWord)));
+					longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), longAt((rcvr + BaseHeaderSize) + (i << ShiftForWord)));
 				}
-				if ((((longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
-				 && (!(isWidowedContext(receiver)))) {
+				if ((((longAt((rcvr + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+				 && (!(isWidowedContext(rcvr)))) {
 					/* begin frameOfMarriedContext: */
-					value = longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord));
+					value = longAt((rcvr + BaseHeaderSize) + (SenderIndex << ShiftForWord));
 					/* begin withoutSmallIntegerTags: */
 					assert((value & 1));
 					spouseFP = pointerForOop(value - 1);
@@ -25712,16 +25881,16 @@
 					}
 				}
 				else {
-					sp1 = (fetchStackPointerOf(receiver)) - 1;
+					sp1 = (fetchStackPointerOf(rcvr)) - 1;
 					for (i = 0; i <= sp1; i += 1) {
-						longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), longAt((receiver + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord)));
+						longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), longAt((rcvr + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord)));
 					}
 				}
 			}
 			newCopy = cloned;
 		}
 		else {
-			newCopy = clone(receiver);
+			newCopy = clone(rcvr);
 		}
 		if (newCopy == 0) {
 			(GIV(primFailCode) = PrimErrNoMemory); return;
@@ -26654,6 +26823,10 @@
 	}
 }
 
+
+/*	Special version of primitiveAt for accessing contexts.
+	Written to be varargs for use from mirror primitives. */
+
 static void
 primitiveContextAt(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ -26681,11 +26854,7 @@
 
 	index = longAt(GIV(stackPointer));
 	if (!((index & 1))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+		(GIV(primFailCode) = PrimErrBadArgument); return;
 	}
 	index = (index >> 1);
 
@@ -26699,7 +26868,7 @@
 
 		value = stObjectat(aContext, index);
 		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), value);
+		longAtput((sp = GIV(stackPointer) + ((GIV(argumentCount) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp;
 		return;
 	}
@@ -26781,11 +26950,7 @@
 		stSize = (sp11 >> 1);
 	l5:	/* end stackPointerForMaybeMarriedContext: */;
 		if (!(((index >= 1) && (index <= stSize)))) {
-			/* begin primitiveFail */
-			if (!GIV(primFailCode)) {
-				GIV(primFailCode) = 1;
-			}
-			return;
+			(GIV(primFailCode) = PrimErrBadIndex); return;
 		}
 		/* begin subscript:with:format: */
 		if (fmt <= 4) {
@@ -26802,7 +26967,7 @@
 		}
 	l3:	/* end subscript:with:format: */;
 		/* begin pop:thenPush: */
-		longAtput((sp1 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), value);
+		longAtput((sp1 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp1;
 		return;
 	}
@@ -26812,11 +26977,7 @@
 	assert((value1 & 1));
 	spouseFP = pointerForOop(value1 - 1);
 	if (!(((index >= 1) && (index <= (stackPointerIndexForFrame(spouseFP)))))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+		(GIV(primFailCode) = PrimErrBadIndex); return;
 	}
 	value = ((((usqInt)(longAt(spouseFP + FoxMethod)))) < heapBase
 		? ((index - 1) < ((frameNumArgs = (mframeCogMethod(spouseFP)->cmNumArgs)))
@@ -26826,10 +26987,14 @@
 				? longAt((spouseFP + FoxCallerSavedIP) + ((frameNumArgs1 - (index - 1)) * BytesPerWord))
 				: longAt(((spouseFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - (index - 1)) * BytesPerWord))));
 	/* begin pop:thenPush: */
-	longAtput((sp2 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), value);
+	longAtput((sp2 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 	GIV(stackPointer) = sp2;
 }
 
+
+/*	Special version of primitiveAtPut for accessing contexts.
+	Written to be varargs for use from mirror primitives. */
+
 static sqInt
 primitiveContextAtPut(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ -26860,18 +27025,14 @@
 	index = longAt(GIV(stackPointer) + (1 * BytesPerWord));
 	aContext = longAt(GIV(stackPointer) + (2 * BytesPerWord));
 	if (!((index & 1))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return null;
+		return (GIV(primFailCode) = PrimErrBadArgument);
 	}
 	hdr = longAt(aContext);
 	index = (index >> 1);
 	if (!(((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
 		stObjectatput(aContext, index, value);
 		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + ((3 - 1) * BytesPerWord)), value);
+		longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp;
 		return null;
 	}
@@ -26953,11 +27114,7 @@
 		stSize = (sp11 >> 1);
 	l4:	/* end stackPointerForMaybeMarriedContext: */;
 		if (!(((index >= 1) && (index <= stSize)))) {
-			/* begin primitiveFail */
-			if (!GIV(primFailCode)) {
-				GIV(primFailCode) = 1;
-			}
-			return null;
+			return (GIV(primFailCode) = PrimErrBadIndex);
 		}
 		/* begin subscript:with:storing:format: */
 		VM_LABEL(0subscriptwithstoringformat);
@@ -27009,7 +27166,7 @@
 			}
 		}
 		/* begin pop:thenPush: */
-		longAtput((sp1 = GIV(stackPointer) + ((3 - 1) * BytesPerWord)), value);
+		longAtput((sp1 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp1;
 		return null;
 	}
@@ -27019,15 +27176,10 @@
 	assert((value1 & 1));
 	spouseFP = pointerForOop(value1 - 1);
 	if (!(((index >= 1) && (index <= (stackPointerIndexForFrame(spouseFP)))))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return null;
+		return (GIV(primFailCode) = PrimErrBadIndex);
 	}
 	/* begin temporary:in:put: */
-	VM_LABEL(0temporaryinput);
-	;
+	VM_LABEL(1temporaryinput);
 	if ((((usqInt)(longAt(spouseFP + FoxMethod)))) < heapBase) {
 		/* begin mtemporary:in:put: */
 		longAtput(((index - 1) < ((frameNumArgs = (mframeCogMethod(spouseFP)->cmNumArgs)))
@@ -27044,11 +27196,15 @@
 		}
 	}
 	/* begin pop:thenPush: */
-	longAtput((sp2 = GIV(stackPointer) + ((3 - 1) * BytesPerWord)), value);
+	longAtput((sp2 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 	GIV(stackPointer) = sp2;
 	return null;
 }
 
+
+/*	Special version of primitiveSize for accessing contexts.
+	Written to be varargs for use from mirror primitives. */
+
 static void
 primitiveContextSize(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ -27148,11 +27304,9 @@
 	else {
 		sz = totalLength - fixedFields;
 	}
-	if (!GIV(primFailCode)) {
-		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + ((1 - 1) * BytesPerWord)), ((sz << 1) | 1));
-		GIV(stackPointer) = sp;
-	}
+	/* begin pop:thenPush: */
+	longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), ((sz << 1) | 1));
+	GIV(stackPointer) = sp;
 }
 
 
@@ -35745,31 +35899,77 @@
 static void
 primitiveSize(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt ccIndex;
+    sqInt class;
+    sqInt classFormat;
+    sqInt fixedFields;
+    sqInt fmt;
+    sqInt hdr;
     sqInt rcvr;
     char *sp;
     sqInt sz;
+    sqInt totalLength;
 
 	rcvr = longAt(GIV(stackPointer));
-	if ((rcvr & 1)) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+	if (((rcvr & 1))
+	 || ((
+	/* Integers are not indexable */
+
+(hdr = longAt(rcvr)),
+	((fmt = (((usqInt) hdr) >> 8) & 15)) < 2))) {
+		(GIV(primFailCode) = PrimErrBadReceiver); return;
 	}
-	if (((((usqInt) (longAt(rcvr))) >> 8) & 15) < 2) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+	if ((fmt == 3)
+	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
+		primitiveContextSize(); return;
 	}
-	sz = stSizeOf(rcvr);
-	if (!GIV(primFailCode)) {
-		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), ((sz << 1) | 1));
-		GIV(stackPointer) = sp;
+	/* begin lengthOf:baseHeader:format: */
+	if ((hdr & TypeMask) == HeaderTypeSizeAndClass) {
+		sz = (longAt(rcvr - (BytesPerWord * 2))) & LongSizeMask;
 	}
+	else {
+		sz = hdr & SizeMask;
+	}
+	sz -= hdr & Size4Bit;
+	if (fmt <= 4) {
+		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
+		goto l1;
+	}
+	if (fmt < 8) {
+		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> 2;
+		goto l1;
+	}
+	else {
+		totalLength = (sz - BaseHeaderSize) - (fmt & 3);
+		goto l1;
+	}
+l1:	/* end lengthOf:baseHeader:format: */;
+	/* begin fixedFieldsOf:format:length: */
+	if ((fmt > 4)
+	 || (fmt == 2)) {
+		fixedFields = 0;
+		goto l2;
+	}
+	if (fmt < 2) {
+		fixedFields = totalLength;
+		goto l2;
+	}
+	/* begin fetchClassOfNonInt: */
+	if (((ccIndex = (((usqInt) (longAt(rcvr))) >> 12) & 31)) == 0) {
+		class = (longAt(rcvr - BaseHeaderSize)) & AllButTypeMask;
+		goto l3;
+	}
+	else {
+		class = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord));
+		goto l3;
+	}
+l3:	/* end fetchClassOfNonInt: */;
+	classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1;
+	fixedFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1;
+l2:	/* end fixedFieldsOf:format:length: */;
+	/* begin pop:thenPush: */
+	longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), (((totalLength - fixedFields) << 1) | 1));
+	GIV(stackPointer) = sp;
 }
 
 
@@ -39573,6 +39773,7 @@
 printMethodDictionaryOf(sqInt behavior)
 {
     sqInt index;
+    sqInt meth;
     sqInt methodArray;
     sqInt selector;
 
@@ -39582,9 +39783,15 @@
 	for (index = SelectorStart; index <= ((fetchWordLengthOf(longAt((behavior + BaseHeaderSize) + (MethodDictionaryIndex << ShiftForWord)))) - 1); index += 1) {
 		selector = longAt(((longAt((behavior + BaseHeaderSize) + (MethodDictionaryIndex << ShiftForWord))) + BaseHeaderSize) + (index << ShiftForWord));
 		if (selector != GIV(nilObj)) {
+			meth = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord));
 			printOopShort(selector);
 			print(" => ");
-			printOopShort(longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord)));
+			printOopShort(meth);
+			print(" (");
+			printHex(selector);
+			print(" => ");
+			printHex(meth);
+			putchar(')');
 			/* begin cr */
 			printf("\n");
 		}
@@ -39595,6 +39802,7 @@
 printMethodDictionary(sqInt dictionary)
 {
     sqInt index;
+    sqInt meth;
     sqInt methodArray;
     sqInt selector;
 
@@ -39602,9 +39810,15 @@
 	for (index = SelectorStart; index <= ((fetchWordLengthOf(dictionary)) - 1); index += 1) {
 		selector = longAt((dictionary + BaseHeaderSize) + (index << ShiftForWord));
 		if (selector != GIV(nilObj)) {
+			meth = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord));
 			printOopShort(selector);
 			print(" => ");
-			printOopShort(longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord)));
+			printOopShort(meth);
+			print(" (");
+			printHex(selector);
+			print(" => ");
+			printHex(meth);
+			putchar(')');
 			/* begin cr */
 			printf("\n");
 		}
@@ -43799,6 +44013,7 @@
     sqInt fixedFields;
     sqInt fmt;
     sqInt hdr;
+    sqInt sp;
     sqInt stSize;
     sqInt sz;
     sqInt totalLength;
@@ -43815,44 +44030,61 @@
 	sz -= hdr & Size4Bit;
 	if (fmt <= 4) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
-		goto l1;
+		goto l2;
 	}
 	if (fmt < 8) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> 2;
-		goto l1;
+		goto l2;
 	}
 	else {
 		totalLength = (sz - BaseHeaderSize) - (fmt & 3);
-		goto l1;
+		goto l2;
 	}
-l1:	/* end lengthOf:baseHeader:format: */;
+l2:	/* end lengthOf:baseHeader:format: */;
 	/* begin fixedFieldsOf:format:length: */
 	if ((fmt > 4)
 	 || (fmt == 2)) {
 		fixedFields = 0;
-		goto l2;
+		goto l3;
 	}
 	if (fmt < 2) {
 		fixedFields = totalLength;
-		goto l2;
+		goto l3;
 	}
 	/* begin fetchClassOfNonInt: */
 	if (((ccIndex = (((usqInt) (longAt(array))) >> 12) & 31)) == 0) {
 		class = (longAt(array - BaseHeaderSize)) & AllButTypeMask;
-		goto l3;
+		goto l4;
 	}
 	else {
 		class = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord));
-		goto l3;
+		goto l4;
 	}
-l3:	/* end fetchClassOfNonInt: */;
+l4:	/* end fetchClassOfNonInt: */;
 	classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1;
 	fixedFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1;
-l2:	/* end fixedFieldsOf:format:length: */;
-	if (fmt == 3) {
-		assert(!(isContextHeader(hdr)));
+l3:	/* end fixedFieldsOf:format:length: */;
+	if ((fmt == 3)
+	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
+		/* begin fetchStackPointerOf: */
+		sp = longAt((array + BaseHeaderSize) + (StackPointerIndex << ShiftForWord));
+		if (!((sp & 1))) {
+			stSize = 0;
+			goto l1;
+		}
+		assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(array)));
+		stSize = (sp >> 1);
+	l1:	/* end fetchStackPointerOf: */;
+		if (((((usqInt) index)) >= (((usqInt) 1)))
+		 && (((((usqInt) index)) <= (((usqInt) stSize)))
+		 && ((((longAt((array + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+		 && (!(isWidowedContext(array)))))) {
+			return noInlineTemporaryin(index - 1, frameOfMarriedContext(array));
+		}
 	}
-	stSize = totalLength - fixedFields;
+	else {
+		stSize = totalLength - fixedFields;
+	}
 	if (((((usqInt) index)) >= (((usqInt) 1)))
 	 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 		/* begin subscript:with:format: */
@@ -43884,6 +44116,7 @@
     sqInt fixedFields;
     sqInt fmt;
     sqInt hdr;
+    sqInt sp;
     sqInt stSize;
     sqInt sz;
     sqInt totalLength;
@@ -43901,44 +44134,62 @@
 	sz -= hdr & Size4Bit;
 	if (fmt <= 4) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
-		goto l1;
+		goto l2;
 	}
 	if (fmt < 8) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> 2;
-		goto l1;
+		goto l2;
 	}
 	else {
 		totalLength = (sz - BaseHeaderSize) - (fmt & 3);
-		goto l1;
+		goto l2;
 	}
-l1:	/* end lengthOf:baseHeader:format: */;
+l2:	/* end lengthOf:baseHeader:format: */;
 	/* begin fixedFieldsOf:format:length: */
 	if ((fmt > 4)
 	 || (fmt == 2)) {
 		fixedFields = 0;
-		goto l2;
+		goto l3;
 	}
 	if (fmt < 2) {
 		fixedFields = totalLength;
-		goto l2;
+		goto l3;
 	}
 	/* begin fetchClassOfNonInt: */
 	if (((ccIndex = (((usqInt) (longAt(array))) >> 12) & 31)) == 0) {
 		class = (longAt(array - BaseHeaderSize)) & AllButTypeMask;
-		goto l3;
+		goto l4;
 	}
 	else {
 		class = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord));
-		goto l3;
+		goto l4;
 	}
-l3:	/* end fetchClassOfNonInt: */;
+l4:	/* end fetchClassOfNonInt: */;
 	classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1;
 	fixedFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1;
-l2:	/* end fixedFieldsOf:format:length: */;
-	if (fmt == 3) {
-		assert(!(isContextHeader(hdr)));
+l3:	/* end fixedFieldsOf:format:length: */;
+	if ((fmt == 3)
+	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
+		/* begin fetchStackPointerOf: */
+		sp = longAt((array + BaseHeaderSize) + (StackPointerIndex << ShiftForWord));
+		if (!((sp & 1))) {
+			stSize = 0;
+			goto l1;
+		}
+		assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(array)));
+		stSize = (sp >> 1);
+	l1:	/* end fetchStackPointerOf: */;
+		if (((((usqInt) index)) >= (((usqInt) 1)))
+		 && (((((usqInt) index)) <= (((usqInt) stSize)))
+		 && ((((longAt((array + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+		 && (!(isWidowedContext(array)))))) {
+			noInlineTemporaryinput(index - 1, frameOfMarriedContext(array), value);
+			return;
+		}
 	}
-	stSize = totalLength - fixedFields;
+	else {
+		stSize = totalLength - fixedFields;
+	}
 	if (((((usqInt) index)) >= (((usqInt) 1)))
 	 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 		/* begin subscript:with:storing:format: */

Modified: branches/Cog/src/vm/cointerpmt.h
===================================================================
--- branches/Cog/src/vm/cointerpmt.h	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/src/vm/cointerpmt.h	2011-08-19 21:33:12 UTC (rev 2488)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
  */
 
 
@@ -45,7 +45,6 @@
 void checkAssertsEnabledInCoInterpreter(void);
 sqInt checkedLongAt(sqInt byteAddress);
 sqInt classArray(void);
-sqInt classFieldOffset(void);
 sqInt classFloat(void);
 sqInt classFloatCompactIndex(void);
 sqInt classHeader(sqInt oop);
@@ -53,8 +52,6 @@
 void clearTraceLog(void);
 CogMethod * cogMethodOf(sqInt aMethodOop);
 sqInt compactClassAt(sqInt ccIndex);
-sqInt compactClassFieldLSB(void);
-sqInt compactClassFieldWidth(void);
 sqInt compactClassIndexOfHeader(sqInt header);
 sqInt compactClassIndexOf(sqInt oop);
 sqInt compactClassTable(void);
@@ -105,6 +102,7 @@
 sqInt lengthOf(sqInt oop);
 sqInt literalCountOfHeader(sqInt headerPointer);
 sqInt literalofMethod(sqInt offset, sqInt methodPointer);
+void longPrintOop(sqInt oop);
 sqInt lookupreceiver(sqInt selector, sqInt rcvr);
 void markActiveMethodsAndReferents(void);
 void markAndTrace(sqInt oop);
@@ -121,6 +119,7 @@
 usqInt newMethodAddress(void);
 usqInt nextProfileTickAddress(void);
 sqInt nilObject(void);
+sqInt noAssertHeaderOf(sqInt methodPointer);
 sqInt nullHeaderForMachineCodeMethod(void);
 sqInt objectAfter(sqInt oop);
 sqInt objectBefore(sqInt address);
@@ -216,6 +215,9 @@
 
 
 /*** Macros ***/
+#define classFieldOffset() (0 - BaseHeaderSize)
+#define compactClassFieldLSB() 12
+#define compactClassFieldWidth() 5
 #define compilationBreakpoint(sel, len) do { \
 	if ((len) == breakSelectorLength \
 	 && !strncmp((char *)((sel) + BaseHeaderSize), breakSelector, breakSelectorLength)) { \
@@ -223,4 +225,6 @@
 		compilationBreakpointFor(sel); \
 	} \
 } while (0)
+#define instFormatFieldLSB() 8
+#define instFormatFieldWidth() 4
 

Modified: branches/Cog/src/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/src/vm/gcc3x-cointerp.c	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/src/vm/gcc3x-cointerp.c	2011-08-19 21:33:12 UTC (rev 2488)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
    from
-	CoInterpreter VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CoInterpreter VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -412,7 +412,6 @@
 sqInt classExternalFunction(void);
 sqInt classExternalLibrary(void);
 sqInt classExternalStructure(void);
-sqInt classFieldOffset(void);
 sqInt classFloat(void);
 sqInt classFloatCompactIndex(void);
 sqInt classHeader(sqInt oop);
@@ -433,8 +432,6 @@
 static void commonAtPut(sqInt stringy);
 static void commonAt(sqInt stringy);
 sqInt compactClassAt(sqInt ccIndex);
-sqInt compactClassFieldLSB(void);
-sqInt compactClassFieldWidth(void);
 sqInt compactClassIndexOfHeader(sqInt header);
 sqInt compactClassIndexOf(sqInt oop);
 sqInt compactClassTable(void);
@@ -575,7 +572,7 @@
 static void initializeObjectMemory(sqInt bytesToShift);
 static void initializeStacknumSlotspageSizestackLimitOffsetstackPageHeadroom(char *theStackPages, sqInt stackSlots, sqInt slotsPerPage, sqInt stackLimitOffsetBytes, sqInt stackPageHeadroomBytes);
 static sqInt initStackPagesAndInterpret(void);
-static void installinAtCacheatstring(sqInt rcvr, sqInt *cache, sqInt atIx, sqInt stringy);
+static sqInt installinAtCacheatstring(sqInt rcvr, sqInt *cache, sqInt atIx, sqInt stringy);
 sqInt instanceSizeOf(sqInt classObj);
 sqInt instantiateClassindexableSize(sqInt classPointer, sqInt size);
 usqInt instructionPointerAddress(void);
@@ -592,6 +589,7 @@
 sqInt isCogMethodReference(sqInt methodHeader);
 sqInt isCompiledMethod(sqInt oop);
 static sqInt isContextHeader(sqInt aHeader);
+static sqInt isContextNonInt(sqInt oop);
 static sqInt isContext(sqInt oop);
 sqInt isFloatObject(sqInt oop);
 static sqInt isFree(StackPage * self_in_isFree);
@@ -636,6 +634,7 @@
 sqInt loadBitBltFrom(sqInt bb);
 static sqInt loadImageSegmentFromoutPointers(sqInt segmentWordArray, sqInt outPointerArray);
 void loadInitialContext(void);
+void longPrintOop(sqInt oop);
 static sqInt lookupInMethodCacheSelclass(sqInt selector, sqInt class);
 static sqInt lookupMethodInClass(sqInt class);
 static sqInt lookupMethodInDictionary(sqInt dictionary);
@@ -689,8 +688,11 @@
 static StackPage * newStackPage(void);
 usqInt nextProfileTickAddress(void);
 sqInt nilObject(void);
+sqInt noAssertHeaderOf(sqInt methodPointer);
 static void noAtCacheCommonAtPut(sqInt stringy);
 static void noAtCacheCommonAt(sqInt stringy);
+static sqInt noInlineTemporaryin(sqInt offset, char *theFP);
+static void noInlineTemporaryinput(sqInt offset, char *theFP, sqInt valueOop);
 static sqInt noMarkedContextsOnPage(StackPage *thePage);
 static sqInt nonWeakFieldsOf(sqInt oop);
 sqInt nullHeaderForMachineCodeMethod(void);
@@ -1139,9 +1141,9 @@
 _iss StackPage * stackPage;
 _iss sqInt nilObj;
 _iss usqInt instructionPointer;
+_iss sqInt argumentCount;
 _iss usqInt method;
 _iss usqInt freeStart;
-_iss sqInt argumentCount;
 _iss usqInt newMethod;
 _iss sqInt messageSelector;
 _iss StackPage * pages;
@@ -1883,12 +1885,15 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void);
-const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.117]";
+const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.119]";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
 
 /*** Macros ***/
+#define classFieldOffset() (0 - BaseHeaderSize)
+#define compactClassFieldLSB() 12
+#define compactClassFieldWidth() 5
 #define compilationBreakpoint(sel, len) do { \
 	if ((len) == breakSelectorLength \
 	 && !strncmp((char *)((sel) + BaseHeaderSize), breakSelector, breakSelectorLength)) { \
@@ -1906,6 +1911,8 @@
 #define getCogCodeSize() integerObjectOf(GIV(cogCodeSize))
 #define getDesiredCogCodeSize() integerObjectOf(desiredCogCodeSize)
 #define initialEnterSmalltalkExecutive() enterSmalltalkExecutiveImplementation()
+#define instFormatFieldLSB() 8
+#define instFormatFieldWidth() 4
 #define memory() memory
 #define mostRecentlyUsedPage() GIV(mostRecentlyUsedPage)
 #define nextOpenPIC methodObject
@@ -1916,7 +1923,6 @@
 #define remapBufferCount() GIV(remapBufferCount)
 #define setDesiredCogCodeSize(dccs) (desiredCogCodeSize = (dccs))
 #define stackPageAtpages(index,pages) ((pages) + (index))
-#define typeEtAlWord(cm) (((long *)(cm))[1])
 #define validate() 0
 #define youngStart() GIV(youngStart)
 
@@ -7688,36 +7694,39 @@
 							}
 						}
 					}
-					/* begin commonVariable:at:cacheIndex: */
-					VM_LABEL(0commonVariableatcacheIndex);
-					stSize = GIV(atCache)[atIx + AtCacheSize];
-					if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
-					 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
-						fmt = GIV(atCache)[atIx + AtCacheFmt];
-						if (fmt <= 4) {
-							fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
-							result = longAt((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord));
-							goto l73;
-						}
-						if (fmt < 8) {
+					if (!GIV(primFailCode)) {
+						/* begin commonVariable:at:cacheIndex: */
+						VM_LABEL(0commonVariableatcacheIndex);
+						stSize = GIV(atCache)[atIx + AtCacheSize];
+						if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
+						 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
+							fmt = GIV(atCache)[atIx + AtCacheFmt];
+							if (fmt <= 4) {
+								assert(!(isContextNonInt(rcvr)));
+								fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
+								result = longAt((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord));
+								goto l73;
+							}
+							if (fmt < 8) {
 
-							/* Bitmap */
+								/* Bitmap */
 
-							result1 = long32At((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2));
-							result = positive32BitIntegerFor(result1);
-							goto l73;
+								result1 = long32At((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2));
+								result = positive32BitIntegerFor(result1);
+								goto l73;
+							}
+							if (fmt >= 16) {
+								result = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CharacterTable << ShiftForWord))) + BaseHeaderSize) + ((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << ShiftForWord));
+								goto l73;
+							}
+							else {
+								result = (((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << 1) | 1);
+								goto l73;
+							}
 						}
-						if (fmt >= 16) {
-							result = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CharacterTable << ShiftForWord))) + BaseHeaderSize) + ((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << ShiftForWord));
-							goto l73;
-						}
-						else {
-							result = (((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << 1) | 1);
-							goto l73;
-						}
+						result = (GIV(primFailCode) = PrimErrBadIndex);
+					l73:	/* end commonVariable:at:cacheIndex: */;
 					}
-					result = (GIV(primFailCode) = PrimErrBadIndex);
-				l73:	/* end commonVariable:at:cacheIndex: */;
 					if (!GIV(primFailCode)) {
 						/* begin fetchNextBytecode */
 						currentBytecode = byteAtPointer(++localIP);
@@ -7725,6 +7734,8 @@
 						longAtPointerput((localSP += (2 - 1) * BytesPerWord), result);
 						goto l71;
 					}
+					/* begin initPrimCall */
+					GIV(primFailCode) = 0;
 				}
 				GIV(messageSelector) = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SpecialSelectors << ShiftForWord))) + BaseHeaderSize) + ((16 * 2) << ShiftForWord));
 				GIV(argumentCount) = 1;
@@ -7787,59 +7798,62 @@
 							}
 						}
 					}
-					/* begin commonVariable:at:put:cacheIndex: */
-					VM_LABEL(0commonVariableatputcacheIndex);
-					stSize = GIV(atCache)[atIx + AtCacheSize];
-					if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
-					 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
-						fmt = GIV(atCache)[atIx + AtCacheFmt];
-						if (fmt <= 4) {
-							fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
-							/* begin storePointer:ofObject:withValue: */
-							if ((((usqInt) rcvr)) < (((usqInt) GIV(youngStart)))) {
-								possibleRootStoreIntovalue(rcvr, value);
+					if (!GIV(primFailCode)) {
+						/* begin commonVariable:at:put:cacheIndex: */
+						VM_LABEL(0commonVariableatputcacheIndex);
+						stSize = GIV(atCache)[atIx + AtCacheSize];
+						if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
+						 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
+							fmt = GIV(atCache)[atIx + AtCacheFmt];
+							if (fmt <= 4) {
+								assert(!(isContextNonInt(rcvr)));
+								fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
+								/* begin storePointer:ofObject:withValue: */
+								if ((((usqInt) rcvr)) < (((usqInt) GIV(youngStart)))) {
+									possibleRootStoreIntovalue(rcvr, value);
+								}
+								longAtput((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord), value);
+								goto l75;
 							}
-							longAtput((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord), value);
-							goto l75;
-						}
-						if (fmt < 8) {
+							if (fmt < 8) {
 
-							/* Bitmap */
+								/* Bitmap */
 
-							valToPut = positive32BitValueOf(value);
-							if (!GIV(primFailCode)) {
-								long32Atput((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2), valToPut);
+								valToPut = positive32BitValueOf(value);
+								if (!GIV(primFailCode)) {
+									long32Atput((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2), valToPut);
+								}
+								goto l75;
 							}
-							goto l75;
-						}
-						if (fmt >= 16) {
+							if (fmt >= 16) {
 
-							/* Note fmt >= 16 is an artificial flag for strings */
+								/* Note fmt >= 16 is an artificial flag for strings */
 
-							valToPut = asciiOfCharacter(value);
-							if (!(!GIV(primFailCode))) {
-								goto l75;
+								valToPut = asciiOfCharacter(value);
+								if (!(!GIV(primFailCode))) {
+									goto l75;
+								}
 							}
-						}
-						else {
-							valToPut = value;
-						}
-						if ((valToPut & 1)) {
-							valToPut = (valToPut >> 1);
-							if (!((valToPut >= 0)
-								 && (valToPut <= 255))) {
-								/* begin primitiveFail */
-								if (!GIV(primFailCode)) {
-									GIV(primFailCode) = 1;
+							else {
+								valToPut = value;
+							}
+							if ((valToPut & 1)) {
+								valToPut = (valToPut >> 1);
+								if (!((valToPut >= 0)
+									 && (valToPut <= 255))) {
+									/* begin primitiveFail */
+									if (!GIV(primFailCode)) {
+										GIV(primFailCode) = 1;
+									}
+									goto l75;
 								}
+								byteAtput((rcvr + BaseHeaderSize) + (((index >> 1)) - 1), valToPut);
 								goto l75;
 							}
-							byteAtput((rcvr + BaseHeaderSize) + (((index >> 1)) - 1), valToPut);
-							goto l75;
 						}
+						GIV(primFailCode) = PrimErrBadIndex;
+					l75:	/* end commonVariable:at:put:cacheIndex: */;
 					}
-					GIV(primFailCode) = PrimErrBadIndex;
-				l75:	/* end commonVariable:at:put:cacheIndex: */;
 					if (!GIV(primFailCode)) {
 						/* begin fetchNextBytecode */
 						currentBytecode = byteAtPointer(++localIP);
@@ -7847,6 +7861,8 @@
 						longAtPointerput((localSP += (3 - 1) * BytesPerWord), value);
 						goto l74;
 					}
+					/* begin initPrimCall */
+					GIV(primFailCode) = 0;
 				}
 				GIV(messageSelector) = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SpecialSelectors << ShiftForWord))) + BaseHeaderSize) + ((17 * 2) << ShiftForWord));
 				GIV(argumentCount) = 2;
@@ -11368,7 +11384,7 @@
 				 || ((heapMapAtWord(pointerForOop(fieldOop))) == 0)) {
 					print("object leak in ");
 					printHex(obj);
-					print(" class ");
+					print(" class = ");
 					printHex(fieldOop);
 					/* begin cr */
 					printf("\n");
@@ -11435,6 +11451,8 @@
 								printHex(obj);
 								print(" @ ");
 								printNum(fi);
+								print(" = ");
+								printHex(fieldOop);
 								/* begin cr */
 								printf("\n");
 								ok = 0;
@@ -11914,12 +11932,6 @@
 }
 
 sqInt
-classFieldOffset(void)
-{
-	return 0 - BaseHeaderSize;
-}
-
-sqInt
 classFloat(void)
 {
 	return longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassFloat << ShiftForWord));
@@ -12269,7 +12281,12 @@
 
 		atIx = (rcvr & AtCacheMask) + AtPutBase;
 		if (!((GIV(atCache)[atIx + AtCacheOop]) == rcvr)) {
-			installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy);
+			if (!(installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy))) {
+				assert(isContextNonInt(rcvr));
+				/* begin initPrimCall */
+				GIV(primFailCode) = 0;
+				primitiveContextAtPut(); return;
+			}
 		}
 		if (!GIV(primFailCode)) {
 			/* begin commonVariable:at:put:cacheIndex: */
@@ -12279,6 +12296,7 @@
 			 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 				fmt = GIV(atCache)[atIx + AtCacheFmt];
 				if (fmt <= 4) {
+					assert(!(isContextNonInt(rcvr)));
 					fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
 					/* begin storePointer:ofObject:withValue: */
 					if ((((usqInt) rcvr)) < (((usqInt) GIV(youngStart)))) {
@@ -12396,7 +12414,12 @@
 
 		atIx = rcvr & AtCacheMask;
 		if (!((GIV(atCache)[atIx + AtCacheOop]) == rcvr)) {
-			installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy);
+			if (!(installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy))) {
+				assert(isContextNonInt(rcvr));
+				/* begin initPrimCall */
+				GIV(primFailCode) = 0;
+				primitiveContextAt(); return;
+			}
 		}
 		if (!GIV(primFailCode)) {
 			/* begin commonVariable:at:cacheIndex: */
@@ -12406,6 +12429,7 @@
 			 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 				fmt = GIV(atCache)[atIx + AtCacheFmt];
 				if (fmt <= 4) {
+					assert(!(isContextNonInt(rcvr)));
 					fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
 					result = longAt((rcvr + BaseHeaderSize) + (((index + fixedFields) - 1) << ShiftForWord));
 					goto l1;
@@ -12467,18 +12491,6 @@
 }
 
 sqInt
-compactClassFieldLSB(void)
-{
-	return 12;
-}
-
-sqInt
-compactClassFieldWidth(void)
-{
-	return 5;
-}
-
-sqInt
 compactClassIndexOfHeader(sqInt header)
 {
 	return (((usqInt) header) >> 12) & 31;
@@ -18030,10 +18042,12 @@
 }
 
 
-/*	Install the oop of this object in the given cache (at or atPut), along
-	with its size, format and fixedSize */
+/*	Attempt to install the oop of this object in the given cache (at or
+	atPut), along with its size, format and fixedSize. Answer if this was
+	successful. 
+ */
 
-static void
+static sqInt
 installinAtCacheatstring(sqInt rcvr, sqInt *cache, sqInt atIx, sqInt stringy)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt ccIndex;
@@ -18049,11 +18063,8 @@
 	fmt = (((usqInt) hdr) >> 8) & 15;
 	if ((fmt == 3)
 	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+		GIV(primFailCode) = PrimErrBadReceiver;
+		return 0;
 	}
 	/* begin lengthOf:baseHeader:format: */
 	if ((hdr & TypeMask) == HeaderTypeSizeAndClass) {
@@ -18105,6 +18116,7 @@
 	: fmt));
 	cache[atIx + AtCacheFixedFields] = fixedFields;
 	cache[atIx + AtCacheSize] = (totalLength - fixedFields);
+	return 1;
 }
 
 
@@ -18600,6 +18612,12 @@
 }
 
 static sqInt
+isContextNonInt(sqInt oop)
+{
+	return ((((usqInt) (longAt(oop))) >> 12) & 31) == ClassMethodContextCompactIndex;
+}
+
+static sqInt
 isContext(sqInt oop)
 {
 	return ((oop & 1) == 0)
@@ -19622,7 +19640,103 @@
 	GIV(instructionPointer) = ((sqInt) top);
 }
 
+void
+longPrintOop(sqInt oop)
+{
+    sqInt byte;
+    sqInt bytecodesPerLine;
+    sqInt fieldOop;
+    sqInt fmt;
+    sqInt header;
+    sqInt index;
+    sqInt lastIndex;
+    sqInt startIP;
+    sqInt sz;
 
+	if (((oop & 1))
+	 || ((!(((oop >= heapBase) && (oop <= GIV(freeStart)))))
+	 || (((oop & (BytesPerWord - 1)) != 0)
+	 || ((((longAt(oop)) & TypeMask) == HeaderTypeFree)
+	 || (((((fmt = (((usqInt) (longAt(oop))) >> 8) & 15)) >= 5) && (((fmt = (((usqInt) (longAt(oop))) >> 8) & 15)) <= 11))))))) {
+		printOop(oop); return;
+	}
+	printHex(oop);
+	print(": a(n) ");
+	printNameOfClasscount(fetchClassOfNonInt(oop), 5);
+	if (fmt > 4) {
+		print(" nbytes ");
+		printNum(byteSizeOf(oop));
+	}
+	/* begin cr */
+	printf("\n");
+	lastIndex = ((64 < ((startIP = ((sqInt) (lastPointerOf(oop)) >> 2)))) ? 64 : ((startIP = ((sqInt) (lastPointerOf(oop)) >> 2))));
+	if (lastIndex > 0) {
+		for (index = 1; index <= lastIndex; index += 1) {
+			fieldOop = longAt((oop + BaseHeaderSize) + ((index - 1) << ShiftForWord));
+			/* begin space */
+			/* begin printChar: */
+			putchar(' ');
+			printHex(fieldOop);
+			/* begin space */
+			/* begin printChar: */
+			putchar(' ');
+			printOopShort(fieldOop);
+			/* begin cr */
+			printf("\n");
+		}
+	}
+	if (((((usqInt) (longAt(oop))) >> 8) & 15) >= 12) {
+		startIP = (startIP * BytesPerWord) + 1;
+		/* begin lengthOf: */
+		header = longAt(oop);
+		/* begin lengthOf:baseHeader:format: */
+		if ((header & TypeMask) == HeaderTypeSizeAndClass) {
+			sz = (longAt(oop - (BytesPerWord * 2))) & LongSizeMask;
+		}
+		else {
+			sz = header & SizeMask;
+		}
+		sz -= header & Size4Bit;
+		if (((((usqInt) header) >> 8) & 15) <= 4) {
+			lastIndex = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
+			goto l1;
+		}
+		if (((((usqInt) header) >> 8) & 15) < 8) {
+			lastIndex = ((usqInt) (sz - BaseHeaderSize)) >> 2;
+			goto l1;
+		}
+		else {
+			lastIndex = (sz - BaseHeaderSize) - (((((usqInt) header) >> 8) & 15) & 3);
+			goto l1;
+		}
+	l1:	/* end lengthOf: */;
+		if ((lastIndex - startIP) > 100) {
+			lastIndex = startIP + 100;
+		}
+		bytecodesPerLine = 8;
+		for (index = startIP; index <= lastIndex; index += 1) {
+			byte = byteAt((oop + BaseHeaderSize) + (index - 1));
+			printf(" %02x/%-3d", byte,byte);
+			if ((((index - startIP) + 1) % bytecodesPerLine) == 0) {
+				/* begin cr */
+				printf("\n");
+			}
+		}
+		if (!((((lastIndex - startIP) + 1) % bytecodesPerLine) == 0)) {
+			/* begin cr */
+			printf("\n");
+		}
+	}
+	else {
+		if (startIP > 64) {
+			print("...");
+			/* begin cr */
+			printf("\n");
+		}
+	}
+}
+
+
 /*	This method implements a simple method lookup cache. If an entry for the
 	given selector and class is found in the cache, set the values of
 	'newMethod' and 'primitiveFunctionPointer' and return true. Otherwise,
@@ -22040,7 +22154,18 @@
 	return GIV(nilObj);
 }
 
+sqInt
+noAssertHeaderOf(sqInt methodPointer)
+{
+    sqInt methodHeader;
 
+	methodHeader = longAt((methodPointer + BaseHeaderSize) + (HeaderIndex << ShiftForWord));
+	return (isCogMethodReference(methodHeader)
+		? (((CogMethod *) methodHeader)->methodHeader)
+		: methodHeader);
+}
+
+
 /*	This code is called if the receiver responds primitively to at:Put:.
 	The cogit can implement at: & at:put: quickly in machine code, and needs a
 	backup that provides error codes. But it does not want the at cache so it
@@ -22125,7 +22250,47 @@
 	}
 }
 
+static sqInt
+noInlineTemporaryin(sqInt offset, char *theFP)
+{
+    sqInt frameNumArgs;
+    sqInt frameNumArgs1;
 
+	return ((((usqInt)(longAt(theFP + FoxMethod)))) < heapBase
+		? (offset < ((frameNumArgs = (mframeCogMethod(theFP)->cmNumArgs)))
+				? longAt((theFP + FoxCallerSavedIP) + ((frameNumArgs - offset) * BytesPerWord))
+				: longAt(((theFP + FoxMFReceiver) - BytesPerWord) + ((frameNumArgs - offset) * BytesPerWord)))
+		: (offset < ((frameNumArgs1 = byteAt((theFP + FoxIFrameFlags) + 1)))
+				? longAt((theFP + FoxCallerSavedIP) + ((frameNumArgs1 - offset) * BytesPerWord))
+				: longAt(((theFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - offset) * BytesPerWord))));
+}
+
+static void
+noInlineTemporaryinput(sqInt offset, char *theFP, sqInt valueOop)
+{
+    sqInt frameNumArgs;
+    sqInt frameNumArgs1;
+
+	/* begin temporary:in:put: */
+	VM_LABEL(0temporaryinput);
+	if ((((usqInt)(longAt(theFP + FoxMethod)))) < heapBase) {
+		/* begin mtemporary:in:put: */
+		longAtput((offset < ((frameNumArgs = (mframeCogMethod(theFP)->cmNumArgs)))
+			? (theFP + FoxCallerSavedIP) + ((frameNumArgs - offset) * BytesPerWord)
+			: ((theFP + FoxMFReceiver) - BytesPerWord) + ((frameNumArgs - offset) * BytesPerWord)), valueOop);
+	}
+	else {
+		/* begin itemporary:in:put: */
+		if (offset < ((frameNumArgs1 = byteAt((theFP + FoxIFrameFlags) + 1)))) {
+			longAtput((theFP + FoxCallerSavedIP) + ((frameNumArgs1 - offset) * BytesPerWord), valueOop);
+		}
+		else {
+			longAtput(((theFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - offset) * BytesPerWord), valueOop);
+		}
+	}
+}
+
+
 /*	Answer true if there are no marked contexts on thePage. */
 
 static sqInt
@@ -24463,7 +24628,7 @@
     sqInt methodHeader;
     sqInt newCopy;
     sqInt objHeader;
-    sqInt receiver;
+    sqInt rcvr;
     char *sp;
     sqInt sp1;
     char *spouseFP;
@@ -24471,29 +24636,29 @@
     sqInt valuePointer;
     sqInt valuePointer1;
 
-	receiver = longAt(GIV(stackPointer));
-	if ((receiver & 1)) {
-		newCopy = receiver;
+	rcvr = longAt(GIV(stackPointer));
+	if ((rcvr & 1)) {
+		newCopy = rcvr;
 	}
 	else {
-		objHeader = longAt(receiver);
+		objHeader = longAt(rcvr);
 		if (((((usqInt) objHeader) >> 12) & 31) == ClassMethodContextCompactIndex) {
 			/* begin cloneContext: */
 			VM_LABEL(0cloneContext);
-			cloned = eeInstantiateMethodContextByteSize(byteSizeOf(receiver));
+			cloned = eeInstantiateMethodContextByteSize(byteSizeOf(rcvr));
 			if (cloned != 0) {
 				for (i = 0; i <= StackPointerIndex; i += 1) {
 					/* begin storePointerUnchecked:ofObject:withValue: */
-					valuePointer = externalInstVarofContext(i, receiver);
+					valuePointer = externalInstVarofContext(i, rcvr);
 					longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), valuePointer);
 				}
 				for (i = MethodIndex; i <= ReceiverIndex; i += 1) {
-					longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), longAt((receiver + BaseHeaderSize) + (i << ShiftForWord)));
+					longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), longAt((rcvr + BaseHeaderSize) + (i << ShiftForWord)));
 				}
-				if ((((longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
-				 && (!(isWidowedContext(receiver)))) {
+				if ((((longAt((rcvr + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+				 && (!(isWidowedContext(rcvr)))) {
 					/* begin frameOfMarriedContext: */
-					value = longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord));
+					value = longAt((rcvr + BaseHeaderSize) + (SenderIndex << ShiftForWord));
 					/* begin withoutSmallIntegerTags: */
 					assert((value & 1));
 					spouseFP = pointerForOop(value - 1);
@@ -24511,16 +24676,16 @@
 					}
 				}
 				else {
-					sp1 = (fetchStackPointerOf(receiver)) - 1;
+					sp1 = (fetchStackPointerOf(rcvr)) - 1;
 					for (i = 0; i <= sp1; i += 1) {
-						longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), longAt((receiver + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord)));
+						longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), longAt((rcvr + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord)));
 					}
 				}
 			}
 			newCopy = cloned;
 		}
 		else {
-			newCopy = clone(receiver);
+			newCopy = clone(rcvr);
 		}
 		if (newCopy == 0) {
 			(GIV(primFailCode) = PrimErrNoMemory); return;
@@ -25453,6 +25618,10 @@
 	}
 }
 
+
+/*	Special version of primitiveAt for accessing contexts.
+	Written to be varargs for use from mirror primitives. */
+
 static void
 primitiveContextAt(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ -25480,11 +25649,7 @@
 
 	index = longAt(GIV(stackPointer));
 	if (!((index & 1))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+		(GIV(primFailCode) = PrimErrBadArgument); return;
 	}
 	index = (index >> 1);
 
@@ -25498,7 +25663,7 @@
 
 		value = stObjectat(aContext, index);
 		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), value);
+		longAtput((sp = GIV(stackPointer) + ((GIV(argumentCount) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp;
 		return;
 	}
@@ -25580,11 +25745,7 @@
 		stSize = (sp11 >> 1);
 	l5:	/* end stackPointerForMaybeMarriedContext: */;
 		if (!(((index >= 1) && (index <= stSize)))) {
-			/* begin primitiveFail */
-			if (!GIV(primFailCode)) {
-				GIV(primFailCode) = 1;
-			}
-			return;
+			(GIV(primFailCode) = PrimErrBadIndex); return;
 		}
 		/* begin subscript:with:format: */
 		if (fmt <= 4) {
@@ -25601,7 +25762,7 @@
 		}
 	l3:	/* end subscript:with:format: */;
 		/* begin pop:thenPush: */
-		longAtput((sp1 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), value);
+		longAtput((sp1 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp1;
 		return;
 	}
@@ -25611,11 +25772,7 @@
 	assert((value1 & 1));
 	spouseFP = pointerForOop(value1 - 1);
 	if (!(((index >= 1) && (index <= (stackPointerIndexForFrame(spouseFP)))))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+		(GIV(primFailCode) = PrimErrBadIndex); return;
 	}
 	value = ((((usqInt)(longAt(spouseFP + FoxMethod)))) < heapBase
 		? ((index - 1) < ((frameNumArgs = (mframeCogMethod(spouseFP)->cmNumArgs)))
@@ -25625,10 +25782,14 @@
 				? longAt((spouseFP + FoxCallerSavedIP) + ((frameNumArgs1 - (index - 1)) * BytesPerWord))
 				: longAt(((spouseFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - (index - 1)) * BytesPerWord))));
 	/* begin pop:thenPush: */
-	longAtput((sp2 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), value);
+	longAtput((sp2 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 	GIV(stackPointer) = sp2;
 }
 
+
+/*	Special version of primitiveAtPut for accessing contexts.
+	Written to be varargs for use from mirror primitives. */
+
 static sqInt
 primitiveContextAtPut(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ -25659,18 +25820,14 @@
 	index = longAt(GIV(stackPointer) + (1 * BytesPerWord));
 	aContext = longAt(GIV(stackPointer) + (2 * BytesPerWord));
 	if (!((index & 1))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return null;
+		return (GIV(primFailCode) = PrimErrBadArgument);
 	}
 	hdr = longAt(aContext);
 	index = (index >> 1);
 	if (!(((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
 		stObjectatput(aContext, index, value);
 		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + ((3 - 1) * BytesPerWord)), value);
+		longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp;
 		return null;
 	}
@@ -25752,11 +25909,7 @@
 		stSize = (sp11 >> 1);
 	l4:	/* end stackPointerForMaybeMarriedContext: */;
 		if (!(((index >= 1) && (index <= stSize)))) {
-			/* begin primitiveFail */
-			if (!GIV(primFailCode)) {
-				GIV(primFailCode) = 1;
-			}
-			return null;
+			return (GIV(primFailCode) = PrimErrBadIndex);
 		}
 		/* begin subscript:with:storing:format: */
 		VM_LABEL(0subscriptwithstoringformat);
@@ -25808,7 +25961,7 @@
 			}
 		}
 		/* begin pop:thenPush: */
-		longAtput((sp1 = GIV(stackPointer) + ((3 - 1) * BytesPerWord)), value);
+		longAtput((sp1 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp1;
 		return null;
 	}
@@ -25818,15 +25971,10 @@
 	assert((value1 & 1));
 	spouseFP = pointerForOop(value1 - 1);
 	if (!(((index >= 1) && (index <= (stackPointerIndexForFrame(spouseFP)))))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return null;
+		return (GIV(primFailCode) = PrimErrBadIndex);
 	}
 	/* begin temporary:in:put: */
-	VM_LABEL(0temporaryinput);
-	;
+	VM_LABEL(1temporaryinput);
 	if ((((usqInt)(longAt(spouseFP + FoxMethod)))) < heapBase) {
 		/* begin mtemporary:in:put: */
 		longAtput(((index - 1) < ((frameNumArgs = (mframeCogMethod(spouseFP)->cmNumArgs)))
@@ -25843,11 +25991,15 @@
 		}
 	}
 	/* begin pop:thenPush: */
-	longAtput((sp2 = GIV(stackPointer) + ((3 - 1) * BytesPerWord)), value);
+	longAtput((sp2 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 	GIV(stackPointer) = sp2;
 	return null;
 }
 
+
+/*	Special version of primitiveSize for accessing contexts.
+	Written to be varargs for use from mirror primitives. */
+
 static void
 primitiveContextSize(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ -25947,11 +26099,9 @@
 	else {
 		sz = totalLength - fixedFields;
 	}
-	if (!GIV(primFailCode)) {
-		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + ((1 - 1) * BytesPerWord)), ((sz << 1) | 1));
-		GIV(stackPointer) = sp;
-	}
+	/* begin pop:thenPush: */
+	longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), ((sz << 1) | 1));
+	GIV(stackPointer) = sp;
 }
 
 
@@ -34444,31 +34594,77 @@
 static void
 primitiveSize(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt ccIndex;
+    sqInt class;
+    sqInt classFormat;
+    sqInt fixedFields;
+    sqInt fmt;
+    sqInt hdr;
     sqInt rcvr;
     char *sp;
     sqInt sz;
+    sqInt totalLength;
 
 	rcvr = longAt(GIV(stackPointer));
-	if ((rcvr & 1)) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+	if (((rcvr & 1))
+	 || ((
+	/* Integers are not indexable */
+
+(hdr = longAt(rcvr)),
+	((fmt = (((usqInt) hdr) >> 8) & 15)) < 2))) {
+		(GIV(primFailCode) = PrimErrBadReceiver); return;
 	}
-	if (((((usqInt) (longAt(rcvr))) >> 8) & 15) < 2) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+	if ((fmt == 3)
+	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
+		primitiveContextSize(); return;
 	}
-	sz = stSizeOf(rcvr);
-	if (!GIV(primFailCode)) {
-		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), ((sz << 1) | 1));
-		GIV(stackPointer) = sp;
+	/* begin lengthOf:baseHeader:format: */
+	if ((hdr & TypeMask) == HeaderTypeSizeAndClass) {
+		sz = (longAt(rcvr - (BytesPerWord * 2))) & LongSizeMask;
 	}
+	else {
+		sz = hdr & SizeMask;
+	}
+	sz -= hdr & Size4Bit;
+	if (fmt <= 4) {
+		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
+		goto l1;
+	}
+	if (fmt < 8) {
+		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> 2;
+		goto l1;
+	}
+	else {
+		totalLength = (sz - BaseHeaderSize) - (fmt & 3);
+		goto l1;
+	}
+l1:	/* end lengthOf:baseHeader:format: */;
+	/* begin fixedFieldsOf:format:length: */
+	if ((fmt > 4)
+	 || (fmt == 2)) {
+		fixedFields = 0;
+		goto l2;
+	}
+	if (fmt < 2) {
+		fixedFields = totalLength;
+		goto l2;
+	}
+	/* begin fetchClassOfNonInt: */
+	if (((ccIndex = (((usqInt) (longAt(rcvr))) >> 12) & 31)) == 0) {
+		class = (longAt(rcvr - BaseHeaderSize)) & AllButTypeMask;
+		goto l3;
+	}
+	else {
+		class = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord));
+		goto l3;
+	}
+l3:	/* end fetchClassOfNonInt: */;
+	classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1;
+	fixedFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1;
+l2:	/* end fixedFieldsOf:format:length: */;
+	/* begin pop:thenPush: */
+	longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), (((totalLength - fixedFields) << 1) | 1));
+	GIV(stackPointer) = sp;
 }
 
 
@@ -38230,6 +38426,7 @@
 printMethodDictionaryOf(sqInt behavior)
 {
     sqInt index;
+    sqInt meth;
     sqInt methodArray;
     sqInt selector;
 
@@ -38239,9 +38436,15 @@
 	for (index = SelectorStart; index <= ((fetchWordLengthOf(longAt((behavior + BaseHeaderSize) + (MethodDictionaryIndex << ShiftForWord)))) - 1); index += 1) {
 		selector = longAt(((longAt((behavior + BaseHeaderSize) + (MethodDictionaryIndex << ShiftForWord))) + BaseHeaderSize) + (index << ShiftForWord));
 		if (selector != GIV(nilObj)) {
+			meth = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord));
 			printOopShort(selector);
 			print(" => ");
-			printOopShort(longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord)));
+			printOopShort(meth);
+			print(" (");
+			printHex(selector);
+			print(" => ");
+			printHex(meth);
+			putchar(')');
 			/* begin cr */
 			printf("\n");
 		}
@@ -38252,6 +38455,7 @@
 printMethodDictionary(sqInt dictionary)
 {
     sqInt index;
+    sqInt meth;
     sqInt methodArray;
     sqInt selector;
 
@@ -38259,9 +38463,15 @@
 	for (index = SelectorStart; index <= ((fetchWordLengthOf(dictionary)) - 1); index += 1) {
 		selector = longAt((dictionary + BaseHeaderSize) + (index << ShiftForWord));
 		if (selector != GIV(nilObj)) {
+			meth = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord));
 			printOopShort(selector);
 			print(" => ");
-			printOopShort(longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord)));
+			printOopShort(meth);
+			print(" (");
+			printHex(selector);
+			print(" => ");
+			printHex(meth);
+			putchar(')');
 			/* begin cr */
 			printf("\n");
 		}
@@ -42309,6 +42519,7 @@
     sqInt fixedFields;
     sqInt fmt;
     sqInt hdr;
+    sqInt sp;
     sqInt stSize;
     sqInt sz;
     sqInt totalLength;
@@ -42325,44 +42536,61 @@
 	sz -= hdr & Size4Bit;
 	if (fmt <= 4) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
-		goto l1;
+		goto l2;
 	}
 	if (fmt < 8) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> 2;
-		goto l1;
+		goto l2;
 	}
 	else {
 		totalLength = (sz - BaseHeaderSize) - (fmt & 3);
-		goto l1;
+		goto l2;
 	}
-l1:	/* end lengthOf:baseHeader:format: */;
+l2:	/* end lengthOf:baseHeader:format: */;
 	/* begin fixedFieldsOf:format:length: */
 	if ((fmt > 4)
 	 || (fmt == 2)) {
 		fixedFields = 0;
-		goto l2;
+		goto l3;
 	}
 	if (fmt < 2) {
 		fixedFields = totalLength;
-		goto l2;
+		goto l3;
 	}
 	/* begin fetchClassOfNonInt: */
 	if (((ccIndex = (((usqInt) (longAt(array))) >> 12) & 31)) == 0) {
 		class = (longAt(array - BaseHeaderSize)) & AllButTypeMask;
-		goto l3;
+		goto l4;
 	}
 	else {
 		class = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord));
-		goto l3;
+		goto l4;
 	}
-l3:	/* end fetchClassOfNonInt: */;
+l4:	/* end fetchClassOfNonInt: */;
 	classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1;
 	fixedFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1;
-l2:	/* end fixedFieldsOf:format:length: */;
-	if (fmt == 3) {
-		assert(!(isContextHeader(hdr)));
+l3:	/* end fixedFieldsOf:format:length: */;
+	if ((fmt == 3)
+	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
+		/* begin fetchStackPointerOf: */
+		sp = longAt((array + BaseHeaderSize) + (StackPointerIndex << ShiftForWord));
+		if (!((sp & 1))) {
+			stSize = 0;
+			goto l1;
+		}
+		assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(array)));
+		stSize = (sp >> 1);
+	l1:	/* end fetchStackPointerOf: */;
+		if (((((usqInt) index)) >= (((usqInt) 1)))
+		 && (((((usqInt) index)) <= (((usqInt) stSize)))
+		 && ((((longAt((array + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+		 && (!(isWidowedContext(array)))))) {
+			return noInlineTemporaryin(index - 1, frameOfMarriedContext(array));
+		}
 	}
-	stSize = totalLength - fixedFields;
+	else {
+		stSize = totalLength - fixedFields;
+	}
 	if (((((usqInt) index)) >= (((usqInt) 1)))
 	 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 		/* begin subscript:with:format: */
@@ -42394,6 +42622,7 @@
     sqInt fixedFields;
     sqInt fmt;
     sqInt hdr;
+    sqInt sp;
     sqInt stSize;
     sqInt sz;
     sqInt totalLength;
@@ -42411,44 +42640,62 @@
 	sz -= hdr & Size4Bit;
 	if (fmt <= 4) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
-		goto l1;
+		goto l2;
 	}
 	if (fmt < 8) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> 2;
-		goto l1;
+		goto l2;
 	}
 	else {
 		totalLength = (sz - BaseHeaderSize) - (fmt & 3);
-		goto l1;
+		goto l2;
 	}
-l1:	/* end lengthOf:baseHeader:format: */;
+l2:	/* end lengthOf:baseHeader:format: */;
 	/* begin fixedFieldsOf:format:length: */
 	if ((fmt > 4)
 	 || (fmt == 2)) {
 		fixedFields = 0;
-		goto l2;
+		goto l3;
 	}
 	if (fmt < 2) {
 		fixedFields = totalLength;
-		goto l2;
+		goto l3;
 	}
 	/* begin fetchClassOfNonInt: */
 	if (((ccIndex = (((usqInt) (longAt(array))) >> 12) & 31)) == 0) {
 		class = (longAt(array - BaseHeaderSize)) & AllButTypeMask;
-		goto l3;
+		goto l4;
 	}
 	else {
 		class = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord));
-		goto l3;
+		goto l4;
 	}
-l3:	/* end fetchClassOfNonInt: */;
+l4:	/* end fetchClassOfNonInt: */;
 	classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1;
 	fixedFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1;
-l2:	/* end fixedFieldsOf:format:length: */;
-	if (fmt == 3) {
-		assert(!(isContextHeader(hdr)));
+l3:	/* end fixedFieldsOf:format:length: */;
+	if ((fmt == 3)
+	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
+		/* begin fetchStackPointerOf: */
+		sp = longAt((array + BaseHeaderSize) + (StackPointerIndex << ShiftForWord));
+		if (!((sp & 1))) {
+			stSize = 0;
+			goto l1;
+		}
+		assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(array)));
+		stSize = (sp >> 1);
+	l1:	/* end fetchStackPointerOf: */;
+		if (((((usqInt) index)) >= (((usqInt) 1)))
+		 && (((((usqInt) index)) <= (((usqInt) stSize)))
+		 && ((((longAt((array + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+		 && (!(isWidowedContext(array)))))) {
+			noInlineTemporaryinput(index - 1, frameOfMarriedContext(array), value);
+			return;
+		}
 	}
-	stSize = totalLength - fixedFields;
+	else {
+		stSize = totalLength - fixedFields;
+	}
 	if (((((usqInt) index)) >= (((usqInt) 1)))
 	 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 		/* begin subscript:with:storing:format: */

Modified: branches/Cog/src/vm/gcc3x-cointerpmt.c
===================================================================
--- branches/Cog/src/vm/gcc3x-cointerpmt.c	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/src/vm/gcc3x-cointerpmt.c	2011-08-19 21:33:12 UTC (rev 2488)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
    from
-	CoInterpreterMT VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CoInterpreterMT VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
  */
-static char __buildInfo[] = "CoInterpreterMT VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreterMT VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -459,7 +459,6 @@
 sqInt classExternalFunction(void);
 sqInt classExternalLibrary(void);
 sqInt classExternalStructure(void);
-sqInt classFieldOffset(void);
 sqInt classFloat(void);
 sqInt classFloatCompactIndex(void);
 sqInt classHeader(sqInt oop);
@@ -480,8 +479,6 @@
 static void commonAtPut(sqInt stringy);
 static void commonAt(sqInt stringy);
 sqInt compactClassAt(sqInt ccIndex);
-sqInt compactClassFieldLSB(void);
-sqInt compactClassFieldWidth(void);
 sqInt compactClassIndexOfHeader(sqInt header);
 sqInt compactClassIndexOf(sqInt oop);
 sqInt compactClassTable(void);
@@ -630,7 +627,7 @@
 static void initializeObjectMemory(sqInt bytesToShift);
 static void initializeStacknumSlotspageSizestackLimitOffsetstackPageHeadroom(char *theStackPages, sqInt stackSlots, sqInt slotsPerPage, sqInt stackLimitOffsetBytes, sqInt stackPageHeadroomBytes);
 static sqInt initStackPagesAndInterpret(void);
-static void installinAtCacheatstring(sqInt rcvr, sqInt *cache, sqInt atIx, sqInt stringy);
+static sqInt installinAtCacheatstring(sqInt rcvr, sqInt *cache, sqInt atIx, sqInt stringy);
 sqInt instanceSizeOf(sqInt classObj);
 sqInt instantiateClassindexableSize(sqInt classPointer, sqInt size);
 usqInt instructionPointerAddress(void);
@@ -649,6 +646,7 @@
 sqInt isCogMethodReference(sqInt methodHeader);
 sqInt isCompiledMethod(sqInt oop);
 static sqInt isContextHeader(sqInt aHeader);
+static sqInt isContextNonInt(sqInt oop);
 static sqInt isContext(sqInt oop);
 sqInt isFloatObject(sqInt oop);
 static sqInt isFree(StackPage * self_in_isFree);
@@ -693,6 +691,7 @@
 sqInt loadBitBltFrom(sqInt bb);
 static sqInt loadImageSegmentFromoutPointers(sqInt segmentWordArray, sqInt outPointerArray);
 void loadInitialContext(void);
+void longPrintOop(sqInt oop);
 static sqInt lookupInMethodCacheSelclass(sqInt selector, sqInt class);
 static sqInt lookupMethodInClass(sqInt class);
 static sqInt lookupMethodInDictionary(sqInt dictionary);
@@ -746,8 +745,11 @@
 static StackPage * newStackPage(void);
 usqInt nextProfileTickAddress(void);
 sqInt nilObject(void);
+sqInt noAssertHeaderOf(sqInt methodPointer);
 static void noAtCacheCommonAtPut(sqInt stringy);
 static void noAtCacheCommonAt(sqInt stringy);
+static sqInt noInlineTemporaryin(sqInt offset, char *theFP);
+static void noInlineTemporaryinput(sqInt offset, char *theFP, sqInt valueOop);
 static sqInt noMarkedContextsOnPage(StackPage *thePage);
 static sqInt nonWeakFieldsOf(sqInt oop);
 sqInt nullHeaderForMachineCodeMethod(void);
@@ -1222,8 +1224,8 @@
 _iss StackPage * stackPage;
 _iss sqInt nilObj;
 _iss usqInt instructionPointer;
+_iss sqInt argumentCount;
 _iss usqInt method;
-_iss sqInt argumentCount;
 _iss usqInt freeStart;
 _iss usqInt newMethod;
 _iss usqInt youngStart;
@@ -1983,13 +1985,16 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void);
-const char *interpreterVersion = "Croquet Closure Cog MT VM [CoInterpreterMT VMMaker.oscog-eem.117]";
+const char *interpreterVersion = "Croquet Closure Cog MT VM [CoInterpreterMT VMMaker.oscog-eem.119]";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 sqInt willNotThreadWarnCount;
 
 
 /*** Macros ***/
+#define classFieldOffset() (0 - BaseHeaderSize)
+#define compactClassFieldLSB() 12
+#define compactClassFieldWidth() 5
 #define compilationBreakpoint(sel, len) do { \
 	if ((len) == breakSelectorLength \
 	 && !strncmp((char *)((sel) + BaseHeaderSize), breakSelector, breakSelectorLength)) { \
@@ -2008,6 +2013,8 @@
 #define getDesiredCogCodeSize() integerObjectOf(desiredCogCodeSize)
 #define getMaxWaitingPriority() GIV(maxWaitingPriority)
 #define getNumThreads() GIV(numThreads)
+#define instFormatFieldLSB() 8
+#define instFormatFieldWidth() 4
 #define memory() memory
 #define mostRecentlyUsedPage() GIV(mostRecentlyUsedPage)
 #define nextOpenPIC methodObject
@@ -2018,7 +2025,6 @@
 #define remapBufferCount() GIV(remapBufferCount)
 #define setDesiredCogCodeSize(dccs) (desiredCogCodeSize = (dccs))
 #define stackPageAtpages(index,pages) ((pages) + (index))
-#define typeEtAlWord(cm) (((long *)(cm))[1])
 #define validate() 0
 #define youngStart() GIV(youngStart)
 
@@ -7790,36 +7796,39 @@
 							}
 						}
 					}
-					/* begin commonVariable:at:cacheIndex: */
-					VM_LABEL(0commonVariableatcacheIndex);
-					stSize = GIV(atCache)[atIx + AtCacheSize];
-					if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
-					 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
-						fmt = GIV(atCache)[atIx + AtCacheFmt];
-						if (fmt <= 4) {
-							fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
-							result = longAt((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord));
-							goto l73;
-						}
-						if (fmt < 8) {
+					if (!GIV(primFailCode)) {
+						/* begin commonVariable:at:cacheIndex: */
+						VM_LABEL(0commonVariableatcacheIndex);
+						stSize = GIV(atCache)[atIx + AtCacheSize];
+						if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
+						 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
+							fmt = GIV(atCache)[atIx + AtCacheFmt];
+							if (fmt <= 4) {
+								assert(!(isContextNonInt(rcvr)));
+								fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
+								result = longAt((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord));
+								goto l73;
+							}
+							if (fmt < 8) {
 
-							/* Bitmap */
+								/* Bitmap */
 
-							result1 = long32At((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2));
-							result = positive32BitIntegerFor(result1);
-							goto l73;
+								result1 = long32At((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2));
+								result = positive32BitIntegerFor(result1);
+								goto l73;
+							}
+							if (fmt >= 16) {
+								result = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CharacterTable << ShiftForWord))) + BaseHeaderSize) + ((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << ShiftForWord));
+								goto l73;
+							}
+							else {
+								result = (((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << 1) | 1);
+								goto l73;
+							}
 						}
-						if (fmt >= 16) {
-							result = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CharacterTable << ShiftForWord))) + BaseHeaderSize) + ((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << ShiftForWord));
-							goto l73;
-						}
-						else {
-							result = (((byteAt((rcvr + BaseHeaderSize) + (((index >> 1)) - 1))) << 1) | 1);
-							goto l73;
-						}
+						result = (GIV(primFailCode) = PrimErrBadIndex);
+					l73:	/* end commonVariable:at:cacheIndex: */;
 					}
-					result = (GIV(primFailCode) = PrimErrBadIndex);
-				l73:	/* end commonVariable:at:cacheIndex: */;
 					if (!GIV(primFailCode)) {
 						/* begin fetchNextBytecode */
 						currentBytecode = byteAtPointer(++localIP);
@@ -7827,6 +7836,8 @@
 						longAtPointerput((localSP += (2 - 1) * BytesPerWord), result);
 						goto l71;
 					}
+					/* begin initPrimCall */
+					GIV(primFailCode) = 0;
 				}
 				GIV(messageSelector) = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SpecialSelectors << ShiftForWord))) + BaseHeaderSize) + ((16 * 2) << ShiftForWord));
 				GIV(argumentCount) = 1;
@@ -7889,59 +7900,62 @@
 							}
 						}
 					}
-					/* begin commonVariable:at:put:cacheIndex: */
-					VM_LABEL(0commonVariableatputcacheIndex);
-					stSize = GIV(atCache)[atIx + AtCacheSize];
-					if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
-					 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
-						fmt = GIV(atCache)[atIx + AtCacheFmt];
-						if (fmt <= 4) {
-							fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
-							/* begin storePointer:ofObject:withValue: */
-							if ((((usqInt) rcvr)) < (((usqInt) GIV(youngStart)))) {
-								possibleRootStoreIntovalue(rcvr, value);
+					if (!GIV(primFailCode)) {
+						/* begin commonVariable:at:put:cacheIndex: */
+						VM_LABEL(0commonVariableatputcacheIndex);
+						stSize = GIV(atCache)[atIx + AtCacheSize];
+						if (((((usqInt) ((index >> 1)))) >= (((usqInt) 1)))
+						 && ((((usqInt) ((index >> 1)))) <= (((usqInt) stSize)))) {
+							fmt = GIV(atCache)[atIx + AtCacheFmt];
+							if (fmt <= 4) {
+								assert(!(isContextNonInt(rcvr)));
+								fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
+								/* begin storePointer:ofObject:withValue: */
+								if ((((usqInt) rcvr)) < (((usqInt) GIV(youngStart)))) {
+									possibleRootStoreIntovalue(rcvr, value);
+								}
+								longAtput((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord), value);
+								goto l75;
 							}
-							longAtput((rcvr + BaseHeaderSize) + (((((index >> 1)) + fixedFields) - 1) << ShiftForWord), value);
-							goto l75;
-						}
-						if (fmt < 8) {
+							if (fmt < 8) {
 
-							/* Bitmap */
+								/* Bitmap */
 
-							valToPut = positive32BitValueOf(value);
-							if (!GIV(primFailCode)) {
-								long32Atput((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2), valToPut);
+								valToPut = positive32BitValueOf(value);
+								if (!GIV(primFailCode)) {
+									long32Atput((rcvr + BaseHeaderSize) + ((((index >> 1)) - 1) << 2), valToPut);
+								}
+								goto l75;
 							}
-							goto l75;
-						}
-						if (fmt >= 16) {
+							if (fmt >= 16) {
 
-							/* Note fmt >= 16 is an artificial flag for strings */
+								/* Note fmt >= 16 is an artificial flag for strings */
 
-							valToPut = asciiOfCharacter(value);
-							if (!(!GIV(primFailCode))) {
-								goto l75;
+								valToPut = asciiOfCharacter(value);
+								if (!(!GIV(primFailCode))) {
+									goto l75;
+								}
 							}
-						}
-						else {
-							valToPut = value;
-						}
-						if ((valToPut & 1)) {
-							valToPut = (valToPut >> 1);
-							if (!((valToPut >= 0)
-								 && (valToPut <= 255))) {
-								/* begin primitiveFail */
-								if (!GIV(primFailCode)) {
-									GIV(primFailCode) = 1;
+							else {
+								valToPut = value;
+							}
+							if ((valToPut & 1)) {
+								valToPut = (valToPut >> 1);
+								if (!((valToPut >= 0)
+									 && (valToPut <= 255))) {
+									/* begin primitiveFail */
+									if (!GIV(primFailCode)) {
+										GIV(primFailCode) = 1;
+									}
+									goto l75;
 								}
+								byteAtput((rcvr + BaseHeaderSize) + (((index >> 1)) - 1), valToPut);
 								goto l75;
 							}
-							byteAtput((rcvr + BaseHeaderSize) + (((index >> 1)) - 1), valToPut);
-							goto l75;
 						}
+						GIV(primFailCode) = PrimErrBadIndex;
+					l75:	/* end commonVariable:at:put:cacheIndex: */;
 					}
-					GIV(primFailCode) = PrimErrBadIndex;
-				l75:	/* end commonVariable:at:put:cacheIndex: */;
 					if (!GIV(primFailCode)) {
 						/* begin fetchNextBytecode */
 						currentBytecode = byteAtPointer(++localIP);
@@ -7949,6 +7963,8 @@
 						longAtPointerput((localSP += (3 - 1) * BytesPerWord), value);
 						goto l74;
 					}
+					/* begin initPrimCall */
+					GIV(primFailCode) = 0;
 				}
 				GIV(messageSelector) = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SpecialSelectors << ShiftForWord))) + BaseHeaderSize) + ((17 * 2) << ShiftForWord));
 				GIV(argumentCount) = 2;
@@ -11728,7 +11744,7 @@
 				 || ((heapMapAtWord(pointerForOop(fieldOop))) == 0)) {
 					print("object leak in ");
 					printHex(obj);
-					print(" class ");
+					print(" class = ");
 					printHex(fieldOop);
 					/* begin cr */
 					printf("\n");
@@ -11795,6 +11811,8 @@
 								printHex(obj);
 								print(" @ ");
 								printNum(fi);
+								print(" = ");
+								printHex(fieldOop);
 								/* begin cr */
 								printf("\n");
 								ok = 0;
@@ -12330,12 +12348,6 @@
 }
 
 sqInt
-classFieldOffset(void)
-{
-	return 0 - BaseHeaderSize;
-}
-
-sqInt
 classFloat(void)
 {
 	return longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassFloat << ShiftForWord));
@@ -12685,7 +12697,12 @@
 
 		atIx = (rcvr & AtCacheMask) + AtPutBase;
 		if (!((GIV(atCache)[atIx + AtCacheOop]) == rcvr)) {
-			installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy);
+			if (!(installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy))) {
+				assert(isContextNonInt(rcvr));
+				/* begin initPrimCall */
+				GIV(primFailCode) = 0;
+				primitiveContextAtPut(); return;
+			}
 		}
 		if (!GIV(primFailCode)) {
 			/* begin commonVariable:at:put:cacheIndex: */
@@ -12695,6 +12712,7 @@
 			 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 				fmt = GIV(atCache)[atIx + AtCacheFmt];
 				if (fmt <= 4) {
+					assert(!(isContextNonInt(rcvr)));
 					fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
 					/* begin storePointer:ofObject:withValue: */
 					if ((((usqInt) rcvr)) < (((usqInt) GIV(youngStart)))) {
@@ -12812,7 +12830,12 @@
 
 		atIx = rcvr & AtCacheMask;
 		if (!((GIV(atCache)[atIx + AtCacheOop]) == rcvr)) {
-			installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy);
+			if (!(installinAtCacheatstring(rcvr, GIV(atCache), atIx, stringy))) {
+				assert(isContextNonInt(rcvr));
+				/* begin initPrimCall */
+				GIV(primFailCode) = 0;
+				primitiveContextAt(); return;
+			}
 		}
 		if (!GIV(primFailCode)) {
 			/* begin commonVariable:at:cacheIndex: */
@@ -12822,6 +12845,7 @@
 			 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 				fmt = GIV(atCache)[atIx + AtCacheFmt];
 				if (fmt <= 4) {
+					assert(!(isContextNonInt(rcvr)));
 					fixedFields = GIV(atCache)[atIx + AtCacheFixedFields];
 					result = longAt((rcvr + BaseHeaderSize) + (((index + fixedFields) - 1) << ShiftForWord));
 					goto l1;
@@ -12883,18 +12907,6 @@
 }
 
 sqInt
-compactClassFieldLSB(void)
-{
-	return 12;
-}
-
-sqInt
-compactClassFieldWidth(void)
-{
-	return 5;
-}
-
-sqInt
 compactClassIndexOfHeader(sqInt header)
 {
 	return (((usqInt) header) >> 12) & 31;
@@ -18676,6 +18688,7 @@
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt activeContext;
     sqInt activeProc;
+    sqInt activeProc1;
     sqInt aMethodObj;
     StackPage *newPage;
     sqInt stackPageBytes;
@@ -18696,8 +18709,8 @@
 		clearLeakMapAndMapAccessibleObjects();
 		assert(checkHeapIntegrity());
 	}
-	activeProc = longAt(((longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SchedulerAssociation << ShiftForWord))) + BaseHeaderSize) + (ValueIndex << ShiftForWord))) + BaseHeaderSize) + (ActiveProcessIndex << ShiftForWord));
-	activeContext = longAt((activeProc + BaseHeaderSize) + (SuspendedContextIndex << ShiftForWord));
+	activeProc1 = longAt(((longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SchedulerAssociation << ShiftForWord))) + BaseHeaderSize) + (ValueIndex << ShiftForWord))) + BaseHeaderSize) + (ActiveProcessIndex << ShiftForWord));
+	activeContext = longAt((activeProc1 + BaseHeaderSize) + (SuspendedContextIndex << ShiftForWord));
 	/* begin marryContextInNewStackPageAndInitializeInterpreterRegisters: */
 	VM_LABEL(0marryContextInNewStackPageAndInitializeInterpreterRegisters);
 	assert(GIV(stackPage) == 0);
@@ -18720,6 +18733,7 @@
 	top = longAt(GIV(stackPointer));
 	GIV(stackPointer) += BytesPerWord;
 	GIV(instructionPointer) = ((sqInt) top);
+	activeProc = longAt(((longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SchedulerAssociation << ShiftForWord))) + BaseHeaderSize) + (ValueIndex << ShiftForWord))) + BaseHeaderSize) + (ActiveProcessIndex << ShiftForWord));
 	assert((ownerIndexOfProcess(activeProc)) == 0);
 	GIV(activeProcessAffined) = (ownerIndexOfThreadId((GIV(processHasThreadId)
 	? longAt((activeProc + BaseHeaderSize) + (ThreadIdIndex << ShiftForWord))
@@ -18730,10 +18744,12 @@
 }
 
 
-/*	Install the oop of this object in the given cache (at or atPut), along
-	with its size, format and fixedSize */
+/*	Attempt to install the oop of this object in the given cache (at or
+	atPut), along with its size, format and fixedSize. Answer if this was
+	successful. 
+ */
 
-static void
+static sqInt
 installinAtCacheatstring(sqInt rcvr, sqInt *cache, sqInt atIx, sqInt stringy)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt ccIndex;
@@ -18749,11 +18765,8 @@
 	fmt = (((usqInt) hdr) >> 8) & 15;
 	if ((fmt == 3)
 	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+		GIV(primFailCode) = PrimErrBadReceiver;
+		return 0;
 	}
 	/* begin lengthOf:baseHeader:format: */
 	if ((hdr & TypeMask) == HeaderTypeSizeAndClass) {
@@ -18805,6 +18818,7 @@
 	: fmt));
 	cache[atIx + AtCacheFixedFields] = fixedFields;
 	cache[atIx + AtCacheSize] = (totalLength - fixedFields);
+	return 1;
 }
 
 
@@ -19325,6 +19339,12 @@
 }
 
 static sqInt
+isContextNonInt(sqInt oop)
+{
+	return ((((usqInt) (longAt(oop))) >> 12) & 31) == ClassMethodContextCompactIndex;
+}
+
+static sqInt
 isContext(sqInt oop)
 {
 	return ((oop & 1) == 0)
@@ -20312,6 +20332,7 @@
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt activeContext;
     sqInt activeProc;
+    sqInt activeProc1;
     sqInt aMethodObj;
     StackPage *newPage;
     char *theFP;
@@ -20321,8 +20342,8 @@
 		clearLeakMapAndMapAccessibleObjects();
 		assert(checkHeapIntegrity());
 	}
-	activeProc = longAt(((longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SchedulerAssociation << ShiftForWord))) + BaseHeaderSize) + (ValueIndex << ShiftForWord))) + BaseHeaderSize) + (ActiveProcessIndex << ShiftForWord));
-	activeContext = longAt((activeProc + BaseHeaderSize) + (SuspendedContextIndex << ShiftForWord));
+	activeProc1 = longAt(((longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SchedulerAssociation << ShiftForWord))) + BaseHeaderSize) + (ValueIndex << ShiftForWord))) + BaseHeaderSize) + (ActiveProcessIndex << ShiftForWord));
+	activeContext = longAt((activeProc1 + BaseHeaderSize) + (SuspendedContextIndex << ShiftForWord));
 	/* begin marryContextInNewStackPageAndInitializeInterpreterRegisters: */
 	VM_LABEL(1marryContextInNewStackPageAndInitializeInterpreterRegisters);
 	assert(GIV(stackPage) == 0);
@@ -20345,13 +20366,110 @@
 	top = longAt(GIV(stackPointer));
 	GIV(stackPointer) += BytesPerWord;
 	GIV(instructionPointer) = ((sqInt) top);
+	activeProc = longAt(((longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SchedulerAssociation << ShiftForWord))) + BaseHeaderSize) + (ValueIndex << ShiftForWord))) + BaseHeaderSize) + (ActiveProcessIndex << ShiftForWord));
 	assert((ownerIndexOfProcess(activeProc)) == 0);
 	GIV(activeProcessAffined) = (ownerIndexOfThreadId((GIV(processHasThreadId)
 	? longAt((activeProc + BaseHeaderSize) + (ThreadIdIndex << ShiftForWord))
 	: GIV(nilObj)))) != 0;
 }
 
+void
+longPrintOop(sqInt oop)
+{
+    sqInt byte;
+    sqInt bytecodesPerLine;
+    sqInt fieldOop;
+    sqInt fmt;
+    sqInt header;
+    sqInt index;
+    sqInt lastIndex;
+    sqInt startIP;
+    sqInt sz;
 
+	if (((oop & 1))
+	 || ((!(((oop >= heapBase) && (oop <= GIV(freeStart)))))
+	 || (((oop & (BytesPerWord - 1)) != 0)
+	 || ((((longAt(oop)) & TypeMask) == HeaderTypeFree)
+	 || (((((fmt = (((usqInt) (longAt(oop))) >> 8) & 15)) >= 5) && (((fmt = (((usqInt) (longAt(oop))) >> 8) & 15)) <= 11))))))) {
+		printOop(oop); return;
+	}
+	printHex(oop);
+	print(": a(n) ");
+	printNameOfClasscount(fetchClassOfNonInt(oop), 5);
+	if (fmt > 4) {
+		print(" nbytes ");
+		printNum(byteSizeOf(oop));
+	}
+	/* begin cr */
+	printf("\n");
+	lastIndex = ((64 < ((startIP = ((sqInt) (lastPointerOf(oop)) >> 2)))) ? 64 : ((startIP = ((sqInt) (lastPointerOf(oop)) >> 2))));
+	if (lastIndex > 0) {
+		for (index = 1; index <= lastIndex; index += 1) {
+			fieldOop = longAt((oop + BaseHeaderSize) + ((index - 1) << ShiftForWord));
+			/* begin space */
+			/* begin printChar: */
+			putchar(' ');
+			printHex(fieldOop);
+			/* begin space */
+			/* begin printChar: */
+			putchar(' ');
+			printOopShort(fieldOop);
+			/* begin cr */
+			printf("\n");
+		}
+	}
+	if (((((usqInt) (longAt(oop))) >> 8) & 15) >= 12) {
+		startIP = (startIP * BytesPerWord) + 1;
+		/* begin lengthOf: */
+		header = longAt(oop);
+		/* begin lengthOf:baseHeader:format: */
+		if ((header & TypeMask) == HeaderTypeSizeAndClass) {
+			sz = (longAt(oop - (BytesPerWord * 2))) & LongSizeMask;
+		}
+		else {
+			sz = header & SizeMask;
+		}
+		sz -= header & Size4Bit;
+		if (((((usqInt) header) >> 8) & 15) <= 4) {
+			lastIndex = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
+			goto l1;
+		}
+		if (((((usqInt) header) >> 8) & 15) < 8) {
+			lastIndex = ((usqInt) (sz - BaseHeaderSize)) >> 2;
+			goto l1;
+		}
+		else {
+			lastIndex = (sz - BaseHeaderSize) - (((((usqInt) header) >> 8) & 15) & 3);
+			goto l1;
+		}
+	l1:	/* end lengthOf: */;
+		if ((lastIndex - startIP) > 100) {
+			lastIndex = startIP + 100;
+		}
+		bytecodesPerLine = 8;
+		for (index = startIP; index <= lastIndex; index += 1) {
+			byte = byteAt((oop + BaseHeaderSize) + (index - 1));
+			printf(" %02x/%-3d", byte,byte);
+			if ((((index - startIP) + 1) % bytecodesPerLine) == 0) {
+				/* begin cr */
+				printf("\n");
+			}
+		}
+		if (!((((lastIndex - startIP) + 1) % bytecodesPerLine) == 0)) {
+			/* begin cr */
+			printf("\n");
+		}
+	}
+	else {
+		if (startIP > 64) {
+			print("...");
+			/* begin cr */
+			printf("\n");
+		}
+	}
+}
+
+
 /*	This method implements a simple method lookup cache. If an entry for the
 	given selector and class is found in the cache, set the values of
 	'newMethod' and 'primitiveFunctionPointer' and return true. Otherwise,
@@ -22797,7 +22915,18 @@
 	return GIV(nilObj);
 }
 
+sqInt
+noAssertHeaderOf(sqInt methodPointer)
+{
+    sqInt methodHeader;
 
+	methodHeader = longAt((methodPointer + BaseHeaderSize) + (HeaderIndex << ShiftForWord));
+	return (isCogMethodReference(methodHeader)
+		? (((CogMethod *) methodHeader)->methodHeader)
+		: methodHeader);
+}
+
+
 /*	This code is called if the receiver responds primitively to at:Put:.
 	The cogit can implement at: & at:put: quickly in machine code, and needs a
 	backup that provides error codes. But it does not want the at cache so it
@@ -22882,7 +23011,47 @@
 	}
 }
 
+static sqInt
+noInlineTemporaryin(sqInt offset, char *theFP)
+{
+    sqInt frameNumArgs;
+    sqInt frameNumArgs1;
 
+	return ((((usqInt)(longAt(theFP + FoxMethod)))) < heapBase
+		? (offset < ((frameNumArgs = (mframeCogMethod(theFP)->cmNumArgs)))
+				? longAt((theFP + FoxCallerSavedIP) + ((frameNumArgs - offset) * BytesPerWord))
+				: longAt(((theFP + FoxMFReceiver) - BytesPerWord) + ((frameNumArgs - offset) * BytesPerWord)))
+		: (offset < ((frameNumArgs1 = byteAt((theFP + FoxIFrameFlags) + 1)))
+				? longAt((theFP + FoxCallerSavedIP) + ((frameNumArgs1 - offset) * BytesPerWord))
+				: longAt(((theFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - offset) * BytesPerWord))));
+}
+
+static void
+noInlineTemporaryinput(sqInt offset, char *theFP, sqInt valueOop)
+{
+    sqInt frameNumArgs;
+    sqInt frameNumArgs1;
+
+	/* begin temporary:in:put: */
+	VM_LABEL(0temporaryinput);
+	if ((((usqInt)(longAt(theFP + FoxMethod)))) < heapBase) {
+		/* begin mtemporary:in:put: */
+		longAtput((offset < ((frameNumArgs = (mframeCogMethod(theFP)->cmNumArgs)))
+			? (theFP + FoxCallerSavedIP) + ((frameNumArgs - offset) * BytesPerWord)
+			: ((theFP + FoxMFReceiver) - BytesPerWord) + ((frameNumArgs - offset) * BytesPerWord)), valueOop);
+	}
+	else {
+		/* begin itemporary:in:put: */
+		if (offset < ((frameNumArgs1 = byteAt((theFP + FoxIFrameFlags) + 1)))) {
+			longAtput((theFP + FoxCallerSavedIP) + ((frameNumArgs1 - offset) * BytesPerWord), valueOop);
+		}
+		else {
+			longAtput(((theFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - offset) * BytesPerWord), valueOop);
+		}
+	}
+}
+
+
 /*	Answer true if there are no marked contexts on thePage. */
 
 static sqInt
@@ -25668,7 +25837,7 @@
     sqInt methodHeader;
     sqInt newCopy;
     sqInt objHeader;
-    sqInt receiver;
+    sqInt rcvr;
     char *sp;
     sqInt sp1;
     char *spouseFP;
@@ -25676,29 +25845,29 @@
     sqInt valuePointer;
     sqInt valuePointer1;
 
-	receiver = longAt(GIV(stackPointer));
-	if ((receiver & 1)) {
-		newCopy = receiver;
+	rcvr = longAt(GIV(stackPointer));
+	if ((rcvr & 1)) {
+		newCopy = rcvr;
 	}
 	else {
-		objHeader = longAt(receiver);
+		objHeader = longAt(rcvr);
 		if (((((usqInt) objHeader) >> 12) & 31) == ClassMethodContextCompactIndex) {
 			/* begin cloneContext: */
 			VM_LABEL(0cloneContext);
-			cloned = eeInstantiateMethodContextByteSize(byteSizeOf(receiver));
+			cloned = eeInstantiateMethodContextByteSize(byteSizeOf(rcvr));
 			if (cloned != 0) {
 				for (i = 0; i <= StackPointerIndex; i += 1) {
 					/* begin storePointerUnchecked:ofObject:withValue: */
-					valuePointer = externalInstVarofContext(i, receiver);
+					valuePointer = externalInstVarofContext(i, rcvr);
 					longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), valuePointer);
 				}
 				for (i = MethodIndex; i <= ReceiverIndex; i += 1) {
-					longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), longAt((receiver + BaseHeaderSize) + (i << ShiftForWord)));
+					longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), longAt((rcvr + BaseHeaderSize) + (i << ShiftForWord)));
 				}
-				if ((((longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
-				 && (!(isWidowedContext(receiver)))) {
+				if ((((longAt((rcvr + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+				 && (!(isWidowedContext(rcvr)))) {
 					/* begin frameOfMarriedContext: */
-					value = longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord));
+					value = longAt((rcvr + BaseHeaderSize) + (SenderIndex << ShiftForWord));
 					/* begin withoutSmallIntegerTags: */
 					assert((value & 1));
 					spouseFP = pointerForOop(value - 1);
@@ -25716,16 +25885,16 @@
 					}
 				}
 				else {
-					sp1 = (fetchStackPointerOf(receiver)) - 1;
+					sp1 = (fetchStackPointerOf(rcvr)) - 1;
 					for (i = 0; i <= sp1; i += 1) {
-						longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), longAt((receiver + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord)));
+						longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), longAt((rcvr + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord)));
 					}
 				}
 			}
 			newCopy = cloned;
 		}
 		else {
-			newCopy = clone(receiver);
+			newCopy = clone(rcvr);
 		}
 		if (newCopy == 0) {
 			(GIV(primFailCode) = PrimErrNoMemory); return;
@@ -26658,6 +26827,10 @@
 	}
 }
 
+
+/*	Special version of primitiveAt for accessing contexts.
+	Written to be varargs for use from mirror primitives. */
+
 static void
 primitiveContextAt(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ -26685,11 +26858,7 @@
 
 	index = longAt(GIV(stackPointer));
 	if (!((index & 1))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+		(GIV(primFailCode) = PrimErrBadArgument); return;
 	}
 	index = (index >> 1);
 
@@ -26703,7 +26872,7 @@
 
 		value = stObjectat(aContext, index);
 		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), value);
+		longAtput((sp = GIV(stackPointer) + ((GIV(argumentCount) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp;
 		return;
 	}
@@ -26785,11 +26954,7 @@
 		stSize = (sp11 >> 1);
 	l5:	/* end stackPointerForMaybeMarriedContext: */;
 		if (!(((index >= 1) && (index <= stSize)))) {
-			/* begin primitiveFail */
-			if (!GIV(primFailCode)) {
-				GIV(primFailCode) = 1;
-			}
-			return;
+			(GIV(primFailCode) = PrimErrBadIndex); return;
 		}
 		/* begin subscript:with:format: */
 		if (fmt <= 4) {
@@ -26806,7 +26971,7 @@
 		}
 	l3:	/* end subscript:with:format: */;
 		/* begin pop:thenPush: */
-		longAtput((sp1 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), value);
+		longAtput((sp1 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp1;
 		return;
 	}
@@ -26816,11 +26981,7 @@
 	assert((value1 & 1));
 	spouseFP = pointerForOop(value1 - 1);
 	if (!(((index >= 1) && (index <= (stackPointerIndexForFrame(spouseFP)))))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+		(GIV(primFailCode) = PrimErrBadIndex); return;
 	}
 	value = ((((usqInt)(longAt(spouseFP + FoxMethod)))) < heapBase
 		? ((index - 1) < ((frameNumArgs = (mframeCogMethod(spouseFP)->cmNumArgs)))
@@ -26830,10 +26991,14 @@
 				? longAt((spouseFP + FoxCallerSavedIP) + ((frameNumArgs1 - (index - 1)) * BytesPerWord))
 				: longAt(((spouseFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - (index - 1)) * BytesPerWord))));
 	/* begin pop:thenPush: */
-	longAtput((sp2 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), value);
+	longAtput((sp2 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 	GIV(stackPointer) = sp2;
 }
 
+
+/*	Special version of primitiveAtPut for accessing contexts.
+	Written to be varargs for use from mirror primitives. */
+
 static sqInt
 primitiveContextAtPut(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ -26864,18 +27029,14 @@
 	index = longAt(GIV(stackPointer) + (1 * BytesPerWord));
 	aContext = longAt(GIV(stackPointer) + (2 * BytesPerWord));
 	if (!((index & 1))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return null;
+		return (GIV(primFailCode) = PrimErrBadArgument);
 	}
 	hdr = longAt(aContext);
 	index = (index >> 1);
 	if (!(((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
 		stObjectatput(aContext, index, value);
 		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + ((3 - 1) * BytesPerWord)), value);
+		longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp;
 		return null;
 	}
@@ -26957,11 +27118,7 @@
 		stSize = (sp11 >> 1);
 	l4:	/* end stackPointerForMaybeMarriedContext: */;
 		if (!(((index >= 1) && (index <= stSize)))) {
-			/* begin primitiveFail */
-			if (!GIV(primFailCode)) {
-				GIV(primFailCode) = 1;
-			}
-			return null;
+			return (GIV(primFailCode) = PrimErrBadIndex);
 		}
 		/* begin subscript:with:storing:format: */
 		VM_LABEL(0subscriptwithstoringformat);
@@ -27013,7 +27170,7 @@
 			}
 		}
 		/* begin pop:thenPush: */
-		longAtput((sp1 = GIV(stackPointer) + ((3 - 1) * BytesPerWord)), value);
+		longAtput((sp1 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 		GIV(stackPointer) = sp1;
 		return null;
 	}
@@ -27023,15 +27180,10 @@
 	assert((value1 & 1));
 	spouseFP = pointerForOop(value1 - 1);
 	if (!(((index >= 1) && (index <= (stackPointerIndexForFrame(spouseFP)))))) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return null;
+		return (GIV(primFailCode) = PrimErrBadIndex);
 	}
 	/* begin temporary:in:put: */
-	VM_LABEL(0temporaryinput);
-	;
+	VM_LABEL(1temporaryinput);
 	if ((((usqInt)(longAt(spouseFP + FoxMethod)))) < heapBase) {
 		/* begin mtemporary:in:put: */
 		longAtput(((index - 1) < ((frameNumArgs = (mframeCogMethod(spouseFP)->cmNumArgs)))
@@ -27048,11 +27200,15 @@
 		}
 	}
 	/* begin pop:thenPush: */
-	longAtput((sp2 = GIV(stackPointer) + ((3 - 1) * BytesPerWord)), value);
+	longAtput((sp2 = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), value);
 	GIV(stackPointer) = sp2;
 	return null;
 }
 
+
+/*	Special version of primitiveSize for accessing contexts.
+	Written to be varargs for use from mirror primitives. */
+
 static void
 primitiveContextSize(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ -27152,11 +27308,9 @@
 	else {
 		sz = totalLength - fixedFields;
 	}
-	if (!GIV(primFailCode)) {
-		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + ((1 - 1) * BytesPerWord)), ((sz << 1) | 1));
-		GIV(stackPointer) = sp;
-	}
+	/* begin pop:thenPush: */
+	longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), ((sz << 1) | 1));
+	GIV(stackPointer) = sp;
 }
 
 
@@ -35749,31 +35903,77 @@
 static void
 primitiveSize(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt ccIndex;
+    sqInt class;
+    sqInt classFormat;
+    sqInt fixedFields;
+    sqInt fmt;
+    sqInt hdr;
     sqInt rcvr;
     char *sp;
     sqInt sz;
+    sqInt totalLength;
 
 	rcvr = longAt(GIV(stackPointer));
-	if ((rcvr & 1)) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+	if (((rcvr & 1))
+	 || ((
+	/* Integers are not indexable */
+
+(hdr = longAt(rcvr)),
+	((fmt = (((usqInt) hdr) >> 8) & 15)) < 2))) {
+		(GIV(primFailCode) = PrimErrBadReceiver); return;
 	}
-	if (((((usqInt) (longAt(rcvr))) >> 8) & 15) < 2) {
-		/* begin primitiveFail */
-		if (!GIV(primFailCode)) {
-			GIV(primFailCode) = 1;
-		}
-		return;
+	if ((fmt == 3)
+	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
+		primitiveContextSize(); return;
 	}
-	sz = stSizeOf(rcvr);
-	if (!GIV(primFailCode)) {
-		/* begin pop:thenPush: */
-		longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), ((sz << 1) | 1));
-		GIV(stackPointer) = sp;
+	/* begin lengthOf:baseHeader:format: */
+	if ((hdr & TypeMask) == HeaderTypeSizeAndClass) {
+		sz = (longAt(rcvr - (BytesPerWord * 2))) & LongSizeMask;
 	}
+	else {
+		sz = hdr & SizeMask;
+	}
+	sz -= hdr & Size4Bit;
+	if (fmt <= 4) {
+		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
+		goto l1;
+	}
+	if (fmt < 8) {
+		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> 2;
+		goto l1;
+	}
+	else {
+		totalLength = (sz - BaseHeaderSize) - (fmt & 3);
+		goto l1;
+	}
+l1:	/* end lengthOf:baseHeader:format: */;
+	/* begin fixedFieldsOf:format:length: */
+	if ((fmt > 4)
+	 || (fmt == 2)) {
+		fixedFields = 0;
+		goto l2;
+	}
+	if (fmt < 2) {
+		fixedFields = totalLength;
+		goto l2;
+	}
+	/* begin fetchClassOfNonInt: */
+	if (((ccIndex = (((usqInt) (longAt(rcvr))) >> 12) & 31)) == 0) {
+		class = (longAt(rcvr - BaseHeaderSize)) & AllButTypeMask;
+		goto l3;
+	}
+	else {
+		class = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord));
+		goto l3;
+	}
+l3:	/* end fetchClassOfNonInt: */;
+	classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1;
+	fixedFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1;
+l2:	/* end fixedFieldsOf:format:length: */;
+	/* begin pop:thenPush: */
+	longAtput((sp = GIV(stackPointer) + (((GIV(argumentCount) + 1) - 1) * BytesPerWord)), (((totalLength - fixedFields) << 1) | 1));
+	GIV(stackPointer) = sp;
 }
 
 
@@ -39577,6 +39777,7 @@
 printMethodDictionaryOf(sqInt behavior)
 {
     sqInt index;
+    sqInt meth;
     sqInt methodArray;
     sqInt selector;
 
@@ -39586,9 +39787,15 @@
 	for (index = SelectorStart; index <= ((fetchWordLengthOf(longAt((behavior + BaseHeaderSize) + (MethodDictionaryIndex << ShiftForWord)))) - 1); index += 1) {
 		selector = longAt(((longAt((behavior + BaseHeaderSize) + (MethodDictionaryIndex << ShiftForWord))) + BaseHeaderSize) + (index << ShiftForWord));
 		if (selector != GIV(nilObj)) {
+			meth = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord));
 			printOopShort(selector);
 			print(" => ");
-			printOopShort(longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord)));
+			printOopShort(meth);
+			print(" (");
+			printHex(selector);
+			print(" => ");
+			printHex(meth);
+			putchar(')');
 			/* begin cr */
 			printf("\n");
 		}
@@ -39599,6 +39806,7 @@
 printMethodDictionary(sqInt dictionary)
 {
     sqInt index;
+    sqInt meth;
     sqInt methodArray;
     sqInt selector;
 
@@ -39606,9 +39814,15 @@
 	for (index = SelectorStart; index <= ((fetchWordLengthOf(dictionary)) - 1); index += 1) {
 		selector = longAt((dictionary + BaseHeaderSize) + (index << ShiftForWord));
 		if (selector != GIV(nilObj)) {
+			meth = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord));
 			printOopShort(selector);
 			print(" => ");
-			printOopShort(longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << ShiftForWord)));
+			printOopShort(meth);
+			print(" (");
+			printHex(selector);
+			print(" => ");
+			printHex(meth);
+			putchar(')');
 			/* begin cr */
 			printf("\n");
 		}
@@ -43803,6 +44017,7 @@
     sqInt fixedFields;
     sqInt fmt;
     sqInt hdr;
+    sqInt sp;
     sqInt stSize;
     sqInt sz;
     sqInt totalLength;
@@ -43819,44 +44034,61 @@
 	sz -= hdr & Size4Bit;
 	if (fmt <= 4) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
-		goto l1;
+		goto l2;
 	}
 	if (fmt < 8) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> 2;
-		goto l1;
+		goto l2;
 	}
 	else {
 		totalLength = (sz - BaseHeaderSize) - (fmt & 3);
-		goto l1;
+		goto l2;
 	}
-l1:	/* end lengthOf:baseHeader:format: */;
+l2:	/* end lengthOf:baseHeader:format: */;
 	/* begin fixedFieldsOf:format:length: */
 	if ((fmt > 4)
 	 || (fmt == 2)) {
 		fixedFields = 0;
-		goto l2;
+		goto l3;
 	}
 	if (fmt < 2) {
 		fixedFields = totalLength;
-		goto l2;
+		goto l3;
 	}
 	/* begin fetchClassOfNonInt: */
 	if (((ccIndex = (((usqInt) (longAt(array))) >> 12) & 31)) == 0) {
 		class = (longAt(array - BaseHeaderSize)) & AllButTypeMask;
-		goto l3;
+		goto l4;
 	}
 	else {
 		class = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord));
-		goto l3;
+		goto l4;
 	}
-l3:	/* end fetchClassOfNonInt: */;
+l4:	/* end fetchClassOfNonInt: */;
 	classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1;
 	fixedFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1;
-l2:	/* end fixedFieldsOf:format:length: */;
-	if (fmt == 3) {
-		assert(!(isContextHeader(hdr)));
+l3:	/* end fixedFieldsOf:format:length: */;
+	if ((fmt == 3)
+	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
+		/* begin fetchStackPointerOf: */
+		sp = longAt((array + BaseHeaderSize) + (StackPointerIndex << ShiftForWord));
+		if (!((sp & 1))) {
+			stSize = 0;
+			goto l1;
+		}
+		assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(array)));
+		stSize = (sp >> 1);
+	l1:	/* end fetchStackPointerOf: */;
+		if (((((usqInt) index)) >= (((usqInt) 1)))
+		 && (((((usqInt) index)) <= (((usqInt) stSize)))
+		 && ((((longAt((array + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+		 && (!(isWidowedContext(array)))))) {
+			return noInlineTemporaryin(index - 1, frameOfMarriedContext(array));
+		}
 	}
-	stSize = totalLength - fixedFields;
+	else {
+		stSize = totalLength - fixedFields;
+	}
 	if (((((usqInt) index)) >= (((usqInt) 1)))
 	 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 		/* begin subscript:with:format: */
@@ -43888,6 +44120,7 @@
     sqInt fixedFields;
     sqInt fmt;
     sqInt hdr;
+    sqInt sp;
     sqInt stSize;
     sqInt sz;
     sqInt totalLength;
@@ -43905,44 +44138,62 @@
 	sz -= hdr & Size4Bit;
 	if (fmt <= 4) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> ShiftForWord;
-		goto l1;
+		goto l2;
 	}
 	if (fmt < 8) {
 		totalLength = ((usqInt) (sz - BaseHeaderSize)) >> 2;
-		goto l1;
+		goto l2;
 	}
 	else {
 		totalLength = (sz - BaseHeaderSize) - (fmt & 3);
-		goto l1;
+		goto l2;
 	}
-l1:	/* end lengthOf:baseHeader:format: */;
+l2:	/* end lengthOf:baseHeader:format: */;
 	/* begin fixedFieldsOf:format:length: */
 	if ((fmt > 4)
 	 || (fmt == 2)) {
 		fixedFields = 0;
-		goto l2;
+		goto l3;
 	}
 	if (fmt < 2) {
 		fixedFields = totalLength;
-		goto l2;
+		goto l3;
 	}
 	/* begin fetchClassOfNonInt: */
 	if (((ccIndex = (((usqInt) (longAt(array))) >> 12) & 31)) == 0) {
 		class = (longAt(array - BaseHeaderSize)) & AllButTypeMask;
-		goto l3;
+		goto l4;
 	}
 	else {
 		class = longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord));
-		goto l3;
+		goto l4;
 	}
-l3:	/* end fetchClassOfNonInt: */;
+l4:	/* end fetchClassOfNonInt: */;
 	classFormat = (longAt((class + BaseHeaderSize) + (InstanceSpecificationIndex << ShiftForWord))) - 1;
 	fixedFields = (((((usqInt) classFormat) >> 11) & 192) + ((((usqInt) classFormat) >> 2) & 63)) - 1;
-l2:	/* end fixedFieldsOf:format:length: */;
-	if (fmt == 3) {
-		assert(!(isContextHeader(hdr)));
+l3:	/* end fixedFieldsOf:format:length: */;
+	if ((fmt == 3)
+	 && (((((usqInt) hdr) >> 12) & 31) == ClassMethodContextCompactIndex)) {
+		/* begin fetchStackPointerOf: */
+		sp = longAt((array + BaseHeaderSize) + (StackPointerIndex << ShiftForWord));
+		if (!((sp & 1))) {
+			stSize = 0;
+			goto l1;
+		}
+		assert((ReceiverIndex + ((sp >> 1))) < (lengthOf(array)));
+		stSize = (sp >> 1);
+	l1:	/* end fetchStackPointerOf: */;
+		if (((((usqInt) index)) >= (((usqInt) 1)))
+		 && (((((usqInt) index)) <= (((usqInt) stSize)))
+		 && ((((longAt((array + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1))
+		 && (!(isWidowedContext(array)))))) {
+			noInlineTemporaryinput(index - 1, frameOfMarriedContext(array), value);
+			return;
+		}
 	}
-	stSize = totalLength - fixedFields;
+	else {
+		stSize = totalLength - fixedFields;
+	}
 	if (((((usqInt) index)) >= (((usqInt) 1)))
 	 && ((((usqInt) index)) <= (((usqInt) stSize)))) {
 		/* begin subscript:with:storing:format: */

Modified: branches/Cog/src/vm/interp.h
===================================================================
--- branches/Cog/src/vm/interp.h	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/src/vm/interp.h	2011-08-19 21:33:12 UTC (rev 2488)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
  */
 
 #define VM_PROXY_MAJOR 1

Modified: branches/Cog/src/vm/vmCallback.h
===================================================================
--- branches/Cog/src/vm/vmCallback.h	2011-08-16 22:28:12 UTC (rev 2487)
+++ branches/Cog/src/vm/vmCallback.h	2011-08-19 21:33:12 UTC (rev 2488)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.117 uuid: a21465f6-8cd9-4284-8638-c30d5de21ce9
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.119 uuid: dedbaf07-59d6-4a97-b10a-af8a7f631287
  */
 
 #define VM_CALLBACK_INC 1



More information about the Vm-dev mailing list