[Vm-dev] [commit][3159] VMMaker.oscog-eem.966

commits at squeakvm.org commits at squeakvm.org
Fri Dec 5 20:27:05 UTC 2014


Revision: 3159
Author:   eliot
Date:     2014-12-05 12:27:02 -0800 (Fri, 05 Dec 2014)
Log Message:
-----------
VMMaker.oscog-eem.966

Add a -breakmnu vm argument that calls warning on an mnu of a specific selector.

Fix SmartSyntaxPlugin code generation for Spur of

- asOop: old code assumed 4 byte oops & headers
- Unsigned old code assumed 32-bit oops


Affects AsyncFilePlugin, BochsIA32Plugin & FT2Plgin.

Avoid duplication of effort in special selector send forwarding fault handling.

Improve stack trace printing for Newspeak and Glue by providing something that
assumes the penultimate literal is the selector or an AdditionalMethodState-like
thing containing it.

Reimplement primitiveCopyObject to work for both pointer and bits objects.
This to support a good Object>>clone for Spur.

Fix Spur's isWordsOrBytes[NonImm]:.

More changes to the Mac platform subsystem for 64-bits.

Modified Paths:
--------------
    branches/Cog/nscogsrc/plugins/AsynchFilePlugin/AsynchFilePlugin.c
    branches/Cog/nscogsrc/vm/cogit.c
    branches/Cog/nscogsrc/vm/cogit.h
    branches/Cog/nscogsrc/vm/cointerp.c
    branches/Cog/nscogsrc/vm/cointerp.h
    branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
    branches/Cog/nsspursrc/vm/cogit.c
    branches/Cog/nsspursrc/vm/cogit.h
    branches/Cog/nsspursrc/vm/cointerp.c
    branches/Cog/nsspursrc/vm/cointerp.h
    branches/Cog/nsspursrc/vm/gcc3x-cointerp.c
    branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c
    branches/Cog/nsspurstacksrc/vm/interp.c
    branches/Cog/platforms/Cross/vm/dispdbg.h
    branches/Cog/platforms/Mac OS/plugins/HostWindowPlugin/sqMacHostWindow.h
    branches/Cog/platforms/Mac OS/vm/sqMacNSPlugin.c
    branches/Cog/platforms/Mac OS/vm/sqMacNSPluginUILogic.c
    branches/Cog/platforms/Mac OS/vm/sqMacNSPluginUILogic2.c
    branches/Cog/platforms/Mac OS/vm/sqMacNSPluginUILogic2.h
    branches/Cog/platforms/Mac OS/vm/sqMacUIEvents.c
    branches/Cog/platforms/Mac OS/vm/sqMacUIEvents.h
    branches/Cog/platforms/Mac OS/vm/sqMacUIEventsUniversal.c
    branches/Cog/platforms/Mac OS/vm/sqMacUnixCommandLineInterface.c
    branches/Cog/platforms/Mac OS/vm/sqMacWindow.c
    branches/Cog/platforms/Mac OS/vm/sqMacWindowUniversal.c
    branches/Cog/platforms/unix/vm/sqUnixMain.c
    branches/Cog/platforms/win32/vm/sqWin32Intel.c
    branches/Cog/platforms/win32/vm/sqWin32Window.c
    branches/Cog/sistasrc/vm/cogit.c
    branches/Cog/sistasrc/vm/cogit.h
    branches/Cog/sistasrc/vm/cointerp.c
    branches/Cog/sistasrc/vm/cointerp.h
    branches/Cog/sistasrc/vm/gcc3x-cointerp.c
    branches/Cog/spursistasrc/vm/cogit.c
    branches/Cog/spursistasrc/vm/cogit.h
    branches/Cog/spursistasrc/vm/cointerp.c
    branches/Cog/spursistasrc/vm/cointerp.h
    branches/Cog/spursistasrc/vm/gcc3x-cointerp.c
    branches/Cog/spursrc/vm/cogit.c
    branches/Cog/spursrc/vm/cogit.h
    branches/Cog/spursrc/vm/cointerp.c
    branches/Cog/spursrc/vm/cointerp.h
    branches/Cog/spursrc/vm/gcc3x-cointerp.c
    branches/Cog/spurstack64src/vm/gcc3x-interp.c
    branches/Cog/spurstack64src/vm/interp.c
    branches/Cog/spurstacksrc/vm/gcc3x-interp.c
    branches/Cog/spurstacksrc/vm/interp.c
    branches/Cog/src/plugins/AsynchFilePlugin/AsynchFilePlugin.c
    branches/Cog/src/plugins/BochsIA32Plugin/BochsIA32Plugin.c
    branches/Cog/src/plugins/GdbARMPlugin/GdbARMPlugin.c
    branches/Cog/src/vm/cogit.c
    branches/Cog/src/vm/cogit.h
    branches/Cog/src/vm/cointerp.c
    branches/Cog/src/vm/cointerp.h
    branches/Cog/src/vm/cointerpmt.c
    branches/Cog/src/vm/cointerpmt.h
    branches/Cog/src/vm/gcc3x-cointerp.c
    branches/Cog/src/vm/gcc3x-cointerpmt.c
    branches/Cog/stacksrc/vm/gcc3x-interp.c
    branches/Cog/stacksrc/vm/interp.c

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

Modified: branches/Cog/nscogsrc/plugins/AsynchFilePlugin/AsynchFilePlugin.c
===================================================================
--- branches/Cog/nscogsrc/plugins/AsynchFilePlugin/AsynchFilePlugin.c	2014-12-03 22:25:05 UTC (rev 3158)
+++ branches/Cog/nscogsrc/plugins/AsynchFilePlugin/AsynchFilePlugin.c	2014-12-05 20:27:02 UTC (rev 3159)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.597 uuid: c9a71dd4-c394-4a8f-aa4d-a6d4dc3ff220
+	SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.963 uuid: 9df56221-18fd-4dcd-b93f-ae000bef62e5
    from
-	AsynchFilePlugin VMMaker.oscog-eem.597 uuid: c9a71dd4-c394-4a8f-aa4d-a6d4dc3ff220
+	AsynchFilePlugin VMMaker.oscog-eem.963 uuid: 9df56221-18fd-4dcd-b93f-ae000bef62e5
  */
-static char __buildInfo[] = "AsynchFilePlugin VMMaker.oscog-eem.597 uuid: c9a71dd4-c394-4a8f-aa4d-a6d4dc3ff220 " __DATE__ ;
+static char __buildInfo[] = "AsynchFilePlugin VMMaker.oscog-eem.963 uuid: 9df56221-18fd-4dcd-b93f-ae000bef62e5 " __DATE__ ;
 
 
 
@@ -100,9 +100,9 @@
 struct VirtualMachine* interpreterProxy;
 static const char *moduleName =
 #ifdef SQUEAK_BUILTIN_PLUGIN
-	"AsynchFilePlugin VMMaker.oscog-eem.597 (i)"
+	"AsynchFilePlugin VMMaker.oscog-eem.963 (i)"
 #else
-	"AsynchFilePlugin VMMaker.oscog-eem.597 (e)"
+	"AsynchFilePlugin VMMaker.oscog-eem.963 (e)"
 #endif
 ;
 static void * sCOAFfn;
@@ -224,7 +224,7 @@
 	/* If the security plugin can be loaded, use it to check for permission.
 	   If not, assume it's ok */
 
-	fileNameSize = slotSizeOf(((int) fileName) - 4);
+	fileNameSize = slotSizeOf(((sqInt)((fileName) - BaseHeaderSize)));
 	if (sCOAFfn != 0) {
 		okToOpen =  ((sqInt (*) (char *, sqInt, sqInt)) sCOAFfn)(fileName, fileNameSize, writeFlag);
 		if (!okToOpen) {

Modified: branches/Cog/nscogsrc/vm/cogit.c
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.c	2014-12-03 22:25:05 UTC (rev 3158)
+++ branches/Cog/nscogsrc/vm/cogit.c	2014-12-05 20:27:02 UTC (rev 3159)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.957 uuid: ac5f8308-02e5-4277-b28c-595b7a4cf34a
+	CCodeGenerator VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.957 uuid: ac5f8308-02e5-4277-b28c-595b7a4cf34a
+	StackToRegisterMappingCogit VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.957 uuid: ac5f8308-02e5-4277-b28c-595b7a4cf34a " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 

Modified: branches/Cog/nscogsrc/vm/cogit.h
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.h	2014-12-03 22:25:05 UTC (rev 3158)
+++ branches/Cog/nscogsrc/vm/cogit.h	2014-12-05 20:27:02 UTC (rev 3159)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.957 uuid: ac5f8308-02e5-4277-b28c-595b7a4cf34a
+	CCodeGenerator VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06
  */
 
 

Modified: branches/Cog/nscogsrc/vm/cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.c	2014-12-03 22:25:05 UTC (rev 3158)
+++ branches/Cog/nscogsrc/vm/cointerp.c	2014-12-05 20:27:02 UTC (rev 3159)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.962 uuid: 7f55aa33-f2c1-4b7d-8456-5c2a33e4298b
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06
    from
-	CoInterpreter VMMaker.oscog-eem.962 uuid: 7f55aa33-f2c1-4b7d-8456-5c2a33e4298b
+	CoInterpreter VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.962 uuid: 7f55aa33-f2c1-4b7d-8456-5c2a33e4298b " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -799,7 +799,6 @@
 sqInt nullHeaderForMachineCodeMethod(void);
 usqInt scavengeThresholdAddress(void);
 sqInt smallIntegerTag(void);
-sqInt withoutForwardingOnandsendToCogit(sqInt obj1, sqInt obj2, sqInt (*selector)(sqInt,sqInt));
 sqInt withoutForwardingOnandwithsendToCogit(sqInt obj1, sqInt obj2, sqInt aBool, sqInt (*selector)(sqInt,sqInt,sqInt));
 usqInt youngStartAddress(void);
 static sqInt addressCouldBeObjWhileForwarding(sqInt address) NoDbgRegParms;
@@ -859,7 +858,7 @@
 void printWronglySizedContexts(sqInt printContexts);
 static void restoreHeadersFromtofromandtofrom(sqInt firstIn, sqInt lastIn, sqInt hdrBaseIn, sqInt firstOut, sqInt lastOut, sqInt hdrBaseOut) NoDbgRegParms;
 static void runLeakCheckerForFullGC(sqInt fullGCFlag) NoDbgRegParms;
-static usqInt safeObjectAfter(sqInt oop) NoDbgRegParms;
+static sqInt safeObjectAfter(sqInt oop) NoDbgRegParms;
 static sqInt safePrintStringOf(sqInt oop) NoDbgRegParms;
 static sqInt shortentoIndexableSize(sqInt obj, sqInt nSlots) NoDbgRegParms;
 static sqInt sizeBitsOfSafe(sqInt oop) NoDbgRegParms;
@@ -1232,6 +1231,7 @@
 EXPORT(sqInt) returnAsThroughCallbackContext(sqInt returnTypeOop, VMCallbackContext *vmCallbackContext, sqInt callbackMethodContext);
 static sqInt reverseDisplayFromto(sqInt startIndex, sqInt endIndex) NoDbgRegParms;
 static sqInt safeMethodClassOf(sqInt methodPointer) NoDbgRegParms;
+void setBreakMNUSelector(char *aString);
 void setBreakSelector(char *aString);
 void setFullScreenFlag(sqInt value);
 EXPORT(void (*setInterruptCheckChain(void (*aFunction)(void)))()) ;
@@ -1504,9 +1504,9 @@
 sqInt checkForLeaks;
 sqInt desiredEdenBytes;
 sqInt desiredNumStackPages;
+sqInt breakSelectorLength = -1;
 sqInt extraVMMemory;
 sqInt desiredCogCodeSize;
-sqInt breakSelectorLength = -1;
 usqInt heapBase;
 void * showSurfaceFn;
 char * breakSelector;
@@ -2096,7 +2096,7 @@
 	/* 574 */ (void (*)(void))0,
 	/* 575 */ (void (*)(void))0,
  0 };
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.962";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.966";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -19178,13 +19178,13 @@
     sqInt swapBytes;
     sqInt sz;
     int w;
-    long w1;
-    long w10;
-    long w11;
-    long w12;
-    long w2;
-    long w3;
-    long w4;
+    sqInt w1;
+    sqInt w10;
+    sqInt w11;
+    sqInt w12;
+    sqInt w2;
+    sqInt w3;
+    sqInt w4;
     int w5;
     short w6;
     int w7;
@@ -19212,20 +19212,20 @@
 		: w);
 	/* begin getLongFromFile:swap: */
 	w1 = 0;
-	sqImageFileRead((&w1), sizeof(long), 1, f);
-	dataSize = (swapBytes
-		? byteSwapped(w1)
-		: w1);
+	sqImageFileRead((&w1), sizeof(w1), 1, f);
+	dataSize = ((sqInt) ((swapBytes
+	? byteSwapped(w1)
+	: w1)));
 	/* begin getLongFromFile:swap: */
 	w2 = 0;
-	sqImageFileRead((&w2), sizeof(long), 1, f);
+	sqImageFileRead((&w2), sizeof(w2), 1, f);
 	oldBaseAddr = (swapBytes
 		? byteSwapped(w2)
 		: w2);
 	/* begin specialObjectsOop: */
 	/* begin getLongFromFile:swap: */
 	w11 = 0;
-	sqImageFileRead((&w11), sizeof(long), 1, f);
+	sqImageFileRead((&w11), sizeof(w11), 1, f);
 	anObject = (swapBytes
 		? byteSwapped(w11)
 		: w11);
@@ -19233,20 +19233,20 @@
 	/* begin lastHash: */
 	/* begin getLongFromFile:swap: */
 	w12 = 0;
-	sqImageFileRead((&w12), sizeof(long), 1, f);
+	sqImageFileRead((&w12), sizeof(w12), 1, f);
 	aValue = (swapBytes
 		? byteSwapped(w12)
 		: w12);
 	lastHash = aValue;
 	/* begin getLongFromFile:swap: */
 	w3 = 0;
-	sqImageFileRead((&w3), sizeof(long), 1, f);
+	sqImageFileRead((&w3), sizeof(w3), 1, f);
 	GIV(savedWindowSize) = (swapBytes
 		? byteSwapped(w3)
 		: w3);
 	/* begin getLongFromFile:swap: */
 	w4 = 0;
-	sqImageFileRead((&w4), sizeof(long), 1, f);
+	sqImageFileRead((&w4), sizeof(w4), 1, f);
 	headerFlags = (swapBytes
 		? byteSwapped(w4)
 		: w4);
@@ -19323,7 +19323,7 @@
 		: w9);
 	/* begin getLongFromFile:swap: */
 	w10 = 0;
-	sqImageFileRead((&w10), sizeof(long), 1, f);
+	sqImageFileRead((&w10), sizeof(w10), 1, f);
 	firstSegSize = (swapBytes
 		? byteSwapped(w10)
 		: w10);
@@ -34701,61 +34701,6 @@
 }
 
 
-/*	For the purposes of become: send selector to the cogit with obj1 and obj2
-	and answer the result. Undo forwarding for the selector, but redo
-	forwarding after since
-	become:'s restoreHeadersAfter*Become* methods expect to be able to
-	restore. 
- */
-
-sqInt
-withoutForwardingOnandsendToCogit(sqInt obj1, sqInt obj2, sqInt (*selector)(sqInt,sqInt))
-{
-    sqInt aWord;
-    sqInt aWord1;
-    sqInt fwdBlock;
-    sqInt fwdBlock1;
-    sqInt header;
-    sqInt header1;
-    sqInt result;
-    sqInt savedHeaderA;
-    sqInt savedHeaderB;
-
-	savedHeaderA = longAt(obj1);
-	/* begin baseHeader:put: */
-	/* begin headerWhileForwardingOf: */
-	header = longAt(obj1);
-	if ((header & MarkBit) != 0) {
-
-		/* oop is forwarded; get its real header from its forwarding table entry */
-
-		fwdBlock = (header & AllButMarkBitAndTypeMask) << 1;
-		assert(fwdBlockValid(fwdBlock));
-		header = longAt(fwdBlock + BytesPerWord);
-	}
-	aWord = header;
-	longAtput(obj1, aWord);
-	savedHeaderB = longAt(obj2);
-	/* begin baseHeader:put: */
-	/* begin headerWhileForwardingOf: */
-	header1 = longAt(obj2);
-	if ((header1 & MarkBit) != 0) {
-
-		/* oop is forwarded; get its real header from its forwarding table entry */
-
-		fwdBlock1 = (header1 & AllButMarkBitAndTypeMask) << 1;
-		assert(fwdBlockValid(fwdBlock1));
-		header1 = longAt(fwdBlock1 + BytesPerWord);
-	}
-	aWord1 = header1;
-	longAtput(obj2, aWord1);
-	result = selector(obj1, obj2);
-	longAtput(obj1, savedHeaderA);
-	longAtput(obj2, savedHeaderB);
-	return result;
-}
-
-
 /*	For the purposes of become: send selector to the cogit with obj1, obj2 and
 	aBool, and
 	answer the result. Undo forwarding for the selector, but redo forwarding
@@ -37046,15 +36991,17 @@
     sqInt header1;
     sqInt header2;
     sqInt header3;
+    sqInt header4;
     usqInt lastWord;
     sqInt newFreeChunk;
     sqInt newOop;
-    usqInt next;
+    sqInt next;
     sqInt oop;
     sqInt realHeader;
     sqInt sz;
     sqInt sz1;
     sqInt sz2;
+    sqInt sz3;
     sqInt target;
     usqInt w;
 
@@ -37065,7 +37012,21 @@
 		/* begin objectAfterWhileForwarding: */
 		header2 = longAt(oop);
 		if ((header2 & MarkBit) == 0) {
-			next = ((sqInt) (objectAfter(oop)));
+			/* begin objectAfter: */
+			if (!(asserta(oopisLessThan(oop, GIV(freeStart))))) {
+				error("no objects after the end of memory");
+			}
+			if (((longAt(oop)) & TypeMask) == HeaderTypeFree) {
+				sz2 = (longAt(oop)) & AllButTypeMask;
+			}
+			else {
+				/* begin sizeBitsOf: */
+				header3 = longAt(oop);
+				sz2 = ((header3 & TypeMask) == HeaderTypeSizeAndClass
+					? (longAt(oop - (BytesPerWord * 2))) & LongSizeMask
+					: header3 & SizeMask);
+			}
+			next = (oop + sz2) + (headerTypeBytes[(longAt(oop + sz2)) & TypeMask]);
 			goto l1;
 		}
 		fwdBlock1 = (header2 & AllButMarkBitAndTypeMask) << 1;
@@ -37080,7 +37041,7 @@
 		else {
 			sz1 = realHeader & SizeMask;
 		}
-		next = ((sqInt) ((oop + sz1) + (headerTypeBytes[(longAt(oop + sz1)) & TypeMask])));
+		next = (oop + sz1) + (headerTypeBytes[(longAt(oop + sz1)) & TypeMask]);
 	l1:	/* end objectAfterWhileForwarding: */;
 		if (!(((longAt(oop)) & TypeMask) == HeaderTypeFree)) {
 
@@ -37134,18 +37095,18 @@
 	}
 	/* begin safeObjectAfter: */
 	if (((longAt(newFreeChunk)) & TypeMask) == HeaderTypeFree) {
-		sz2 = (longAt(newFreeChunk)) & AllButTypeMask;
+		sz3 = (longAt(newFreeChunk)) & AllButTypeMask;
 	}
 	else {
 		/* begin sizeBitsOf: */
-		header3 = longAt(newFreeChunk);
-		sz2 = ((header3 & TypeMask) == HeaderTypeSizeAndClass
+		header4 = longAt(newFreeChunk);
+		sz3 = ((header4 & TypeMask) == HeaderTypeSizeAndClass
 			? (longAt(newFreeChunk - (BytesPerWord * 2))) & LongSizeMask
-			: header3 & SizeMask);
+			: header4 & SizeMask);
 	}
-	next = ((((usqInt)(newFreeChunk + sz2))) >= GIV(freeStart)
-		? GIV(freeStart)
-		: (newFreeChunk + sz2) + (headerTypeBytes[(longAt(newFreeChunk + sz2)) & TypeMask]));
+	next = ((((usqInt)(newFreeChunk + sz3))) >= GIV(freeStart)
+		? ((sqInt)GIV(freeStart))
+		: (newFreeChunk + sz3) + (headerTypeBytes[(longAt(newFreeChunk + sz3)) & TypeMask]));
 	assert((next == GIV(freeStart))
 	 || (next == (oopFromChunk(GIV(compEnd)))));
 	if (next == GIV(freeStart)) {
@@ -39022,7 +38983,7 @@
 	given object or free chunk in memory. Return freeStart when
 	enumeration is complete. This is for assertion checking only. */
 
-static usqInt
+static sqInt
 safeObjectAfter(sqInt oop)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt header;
@@ -39039,7 +39000,7 @@
 			: header & SizeMask);
 	}
 	return ((((usqInt)(oop + sz))) >= GIV(freeStart)
-		? GIV(freeStart)
+		? ((sqInt)GIV(freeStart))
 		: (oop + sz) + (headerTypeBytes[(longAt(oop + sz)) & TypeMask]));
 }
 
@@ -44588,6 +44549,8 @@
 
 	assert((isImmediate(GIV(messageSelector)))
 	 || (addressCouldBeObj(GIV(messageSelector))));
+	/* begin mnuBreakpoint:receiver: */
+	mnuBreakpointreceiver(firstFixedFieldOfMaybeImmediate(GIV(messageSelector)), lengthOfMaybeImmediate(GIV(messageSelector)), null);
 	argumentArray = eeInstantiateSmallClassnumSlots(longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassArray << (shiftForWord()))), GIV(argumentCount));
 	message = eeInstantiateSmallClassnumSlots(longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassMessage << (shiftForWord()))), MessageLookupClassIndex + 1);
 
@@ -51264,18 +51227,30 @@
 }
 
 void
+setBreakMNUSelector(char *aString)
+{
+	if (((breakSelector = aString)) == null) {
+
+		/* nil's effective length is zero */
+
+		breakSelectorLength = MinSmallInteger;
+	}
+	else {
+		breakSelectorLength = -(strlen(aString));
+	}
+}
+
+void
 setBreakSelector(char *aString)
 {
-	if (aString == null) {
+	if (((breakSelector = aString)) == null) {
 
 		/* nil's effective length is zero */
 
-		breakSelectorLength = -1;
-		breakSelector = null;
+		breakSelectorLength = MinSmallInteger;
 	}
 	else {
 		breakSelectorLength = strlen(aString);
-		breakSelector = aString;
 	}
 }
 

Modified: branches/Cog/nscogsrc/vm/cointerp.h
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.h	2014-12-03 22:25:05 UTC (rev 3158)
+++ branches/Cog/nscogsrc/vm/cointerp.h	2014-12-05 20:27:02 UTC (rev 3159)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.962 uuid: 7f55aa33-f2c1-4b7d-8456-5c2a33e4298b
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06
  */
 
 
@@ -122,7 +122,6 @@
 sqInt nullHeaderForMachineCodeMethod(void);
 usqInt scavengeThresholdAddress(void);
 sqInt smallIntegerTag(void);
-sqInt withoutForwardingOnandsendToCogit(sqInt obj1, sqInt obj2, sqInt (*selector)(sqInt,sqInt));
 sqInt withoutForwardingOnandwithsendToCogit(sqInt obj1, sqInt obj2, sqInt aBool, sqInt (*selector)(sqInt,sqInt,sqInt));
 usqInt youngStartAddress(void);
 sqInt addressCouldBeObj(sqInt address);
@@ -254,6 +253,7 @@
 sqInt printProcsOnList(sqInt procList);
 sqInt printStackCallStackOf(sqInt frameOrContext);
 void print(char *s);
+void setBreakMNUSelector(char *aString);
 void setBreakSelector(char *aString);
 void setNextWakeupUsecs(usqLong value);
 void shortPrintFrameAndNCallers(char *theFP, sqInt n);

Modified: branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2014-12-03 22:25:05 UTC (rev 3158)
+++ branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2014-12-05 20:27:02 UTC (rev 3159)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.962 uuid: 7f55aa33-f2c1-4b7d-8456-5c2a33e4298b
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06
    from
-	CoInterpreter VMMaker.oscog-eem.962 uuid: 7f55aa33-f2c1-4b7d-8456-5c2a33e4298b
+	CoInterpreter VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.962 uuid: 7f55aa33-f2c1-4b7d-8456-5c2a33e4298b " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -802,7 +802,6 @@
 sqInt nullHeaderForMachineCodeMethod(void);
 usqInt scavengeThresholdAddress(void);
 sqInt smallIntegerTag(void);
-sqInt withoutForwardingOnandsendToCogit(sqInt obj1, sqInt obj2, sqInt (*selector)(sqInt,sqInt));
 sqInt withoutForwardingOnandwithsendToCogit(sqInt obj1, sqInt obj2, sqInt aBool, sqInt (*selector)(sqInt,sqInt,sqInt));
 usqInt youngStartAddress(void);
 static sqInt addressCouldBeObjWhileForwarding(sqInt address) NoDbgRegParms;
@@ -862,7 +861,7 @@
 void printWronglySizedContexts(sqInt printContexts);
 static void restoreHeadersFromtofromandtofrom(sqInt firstIn, sqInt lastIn, sqInt hdrBaseIn, sqInt firstOut, sqInt lastOut, sqInt hdrBaseOut) NoDbgRegParms;
 static void runLeakCheckerForFullGC(sqInt fullGCFlag) NoDbgRegParms;
-static usqInt safeObjectAfter(sqInt oop) NoDbgRegParms;
+static sqInt safeObjectAfter(sqInt oop) NoDbgRegParms;
 static sqInt safePrintStringOf(sqInt oop) NoDbgRegParms;
 static sqInt shortentoIndexableSize(sqInt obj, sqInt nSlots) NoDbgRegParms;
 static sqInt sizeBitsOfSafe(sqInt oop) NoDbgRegParms;
@@ -1235,6 +1234,7 @@
 EXPORT(sqInt) returnAsThroughCallbackContext(sqInt returnTypeOop, VMCallbackContext *vmCallbackContext, sqInt callbackMethodContext);
 static sqInt reverseDisplayFromto(sqInt startIndex, sqInt endIndex) NoDbgRegParms;
 static sqInt safeMethodClassOf(sqInt methodPointer) NoDbgRegParms;
+void setBreakMNUSelector(char *aString);
 void setBreakSelector(char *aString);
 void setFullScreenFlag(sqInt value);
 EXPORT(void (*setInterruptCheckChain(void (*aFunction)(void)))()) ;
@@ -1507,9 +1507,9 @@
 sqInt checkForLeaks;
 sqInt desiredEdenBytes;
 sqInt desiredNumStackPages;
+sqInt breakSelectorLength = -1;
 sqInt extraVMMemory;
 sqInt desiredCogCodeSize;
-sqInt breakSelectorLength = -1;
 usqInt heapBase;
 void * showSurfaceFn;
 char * breakSelector;
@@ -2099,7 +2099,7 @@
 	/* 574 */ (void (*)(void))0,
 	/* 575 */ (void (*)(void))0,
  0 };
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.962";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.966";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -19187,13 +19187,13 @@
     sqInt swapBytes;
     sqInt sz;
     int w;
-    long w1;
-    long w10;
-    long w11;
-    long w12;
-    long w2;
-    long w3;
-    long w4;
+    sqInt w1;
+    sqInt w10;
+    sqInt w11;
+    sqInt w12;
+    sqInt w2;
+    sqInt w3;
+    sqInt w4;
     int w5;
     short w6;
     int w7;
@@ -19221,20 +19221,20 @@
 		: w);
 	/* begin getLongFromFile:swap: */
 	w1 = 0;
-	sqImageFileRead((&w1), sizeof(long), 1, f);
-	dataSize = (swapBytes
-		? byteSwapped(w1)
-		: w1);
+	sqImageFileRead((&w1), sizeof(w1), 1, f);
+	dataSize = ((sqInt) ((swapBytes
+	? byteSwapped(w1)
+	: w1)));
 	/* begin getLongFromFile:swap: */
 	w2 = 0;
-	sqImageFileRead((&w2), sizeof(long), 1, f);
+	sqImageFileRead((&w2), sizeof(w2), 1, f);
 	oldBaseAddr = (swapBytes
 		? byteSwapped(w2)
 		: w2);
 	/* begin specialObjectsOop: */
 	/* begin getLongFromFile:swap: */
 	w11 = 0;
-	sqImageFileRead((&w11), sizeof(long), 1, f);
+	sqImageFileRead((&w11), sizeof(w11), 1, f);
 	anObject = (swapBytes
 		? byteSwapped(w11)
 		: w11);
@@ -19242,20 +19242,20 @@
 	/* begin lastHash: */
 	/* begin getLongFromFile:swap: */
 	w12 = 0;
-	sqImageFileRead((&w12), sizeof(long), 1, f);
+	sqImageFileRead((&w12), sizeof(w12), 1, f);
 	aValue = (swapBytes
 		? byteSwapped(w12)
 		: w12);
 	lastHash = aValue;
 	/* begin getLongFromFile:swap: */
 	w3 = 0;
-	sqImageFileRead((&w3), sizeof(long), 1, f);
+	sqImageFileRead((&w3), sizeof(w3), 1, f);
 	GIV(savedWindowSize) = (swapBytes
 		? byteSwapped(w3)
 		: w3);
 	/* begin getLongFromFile:swap: */
 	w4 = 0;
-	sqImageFileRead((&w4), sizeof(long), 1, f);
+	sqImageFileRead((&w4), sizeof(w4), 1, f);
 	headerFlags = (swapBytes
 		? byteSwapped(w4)
 		: w4);
@@ -19332,7 +19332,7 @@
 		: w9);
 	/* begin getLongFromFile:swap: */
 	w10 = 0;
-	sqImageFileRead((&w10), sizeof(long), 1, f);
+	sqImageFileRead((&w10), sizeof(w10), 1, f);
 	firstSegSize = (swapBytes
 		? byteSwapped(w10)
 		: w10);
@@ -34710,61 +34710,6 @@
 }
 
 
-/*	For the purposes of become: send selector to the cogit with obj1 and obj2
-	and answer the result. Undo forwarding for the selector, but redo
-	forwarding after since
-	become:'s restoreHeadersAfter*Become* methods expect to be able to
-	restore. 
- */
-
-sqInt
-withoutForwardingOnandsendToCogit(sqInt obj1, sqInt obj2, sqInt (*selector)(sqInt,sqInt))
-{
-    sqInt aWord;
-    sqInt aWord1;
-    sqInt fwdBlock;
-    sqInt fwdBlock1;
-    sqInt header;
-    sqInt header1;
-    sqInt result;
-    sqInt savedHeaderA;
-    sqInt savedHeaderB;
-
-	savedHeaderA = longAt(obj1);
-	/* begin baseHeader:put: */
-	/* begin headerWhileForwardingOf: */
-	header = longAt(obj1);
-	if ((header & MarkBit) != 0) {
-
-		/* oop is forwarded; get its real header from its forwarding table entry */
-
-		fwdBlock = (header & AllButMarkBitAndTypeMask) << 1;
-		assert(fwdBlockValid(fwdBlock));
-		header = longAt(fwdBlock + BytesPerWord);
-	}
-	aWord = header;
-	longAtput(obj1, aWord);
-	savedHeaderB = longAt(obj2);
-	/* begin baseHeader:put: */
-	/* begin headerWhileForwardingOf: */
-	header1 = longAt(obj2);
-	if ((header1 & MarkBit) != 0) {
-
-		/* oop is forwarded; get its real header from its forwarding table entry */
-
-		fwdBlock1 = (header1 & AllButMarkBitAndTypeMask) << 1;
-		assert(fwdBlockValid(fwdBlock1));
-		header1 = longAt(fwdBlock1 + BytesPerWord);
-	}
-	aWord1 = header1;
-	longAtput(obj2, aWord1);
-	result = selector(obj1, obj2);
-	longAtput(obj1, savedHeaderA);
-	longAtput(obj2, savedHeaderB);
-	return result;
-}
-
-
 /*	For the purposes of become: send selector to the cogit with obj1, obj2 and
 	aBool, and
 	answer the result. Undo forwarding for the selector, but redo forwarding
@@ -37055,15 +37000,17 @@
     sqInt header1;
     sqInt header2;
     sqInt header3;
+    sqInt header4;
     usqInt lastWord;
     sqInt newFreeChunk;
     sqInt newOop;
-    usqInt next;
+    sqInt next;
     sqInt oop;
     sqInt realHeader;
     sqInt sz;
     sqInt sz1;
     sqInt sz2;
+    sqInt sz3;
     sqInt target;
     usqInt w;
 
@@ -37074,7 +37021,21 @@
 		/* begin objectAfterWhileForwarding: */
 		header2 = longAt(oop);
 		if ((header2 & MarkBit) == 0) {
-			next = ((sqInt) (objectAfter(oop)));
+			/* begin objectAfter: */
+			if (!(asserta(oopisLessThan(oop, GIV(freeStart))))) {
+				error("no objects after the end of memory");
+			}
+			if (((longAt(oop)) & TypeMask) == HeaderTypeFree) {
+				sz2 = (longAt(oop)) & AllButTypeMask;
+			}
+			else {
+				/* begin sizeBitsOf: */
+				header3 = longAt(oop);
+				sz2 = ((header3 & TypeMask) == HeaderTypeSizeAndClass
+					? (longAt(oop - (BytesPerWord * 2))) & LongSizeMask
+					: header3 & SizeMask);
+			}
+			next = (oop + sz2) + (headerTypeBytes[(longAt(oop + sz2)) & TypeMask]);
 			goto l1;
 		}
 		fwdBlock1 = (header2 & AllButMarkBitAndTypeMask) << 1;
@@ -37089,7 +37050,7 @@
 		else {
 			sz1 = realHeader & SizeMask;
 		}
-		next = ((sqInt) ((oop + sz1) + (headerTypeBytes[(longAt(oop + sz1)) & TypeMask])));
+		next = (oop + sz1) + (headerTypeBytes[(longAt(oop + sz1)) & TypeMask]);
 	l1:	/* end objectAfterWhileForwarding: */;
 		if (!(((longAt(oop)) & TypeMask) == HeaderTypeFree)) {
 
@@ -37143,18 +37104,18 @@
 	}
 	/* begin safeObjectAfter: */
 	if (((longAt(newFreeChunk)) & TypeMask) == HeaderTypeFree) {
-		sz2 = (longAt(newFreeChunk)) & AllButTypeMask;
+		sz3 = (longAt(newFreeChunk)) & AllButTypeMask;
 	}
 	else {
 		/* begin sizeBitsOf: */
-		header3 = longAt(newFreeChunk);
-		sz2 = ((header3 & TypeMask) == HeaderTypeSizeAndClass
+		header4 = longAt(newFreeChunk);
+		sz3 = ((header4 & TypeMask) == HeaderTypeSizeAndClass
 			? (longAt(newFreeChunk - (BytesPerWord * 2))) & LongSizeMask
-			: header3 & SizeMask);
+			: header4 & SizeMask);
 	}
-	next = ((((usqInt)(newFreeChunk + sz2))) >= GIV(freeStart)
-		? GIV(freeStart)
-		: (newFreeChunk + sz2) + (headerTypeBytes[(longAt(newFreeChunk + sz2)) & TypeMask]));
+	next = ((((usqInt)(newFreeChunk + sz3))) >= GIV(freeStart)
+		? ((sqInt)GIV(freeStart))
+		: (newFreeChunk + sz3) + (headerTypeBytes[(longAt(newFreeChunk + sz3)) & TypeMask]));
 	assert((next == GIV(freeStart))
 	 || (next == (oopFromChunk(GIV(compEnd)))));
 	if (next == GIV(freeStart)) {
@@ -39031,7 +38992,7 @@
 	given object or free chunk in memory. Return freeStart when
 	enumeration is complete. This is for assertion checking only. */
 
-static usqInt
+static sqInt
 safeObjectAfter(sqInt oop)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt header;
@@ -39048,7 +39009,7 @@
 			: header & SizeMask);
 	}
 	return ((((usqInt)(oop + sz))) >= GIV(freeStart)
-		? GIV(freeStart)
+		? ((sqInt)GIV(freeStart))
 		: (oop + sz) + (headerTypeBytes[(longAt(oop + sz)) & TypeMask]));
 }
 
@@ -44597,6 +44558,8 @@
 
 	assert((isImmediate(GIV(messageSelector)))
 	 || (addressCouldBeObj(GIV(messageSelector))));
+	/* begin mnuBreakpoint:receiver: */
+	mnuBreakpointreceiver(firstFixedFieldOfMaybeImmediate(GIV(messageSelector)), lengthOfMaybeImmediate(GIV(messageSelector)), null);
 	argumentArray = eeInstantiateSmallClassnumSlots(longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassArray << (shiftForWord()))), GIV(argumentCount));
 	message = eeInstantiateSmallClassnumSlots(longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassMessage << (shiftForWord()))), MessageLookupClassIndex + 1);
 
@@ -51273,18 +51236,30 @@
 }
 
 void
+setBreakMNUSelector(char *aString)
+{
+	if (((breakSelector = aString)) == null) {
+
+		/* nil's effective length is zero */
+
+		breakSelectorLength = MinSmallInteger;
+	}
+	else {
+		breakSelectorLength = -(strlen(aString));
+	}
+}
+
+void
 setBreakSelector(char *aString)
 {
-	if (aString == null) {
+	if (((breakSelector = aString)) == null) {
 
 		/* nil's effective length is zero */
 
-		breakSelectorLength = -1;
-		breakSelector = null;
+		breakSelectorLength = MinSmallInteger;
 	}
 	else {
 		breakSelectorLength = strlen(aString);
-		breakSelector = aString;
 	}
 }
 

Modified: branches/Cog/nsspursrc/vm/cogit.c
===================================================================
--- branches/Cog/nsspursrc/vm/cogit.c	2014-12-03 22:25:05 UTC (rev 3158)
+++ branches/Cog/nsspursrc/vm/cogit.c	2014-12-05 20:27:02 UTC (rev 3159)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.957 uuid: ac5f8308-02e5-4277-b28c-595b7a4cf34a
+	CCodeGenerator VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.957 uuid: ac5f8308-02e5-4277-b28c-595b7a4cf34a
+	StackToRegisterMappingCogit VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.957 uuid: ac5f8308-02e5-4277-b28c-595b7a4cf34a " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 

Modified: branches/Cog/nsspursrc/vm/cogit.h
===================================================================
--- branches/Cog/nsspursrc/vm/cogit.h	2014-12-03 22:25:05 UTC (rev 3158)
+++ branches/Cog/nsspursrc/vm/cogit.h	2014-12-05 20:27:02 UTC (rev 3159)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.957 uuid: ac5f8308-02e5-4277-b28c-595b7a4cf34a
+	CCodeGenerator VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06
  */
 
 

Modified: branches/Cog/nsspursrc/vm/cointerp.c
===================================================================
--- branches/Cog/nsspursrc/vm/cointerp.c	2014-12-03 22:25:05 UTC (rev 3158)
+++ branches/Cog/nsspursrc/vm/cointerp.c	2014-12-05 20:27:02 UTC (rev 3159)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.962 uuid: 7f55aa33-f2c1-4b7d-8456-5c2a33e4298b
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06
    from
-	CoInterpreter VMMaker.oscog-eem.962 uuid: 7f55aa33-f2c1-4b7d-8456-5c2a33e4298b
+	CoInterpreter VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.962 uuid: 7f55aa33-f2c1-4b7d-8456-5c2a33e4298b " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -810,7 +810,6 @@
 sqLong nullHeaderForMachineCodeMethod(void);
 usqInt scavengeThresholdAddress(void);
 sqInt smallIntegerTag(void);
-sqInt withoutForwardingOnandsendToCogit(sqInt obj1, sqInt obj2, sqInt (*selector)(sqInt,sqInt));
 sqInt withoutForwardingOnandwithsendToCogit(sqInt obj1, sqInt obj2, sqInt aBool, sqInt (*selector)(sqInt,sqInt,sqInt));
 static sqInt addressAfter(sqInt objOop) NoDbgRegParms;
 static sqInt allocateSlotsForPinningInOldSpacebytesformatclassIndex(sqInt numSlots, usqInt totalBytes, sqInt formatField, sqInt classIndex) NoDbgRegParms;
@@ -1419,6 +1418,7 @@
 EXPORT(sqInt) returnAsThroughCallbackContext(sqInt returnTypeOop, VMCallbackContext *vmCallbackContext, sqInt callbackMethodContext);
 static sqInt reverseDisplayFromto(sqInt startIndex, sqInt endIndex) NoDbgRegParms;
 static sqInt safeMethodClassOf(sqInt methodPointer) NoDbgRegParms;
+void setBreakMNUSelector(char *aString);
 void setBreakSelector(char *aString);
 void setFullScreenFlag(sqInt value);
 EXPORT(void (*setInterruptCheckChain(void (*aFunction)(void)))()) ;
@@ -1725,9 +1725,9 @@
 sqInt inIOProcessEvents;
 sqInt desiredEdenBytes;
 sqInt desiredNumStackPages;
+sqInt breakSelectorLength = -1;
 sqInt extraVMMemory;
 sqInt desiredCogCodeSize;
-sqInt breakSelectorLength = -1;
 usqInt heapBase;
 void * showSurfaceFn;
 char * breakSelector;
@@ -2345,7 +2345,7 @@
 /*540*/	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
 /*560*/	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0,-1,-1
 	};
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.962";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.966";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -8842,7 +8842,7 @@
 			/* bytecodePrimBitShift */
 			{
 				sqInt integerArgument;
-				usqInt integerReceiver;
+				sqLong integerReceiver;
 				sqInt shifted;
 				char *sp;
 
@@ -8902,7 +8902,7 @@
 							null;
 							goto l76;
 						}
-						shifted = ((usqInt) integerReceiver) >> (0 - integerArgument);
+						shifted = ((unsigned sqLong)integerReceiver) >> (0 - integerArgument);
 					}
 					shifted = positive32BitIntegerFor(shifted);
 					/* begin pop:thenPush: */
@@ -11590,7 +11590,7 @@
 			/* bytecodePrimBitShift */
 			{
 				sqInt integerArgument;
-				usqInt integerReceiver;
+				sqLong integerReceiver;
 				sqInt shifted;
 				char *sp;
 
@@ -11650,7 +11650,7 @@
 							null;
 							goto l183;
 						}
-						shifted = ((usqInt) integerReceiver) >> (0 - integerArgument);
+						shifted = ((unsigned sqLong)integerReceiver) >> (0 - integerArgument);
 					}
 					shifted = positive32BitIntegerFor(shifted);
 					/* begin pop:thenPush: */
@@ -23510,15 +23510,15 @@
     sqInt survivorBytes;
     sqInt swapBytes;
     int w;
-    long w1;
+    sqInt w1;
     short w10;
     short w11;
-    long w12;
-    long w2;
-    long w3;
-    long w4;
-    long w5;
-    long w6;
+    sqInt w12;
+    sqInt w2;
+    sqInt w3;
+    sqInt w4;
+    sqInt w5;
+    sqInt w6;
     int w7;
     short w8;
     int w9;
@@ -23544,20 +23544,20 @@
 		: w);
 	/* begin getLongFromFile:swap: */
 	w1 = 0;
-	sqImageFileRead((&w1), sizeof(long), 1, f);
-	dataSize = (swapBytes
-		? ((((((usqInt) w1 >> 24)) & Byte0Mask) + ((((usqInt) w1 >> 8)) & Byte1Mask)) + ((((usqInt) w1 << 8)) & Byte2Mask)) + ((((usqInt) w1 << 24)) & Byte3Mask)
-		: w1);
+	sqImageFileRead((&w1), sizeof(w1), 1, f);
+	dataSize = ((sqInt) ((swapBytes
+	? ((((((usqInt) w1 >> 24)) & Byte0Mask) + ((((usqInt) w1 >> 8)) & Byte1Mask)) + ((((usqInt) w1 << 8)) & Byte2Mask)) + ((((usqInt) w1 << 24)) & Byte3Mask)
+	: w1)));
 	/* begin getLongFromFile:swap: */
 	w2 = 0;
-	sqImageFileRead((&w2), sizeof(long), 1, f);
+	sqImageFileRead((&w2), sizeof(w2), 1, f);
 	oldBaseAddr = (swapBytes
 		? ((((((usqInt) w2 >> 24)) & Byte0Mask) + ((((usqInt) w2 >> 8)) & Byte1Mask)) + ((((usqInt) w2 << 8)) & Byte2Mask)) + ((((usqInt) w2 << 24)) & Byte3Mask)
 		: w2);
 	/* begin specialObjectsOop: */
 	/* begin getLongFromFile:swap: */
 	w3 = 0;
-	sqImageFileRead((&w3), sizeof(long), 1, f);
+	sqImageFileRead((&w3), sizeof(w3), 1, f);
 	anObject = (swapBytes
 		? ((((((usqInt) w3 >> 24)) & Byte0Mask) + ((((usqInt) w3 >> 8)) & Byte1Mask)) + ((((usqInt) w3 << 8)) & Byte2Mask)) + ((((usqInt) w3 << 24)) & Byte3Mask)
 		: w3);
@@ -23565,20 +23565,20 @@
 	/* begin lastHash: */
 	/* begin getLongFromFile:swap: */
 	w4 = 0;
-	sqImageFileRead((&w4), sizeof(long), 1, f);
+	sqImageFileRead((&w4), sizeof(w4), 1, f);
 	seed = (swapBytes
 		? ((((((usqInt) w4 >> 24)) & Byte0Mask) + ((((usqInt) w4 >> 8)) & Byte1Mask)) + ((((usqInt) w4 << 8)) & Byte2Mask)) + ((((usqInt) w4 << 24)) & Byte3Mask)
 		: w4);
 	GIV(lastHash) = seed;
 	/* begin getLongFromFile:swap: */
 	w5 = 0;
-	sqImageFileRead((&w5), sizeof(long), 1, f);
+	sqImageFileRead((&w5), sizeof(w5), 1, f);
 	GIV(savedWindowSize) = (swapBytes
 		? ((((((usqInt) w5 >> 24)) & Byte0Mask) + ((((usqInt) w5 >> 8)) & Byte1Mask)) + ((((usqInt) w5 << 8)) & Byte2Mask)) + ((((usqInt) w5 << 24)) & Byte3Mask)
 		: w5);
 	/* begin getLongFromFile:swap: */
 	w6 = 0;
-	sqImageFileRead((&w6), sizeof(long), 1, f);
+	sqImageFileRead((&w6), sizeof(w6), 1, f);
 	headerFlags = (swapBytes
 		? ((((((usqInt) w6 >> 24)) & Byte0Mask) + ((((usqInt) w6 >> 8)) & Byte1Mask)) + ((((usqInt) w6 << 8)) & Byte2Mask)) + ((((usqInt) w6 << 24)) & Byte3Mask)
 		: w6);
@@ -23655,7 +23655,7 @@
 		: w11);
 	/* begin getLongFromFile:swap: */
 	w12 = 0;
-	sqImageFileRead((&w12), sizeof(long), 1, f);
+	sqImageFileRead((&w12), sizeof(w12), 1, f);
 	firstSegSize = (swapBytes
 		? ((((((usqInt) w12 >> 24)) & Byte0Mask) + ((((usqInt) w12 >> 8)) & Byte1Mask)) + ((((usqInt) w12 << 8)) & Byte2Mask)) + ((((usqInt) w12 << 24)) & Byte3Mask)
 		: w12);
@@ -29379,7 +29379,7 @@
 primitiveBitShift(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt integerArgument;
-    usqInt integerReceiver;
+    sqLong integerReceiver;
     sqInt shifted;
     char *sp;
 
@@ -29426,7 +29426,7 @@
 				}
 				return;
 			}
-			shifted = ((usqInt) integerReceiver) >> (0 - integerArgument);
+			shifted = ((unsigned sqLong)integerReceiver) >> (0 - integerArgument);
 		}
 		shifted = positive32BitIntegerFor(shifted);
 		/* begin pop:thenPush: */
@@ -40178,37 +40178,6 @@
 }
 
 
-/*	For the purposes of become: send selector to the cogit with obj1 and obj2
-	and answer the result. Undo forwarding for the selector. */
-
-sqInt
-withoutForwardingOnandsendToCogit(sqInt obj1, sqInt obj2, sqInt (*selector)(sqInt,sqInt))
-{
-    sqInt referent;
-    sqInt referent1;
-    sqInt targetA;
-    sqInt targetB;
-
-	/* begin followForwarded: */
-	assert(isUnambiguouslyForwarder(obj1));
-	referent = longAt((obj1 + BaseHeaderSize) + (0 << (shiftForWord())));
-	while (((referent & 3) == 0)
-	 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
-		referent = longAt((referent + BaseHeaderSize) + (0 << (shiftForWord())));
-	}
-	targetA = referent;
-	/* begin followForwarded: */
-	assert(isUnambiguouslyForwarder(obj2));
-	referent1 = longAt((obj2 + BaseHeaderSize) + (0 << (shiftForWord())));
-	while (((referent1 & 3) == 0)
-	 && (((longAt(referent1)) & 0x3FFFFF) == 8)) {
-		referent1 = longAt((referent1 + BaseHeaderSize) + (0 << (shiftForWord())));
-	}
-	targetB = referent1;
-	return selector(targetA, targetB);
-}
-
-
 /*	For the purposes of become: send selector to the cogit with obj1, obj2
 	and aBool and answer the result. Undo forwarding for the selector. */
 
@@ -63545,6 +63514,8 @@
 
 	assert((isImmediate(GIV(messageSelector)))
 	 || (addressCouldBeObj(GIV(messageSelector))));
+	/* begin mnuBreakpoint:receiver: */
+	mnuBreakpointreceiver(firstFixedFieldOfMaybeImmediate(GIV(messageSelector)), lengthOfMaybeImmediate(GIV(messageSelector)), null);
 	/* begin eeInstantiateSmallClassIndex:format:numSlots: */
 	assert((GIV(argumentCount) >= 0)
 	 && (ClassArrayCompactIndex != 0));
@@ -65893,22 +65864,23 @@
 
 
 /*	Handle a special send fault that may be due to a special selector
-	send accessing a forwarded object.
-	Unforward the object on the stack and in inst vars and answer its target. */
+	send accessing a forwarded object. obj is forwarded.
+	Unforward stack contents and and inst vars and answer obj's target. */
 
 static sqInt
 handleSpecialSelectorSendFaultForfpsp(sqInt obj, char *theFP, char *theSP)
 {
+    sqInt rcvr;
     sqInt referent;
 
 	assert(isOopForwarded(obj));
 	followForwardedFrameContentsstackPointer(theFP, theSP);
-	if (isPointers(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory())
+	rcvr = ((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory())
 		? longAt(theFP + FoxMFReceiver)
-		: longAt(theFP + FoxIFReceiver)))) {
-		followForwardedObjectFieldstoDepth(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory())
-			? longAt(theFP + FoxMFReceiver)
-			: longAt(theFP + FoxIFReceiver)), 0);
+		: longAt(theFP + FoxIFReceiver));
+	if (((rcvr & 3) == 0)
+	 && (((((usqInt) (longAt(rcvr))) >> 24) & 0x1F) <= 5)) {
+		followForwardedObjectFieldstoDepth(rcvr, 0);
 	}
 	/* begin followForwarded: */
 	assert(isUnambiguouslyForwarder(obj));
@@ -71705,18 +71677,30 @@
 }
 
 void
+setBreakMNUSelector(char *aString)
+{
+	if (((breakSelector = aString)) == null) {
+
+		/* nil's effective length is zero */
+
+		breakSelectorLength = MinSmallInteger;
+	}
+	else {
+		breakSelectorLength = -(strlen(aString));
+	}
+}
+
+void
 setBreakSelector(char *aString)
 {
-	if (aString == null) {
+	if (((breakSelector = aString)) == null) {
 
 		/* nil's effective length is zero */
 
-		breakSelectorLength = -1;
-		breakSelector = null;
+		breakSelectorLength = MinSmallInteger;
 	}
 	else {
 		breakSelectorLength = strlen(aString);
-		breakSelector = aString;
 	}
 }
 

Modified: branches/Cog/nsspursrc/vm/cointerp.h
===================================================================
--- branches/Cog/nsspursrc/vm/cointerp.h	2014-12-03 22:25:05 UTC (rev 3158)
+++ branches/Cog/nsspursrc/vm/cointerp.h	2014-12-05 20:27:02 UTC (rev 3159)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.962 uuid: 7f55aa33-f2c1-4b7d-8456-5c2a33e4298b
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06
  */
 
 
@@ -128,7 +128,6 @@
 sqLong nullHeaderForMachineCodeMethod(void);
 usqInt scavengeThresholdAddress(void);
 sqInt smallIntegerTag(void);
-sqInt withoutForwardingOnandsendToCogit(sqInt obj1, sqInt obj2, sqInt (*selector)(sqInt,sqInt));
 sqInt withoutForwardingOnandwithsendToCogit(sqInt obj1, sqInt obj2, sqInt aBool, sqInt (*selector)(sqInt,sqInt,sqInt));
 sqInt byteSwapped(sqInt w);
 sqInt isIntegerValue(sqInt intValue);
@@ -302,6 +301,7 @@
 sqInt printProcsOnList(sqInt procList);
 sqInt printStackCallStackOf(sqInt frameOrContext);
 void print(char *s);
+void setBreakMNUSelector(char *aString);
 void setBreakSelector(char *aString);
 void setNextWakeupUsecs(usqLong value);
 void shortPrintFrameAndNCallers(char *theFP, sqInt n);

Modified: branches/Cog/nsspursrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nsspursrc/vm/gcc3x-cointerp.c	2014-12-03 22:25:05 UTC (rev 3158)
+++ branches/Cog/nsspursrc/vm/gcc3x-cointerp.c	2014-12-05 20:27:02 UTC (rev 3159)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.962 uuid: 7f55aa33-f2c1-4b7d-8456-5c2a33e4298b
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06
    from
-	CoInterpreter VMMaker.oscog-eem.962 uuid: 7f55aa33-f2c1-4b7d-8456-5c2a33e4298b
+	CoInterpreter VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.962 uuid: 7f55aa33-f2c1-4b7d-8456-5c2a33e4298b " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.966 uuid: 46dd10c6-dc03-444c-bfa2-0f0b279c9b06 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -813,7 +813,6 @@
 sqLong nullHeaderForMachineCodeMethod(void);
 usqInt scavengeThresholdAddress(void);
 sqInt smallIntegerTag(void);
-sqInt withoutForwardingOnandsendToCogit(sqInt obj1, sqInt obj2, sqInt (*selector)(sqInt,sqInt));
 sqInt withoutForwardingOnandwithsendToCogit(sqInt obj1, sqInt obj2, sqInt aBool, sqInt (*selector)(sqInt,sqInt,sqInt));
 static sqInt addressAfter(sqInt objOop) NoDbgRegParms;
 static sqInt allocateSlotsForPinningInOldSpacebytesformatclassIndex(sqInt numSlots, usqInt totalBytes, sqInt formatField, sqInt classIndex) NoDbgRegParms;
@@ -1422,6 +1421,7 @@
 EXPORT(sqInt) returnAsThroughCallbackContext(sqInt returnTypeOop, VMCallbackContext *vmCallbackContext, sqInt callbackMethodContext);
 static sqInt reverseDisplayFromto(sqInt startIndex, sqInt endIndex) NoDbgRegParms;
 static sqInt safeMethodClassOf(sqInt methodPointer) NoDbgRegParms;
+void setBreakMNUSelector(char *aString);
 void setBreakSelector(char *aString);
 void setFullScreenFlag(sqInt value);
 EXPORT(void (*setInterruptCheckChain(void (*aFunction)(void)))()) ;
@@ -1728,9 +1728,9 @@
 sqInt inIOProcessEvents;
 sqInt desiredEdenBytes;
 sqInt desiredNumStackPages;
+sqInt breakSelectorLength = -1;
 sqInt extraVMMemory;
 sqInt desiredCogCodeSize;
-sqInt breakSelectorLength = -1;
 usqInt heapBase;
 void * showSurfaceFn;
 char * breakSelector;
@@ -2348,7 +2348,7 @@
 /*540*/	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
 /*560*/	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0,-1,-1
 	};
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.962";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.966";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -8851,7 +8851,7 @@
 			/* bytecodePrimBitShift */
 			{
 				sqInt integerArgument;
-				usqInt integerReceiver;
+				sqLong integerReceiver;
 				sqInt shifted;
 				char *sp;
 
@@ -8911,7 +8911,7 @@
 							null;
 							goto l76;
 						}
-						shifted = ((usqInt) integerReceiver) >> (0 - integerArgument);
+						shifted = ((unsigned sqLong)integerReceiver) >> (0 - integerArgument);
 					}
 					shifted = positive32BitIntegerFor(shifted);
 					/* begin pop:thenPush: */
@@ -11599,7 +11599,7 @@
 			/* bytecodePrimBitShift */
 			{
 				sqInt integerArgument;
-				usqInt integerReceiver;
+				sqLong integerReceiver;
 				sqInt shifted;
 				char *sp;
 
@@ -11659,7 +11659,7 @@
 							null;
 							goto l183;
 						}
-						shifted = ((usqInt) integerReceiver) >> (0 - integerArgument);
+						shifted = ((unsigned sqLong)integerReceiver) >> (0 - integerArgument);
 					}
 					shifted = positive32BitIntegerFor(shifted);
 					/* begin pop:thenPush: */
@@ -23519,15 +23519,15 @@
     sqInt survivorBytes;
     sqInt swapBytes;
     int w;
-    long w1;
+    sqInt w1;
     short w10;
     short w11;
-    long w12;
-    long w2;
-    long w3;
-    long w4;
-    long w5;
-    long w6;
+    sqInt w12;
+    sqInt w2;
+    sqInt w3;
+    sqInt w4;
+    sqInt w5;
+    sqInt w6;
     int w7;
     short w8;
     int w9;
@@ -23553,20 +23553,20 @@
 		: w);
 	/* begin getLongFromFile:swap: */
 	w1 = 0;
-	sqImageFileRead((&w1), sizeof(long), 1, f);
-	dataSize = (swapBytes
-		? ((((((usqInt) w1 >> 24)) & Byte0Mask) + ((((usqInt) w1 >> 8)) & Byte1Mask)) + ((((usqInt) w1 << 8)) & Byte2Mask)) + ((((usqInt) w1 << 24)) & Byte3Mask)
-		: w1);
+	sqImageFileRead((&w1), sizeof(w1), 1, f);
+	dataSize = ((sqInt) ((swapBytes
+	? ((((((usqInt) w1 >> 24)) & Byte0Mask) + ((((usqInt) w1 >> 8)) & Byte1Mask)) + ((((usqInt) w1 << 8)) & Byte2Mask)) + ((((usqInt) w1 << 24)) & Byte3Mask)
+	: w1)));
 	/* begin getLongFromFile:swap: */
 	w2 = 0;
-	sqImageFileRead((&w2), sizeof(long), 1, f);
+	sqImageFileRead((&w2), sizeof(w2), 1, f);
 	oldBaseAddr = (swapBytes
 		? ((((((usqInt) w2 >> 24)) & Byte0Mask) + ((((usqInt) w2 >> 8)) & Byte1Mask)) + ((((usqInt) w2 << 8)) & Byte2Mask)) + ((((usqInt) w2 << 24)) & Byte3Mask)
 		: w2);
 	/* begin specialObjectsOop: */
 	/* begin getLongFromFile:swap: */
 	w3 = 0;
-	sqImageFileRead((&w3), sizeof(long), 1, f);
+	sqImageFileRead((&w3), sizeof(w3), 1, f);
 	anObject = (swapBytes
 		? ((((((usqInt) w3 >> 24)) & Byte0Mask) + ((((usqInt) w3 >> 8)) & Byte1Mask)) + ((((usqInt) w3 << 8)) & Byte2Mask)) + ((((usqInt) w3 << 24)) & Byte3Mask)
 		: w3);
@@ -23574,20 +23574,20 @@
 	/* begin lastHash: */
 	/* begin getLongFromFile:swap: */
 	w4 = 0;
-	sqImageFileRead((&w4), sizeof(long), 1, f);
+	sqImageFileRead((&w4), sizeof(w4), 1, f);
 	seed = (swapBytes
 		? ((((((usqInt) w4 >> 24)) & Byte0Mask) + ((((usqInt) w4 >> 8)) & Byte1Mask)) + ((((usqInt) w4 << 8)) & Byte2Mask)) + ((((usqInt) w4 << 24)) & Byte3Mask)
 		: w4);
 	GIV(lastHash) = seed;
 	/* begin getLongFromFile:swap: */
 	w5 = 0;
-	sqImageFileRead((&w5), sizeof(long), 1, f);
+	sqImageFileRead((&w5), sizeof(w5), 1, f);
 	GIV(savedWindowSize) = (swapBytes
 		? ((((((usqInt) w5 >> 24)) & Byte0Mask) + ((((usqInt) w5 >> 8)) & Byte1Mask)) + ((((usqInt) w5 << 8)) & Byte2Mask)) + ((((usqInt) w5 << 24)) & Byte3Mask)
 		: w5);
 	/* begin getLongFromFile:swap: */
 	w6 = 0;
-	sqImageFileRead((&w6), sizeof(long), 1, f);
+	sqImageFileRead((&w6), sizeof(w6), 1, f);
 	headerFlags = (swapBytes
 		? ((((((usqInt) w6 >> 24)) & Byte0Mask) + ((((usqInt) w6 >> 8)) & Byte1Mask)) + ((((usqInt) w6 << 8)) & Byte2Mask)) + ((((usqInt) w6 << 24)) & Byte3Mask)
 		: w6);
@@ -23664,7 +23664,7 @@
 		: w11);
 	/* begin getLongFromFile:swap: */
 	w12 = 0;
-	sqImageFileRead((&w12), sizeof(long), 1, f);
+	sqImageFileRead((&w12), sizeof(w12), 1, f);
 	firstSegSize = (swapBytes
 		? ((((((usqInt) w12 >> 24)) & Byte0Mask) + ((((usqInt) w12 >> 8)) & Byte1Mask)) + ((((usqInt) w12 << 8)) & Byte2Mask)) + ((((usqInt) w12 << 24)) & Byte3Mask)
 		: w12);
@@ -29388,7 +29388,7 @@
 primitiveBitShift(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt integerArgument;
-    usqInt integerReceiver;
+    sqLong integerReceiver;
     sqInt shifted;
     char *sp;
 
@@ -29435,7 +29435,7 @@
 				}
 				return;
 			}
-			shifted = ((usqInt) integerReceiver) >> (0 - integerArgument);
+			shifted = ((unsigned sqLong)integerReceiver) >> (0 - integerArgument);
 		}
 		shifted = positive32BitIntegerFor(shifted);
 		/* begin pop:thenPush: */
@@ -40187,37 +40187,6 @@
 }
 
 
-/*	For the purposes of become: send selector to the cogit with obj1 and obj2
-	and answer the result. Undo forwarding for the selector. */
-
-sqInt
-withoutForwardingOnandsendToCogit(sqInt obj1, sqInt obj2, sqInt (*selector)(sqInt,sqInt))
-{
-    sqInt referent;
-    sqInt referent1;
-    sqInt targetA;
-    sqInt targetB;
-
-	/* begin followForwarded: */
-	assert(isUnambiguouslyForwarder(obj1));
-	referent = longAt((obj1 + BaseHeaderSize) + (0 << (shiftForWord())));
-	while (((referent & 3) == 0)
-	 && (((longAt(referent)) & 0x3FFFFF) == 8)) {
-		referent = longAt((referent + BaseHeaderSize) + (0 << (shiftForWord())));
-	}
-	targetA = referent;
-	/* begin followForwarded: */
-	assert(isUnambiguouslyForwarder(obj2));
-	referent1 = longAt((obj2 + BaseHeaderSize) + (0 << (shiftForWord())));
-	while (((referent1 & 3) == 0)
-	 && (((longAt(referent1)) & 0x3FFFFF) == 8)) {
-		referent1 = longAt((referent1 + BaseHeaderSize) + (0 << (shiftForWord())));
-	}
-	targetB = referent1;
-	return selector(targetA, targetB);
-}
-
-
 /*	For the purposes of become: send selector to the cogit with obj1, obj2
 	and aBool and answer the result. Undo forwarding for the selector. */
 
@@ -63554,6 +63523,8 @@
 
 	assert((isImmediate(GIV(messageSelector)))
 	 || (addressCouldBeObj(GIV(messageSelector))));
+	/* begin mnuBreakpoint:receiver: */
+	mnuBreakpointreceiver(firstFixedFieldOfMaybeImmediate(GIV(messageSelector)), lengthOfMaybeImmediate(GIV(messageSelector)), null);
 	/* begin eeInstantiateSmallClassIndex:format:numSlots: */
 	assert((GIV(argumentCount) >= 0)
 	 && (ClassArrayCompactIndex != 0));
@@ -65902,22 +65873,23 @@
 
 
 /*	Handle a special send fault that may be due to a special selector
-	send accessing a forwarded object.
-	Unforward the object on the stack and in inst vars and answer its target. */
+	send accessing a forwarded object. obj is forwarded.
+	Unforward stack contents and and inst vars and answer obj's target. */
 
 static sqInt
 handleSpecialSelectorSendFaultForfpsp(sqInt obj, char *theFP, char *theSP)
 {
+    sqInt rcvr;
     sqInt referent;
 
 	assert(isOopForwarded(obj));
 	followForwardedFrameContentsstackPointer(theFP, theSP);
-	if (isPointers(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory())
+	rcvr = ((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory())
 		? longAt(theFP + FoxMFReceiver)
-		: longAt(theFP + FoxIFReceiver)))) {
-		followForwardedObjectFieldstoDepth(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory())
-			? longAt(theFP + FoxMFReceiver)
-			: longAt(theFP + FoxIFReceiver)), 0);
+		: longAt(theFP + FoxIFReceiver));
+	if (((rcvr & 3) == 0)
+	 && (((((usqInt) (longAt(rcvr))) >> 24) & 0x1F) <= 5)) {
+		followForwardedObjectFieldstoDepth(rcvr, 0);
 	}
 	/* begin followForwarded: */
 	assert(isUnambiguouslyForwarder(obj));
@@ -71714,18 +71686,30 @@
 }
 
 void
+setBreakMNUSelector(char *aString)
+{
+	if (((breakSelector = aString)) == null) {
+
+		/* nil's effective length is zero */
+
+		breakSelectorLength = MinSmallInteger;
+	}
+	else {
+		breakSelectorLength = -(strlen(aString));
+	}
+}
+
+void
 setBreakSelector(char *aString)
 {
-	if (aString == null) {
+	if (((breakSelector = aString)) == null) {
 
 		/* nil's effective length is zero */
 
-		breakSelectorLength = -1;
-		breakSelector = null;
+		breakSelectorLength = MinSmallInteger;
 	}
 	else {
 		breakSelectorLength = strlen(aString);
-		breakSelector = aString;
 	}
 }
 

Modified: branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c
===================================================================
--- branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c	2014-12-03 22:25:05 UTC (rev 3158)
+++ branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c	2014-12-05 20:27:02 UTC (rev 3159)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by

@@ Diff output truncated at 50000 characters. @@


More information about the Vm-dev mailing list