[Vm-dev] [commit][3233] CogVM source as per VMMaker.oscog-eem.1024

commits at squeakvm.org commits at squeakvm.org
Tue Jan 20 20:28:34 UTC 2015


Revision: 3233
Author:   eliot
Date:     2015-01-20 12:28:27 -0800 (Tue, 20 Jan 2015)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.1024

Newspeak:
Integrate Ryan's newer absent receiver sends, which first apeared in
VMMaker.oscog-eem.919, abandoned because of Glue issues now resolved.  Includes
nice refactoring of absent send argument marshalling into its own routine.

Spur: Provide a validFreeTree checker.

Modified Paths:
--------------
    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/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/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/vm/cogit.c
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.c	2015-01-19 03:36:05 UTC (rev 3232)
+++ branches/Cog/nscogsrc/vm/cogit.c	2015-01-20 20:28:27 UTC (rev 3233)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1022 uuid: 69a59ffb-cfbd-4b9e-af74-7c2eb662beac
+	CCodeGenerator VMMaker.oscog-eem.1024 uuid: f6cf904e-36ea-4109-a415-b8564601d19e
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.1022 uuid: 69a59ffb-cfbd-4b9e-af74-7c2eb662beac
+	StackToRegisterMappingCogit VMMaker.oscog-eem.1024 uuid: f6cf904e-36ea-4109-a415-b8564601d19e
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1022 uuid: 69a59ffb-cfbd-4b9e-af74-7c2eb662beac " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1024 uuid: f6cf904e-36ea-4109-a415-b8564601d19e " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -924,6 +924,8 @@
 static sqInt genExtReturnTopFromBlock(void);
 static sqInt genExtSendAbsentDynamicSuperBytecode(void);
 static sqInt genExtSendAbsentImplicitBytecode(void);
+static sqInt genExtSendAbsentOuterBytecode(void);
+static sqInt genExtSendAbsentSelfBytecode(void);
 static sqInt genExtSendBytecode(void);
 static sqInt genExtSendSuperBytecode(void);
 static sqInt genExtStoreAndPopLiteralVariableBytecode(void);
@@ -1088,6 +1090,8 @@
 static sqInt genReturnTopFromMethod(void);
 static sqInt genSendAbsentDynamicSupernumArgs(sqInt selector, sqInt numArgs) NoDbgRegParms;
 static sqInt genSendAbsentImplicitnumArgs(sqInt selector, sqInt numArgs) NoDbgRegParms;
+static sqInt genSendAbsentOuternumArgsdepth(sqInt selector, sqInt numArgs, sqInt depth) NoDbgRegParms;
+static sqInt genSendAbsentSelfnumArgs(sqInt selector, sqInt numArgs) NoDbgRegParms;
 static sqInt genSendDynamicSupernumArgs(sqInt selector, sqInt numArgs) NoDbgRegParms;
 static sqInt genSendSupernumArgs(sqInt selector, sqInt numArgs) NoDbgRegParms;
 static sqInt genSendTrampolineFornumArgscalledargargarg(void *aRoutine, sqInt numArgs, char *aString, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2) NoDbgRegParms;
@@ -1110,7 +1114,7 @@
 static void initSimStackForFramelessBlock(sqInt startpc) NoDbgRegParms;
 static void initSimStackForFramelessMethod(sqInt startpc) NoDbgRegParms;
 static sqInt liveRegisters(void);
-static void marshallImplicitReceiverSendArguments(sqInt numArgs) NoDbgRegParms;
+static void marshallAbsentReceiverSendArguments(sqInt numArgs) NoDbgRegParms;
 static void marshallSendArguments(sqInt numArgs) NoDbgRegParms;
 static void mergeafterContinuation(BytecodeFixup *fixup, sqInt mergeWithContinuation) NoDbgRegParms;
 static sqInt methodAbortTrampolineFor(sqInt numArgs) NoDbgRegParms;
@@ -1749,16 +1753,16 @@
 	{ genExtUnconditionalJump, v4LongBranchDistance, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0 },
 	{ genExtJumpIfTrue, v4LongBranchDistance, 0, 0, 0, 2, 1, 0, 0, 0, 1, 0, 0, 0 },
 	{ genExtJumpIfFalse, v4LongBranchDistance, 0, 0, 0, 2, 0, 1, 0, 0, 1, 0, 0, 0 },
+	{ genExtSendAbsentSelfBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0 },
 	{ unknownBytecode, 0, 0, 0, Nop, 2, 0, 0, 0, 0, 0, 0, 1, 0 },
 	{ unknownBytecode, 0, 0, 0, Nop, 2, 0, 0, 0, 0, 0, 0, 1, 0 },
 	{ unknownBytecode, 0, 0, 0, Nop, 2, 0, 0, 0, 0, 0, 0, 1, 0 },
-	{ unknownBytecode, 0, 0, 0, Nop, 2, 0, 0, 0, 0, 0, 0, 1, 0 },
 	{ callPrimitiveBytecode, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0 },
 	{ genPushRemoteTempLongBytecode, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0 },
 	{ genStoreRemoteTempLongBytecode, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0 },
 	{ genStoreAndPopRemoteTempLongBytecode, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0 },
 	{ genExtPushClosureBytecode, v4BlockCodeSize, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0 },
-	{ unknownBytecode, 0, 0, 0, Nop, 3, 0, 0, 0, 0, 0, 0, 1, 0 },
+	{ genExtSendAbsentOuterBytecode, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 0, 0, 0 },
 	{ unknownBytecode, 0, 0, 0, Nop, 3, 0, 0, 0, 0, 0, 0, 1, 0 }
 };
 static sqInt guardPageSize;
@@ -17465,6 +17469,45 @@
 }
 
 
+/*	254		 11111110	i i i i i j j j kkkkkkkk	Send To Absent Outer Literal
+	Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments at
+	Depth kkkkkkkk
+ */
+
+static sqInt
+genExtSendAbsentOuterBytecode(void)
+{
+    sqInt depth;
+    sqInt litIndex;
+    sqInt nArgs;
+
+	litIndex = (((usqInt) byte1) >> 3) + (extA << 5);
+	extA = 0;
+	nArgs = (byte1 & 7) + (extB << 3);
+	extB = 0;
+	depth = byte2;
+	return genSendAbsentOuternumArgsdepth(getLiteral(litIndex), nArgs, depth);
+}
+
+
+/*	245		11110101	i i i i i j j j	Send To Absent Self Literal Selector #iiiii
+	(+ Extend A * 32) with jjj (+ Extend B * 8) Arguments
+ */
+
+static sqInt
+genExtSendAbsentSelfBytecode(void)
+{
+    sqInt litIndex;
+    sqInt nArgs;
+
+	litIndex = (((usqInt) byte1) >> 3) + (extA << 5);
+	extA = 0;
+	nArgs = (byte1 & 7) + (extB << 3);
+	extB = 0;
+	return genSendAbsentSelfnumArgs(getLiteral(litIndex), nArgs);
+}
+
+
 /*	238		11101110	i i i i i j j j	Send Literal Selector #iiiii (+ Extend A *
 	32) with jjj (+ Extend B * 8) Arguments
  */
@@ -20954,7 +20997,7 @@
 	ssAllocateCallReg(ReceiverResultReg);
 	/* begin MoveMw:r:R: */
 	genoperandoperandoperand(MoveMwrR, FoxMFReceiver, FPReg, ReceiverResultReg);
-	marshallImplicitReceiverSendArguments(numArgs);
+	marshallAbsentReceiverSendArguments(numArgs);
 	return genMarshalledSendDynamicSupernumArgs(selector, numArgs);
 }
 
@@ -20972,11 +21015,53 @@
 	if (result != 0) {
 		return result;
 	}
-	marshallImplicitReceiverSendArguments(numArgs);
+	marshallAbsentReceiverSendArguments(numArgs);
 	return genMarshalledSendnumArgs(selector, numArgs);
 }
 
+
+/*	OK, we could do better and avoid spilling ReceiverResultReg if we
+	refactored marshallAbsentReceiverSendArguments: to take a flag saying
+	whether the
+	receiver was in ReceiverResultReg (absent receiver send) or on the stack
+	(absent dynamic super send) and in the latter case loading
+	ReceiverResultReg from the stack after marshalling. But this is a rare
+	bytecode so for the moment
+	don't bother. */
+
 static sqInt
+genSendAbsentOuternumArgsdepth(sqInt selector, sqInt numArgs, sqInt depth)
+{
+	(optStatus.isReceiverResultRegLive = 0);
+	ssAllocateCallReg(SendNumArgsReg);
+	/* begin MoveCq:R: */
+	genoperandoperand(MoveCqR, depth, SendNumArgsReg);
+	CallRT(ceEnclosingObjectTrampoline);
+	marshallAbsentReceiverSendArguments(numArgs);
+	return genMarshalledSendnumArgs(selector, numArgs);
+}
+
+
+/*	OK, we could do better and avoid spilling ReceiverResultReg if we
+	refactored marshallAbsentReceiverSendArguments: to take a flag saying
+	whether the
+	receiver was in ReceiverResultReg (absent receiver send) or on the stack
+	(absent dynamic super send) and in the latter case loading
+	ReceiverResultReg from the stack after marshalling. But this is a rare
+	bytecode so for the moment
+	don't bother. */
+
+static sqInt
+genSendAbsentSelfnumArgs(sqInt selector, sqInt numArgs)
+{
+	ssAllocateCallReg(ReceiverResultReg);
+	/* begin MoveMw:r:R: */
+	genoperandoperandoperand(MoveMwrR, FoxMFReceiver, FPReg, ReceiverResultReg);
+	marshallAbsentReceiverSendArguments(numArgs);
+	return genMarshalledSendnumArgs(selector, numArgs);
+}
+
+static sqInt
 genSendDynamicSupernumArgs(sqInt selector, sqInt numArgs)
 {
 	marshallSendArguments(numArgs);
@@ -21964,7 +22049,7 @@
 	necessary.  */
 
 static void
-marshallImplicitReceiverSendArguments(sqInt numArgs)
+marshallAbsentReceiverSendArguments(sqInt numArgs)
 {
     sqInt index;
     sqInt numSpilled;

Modified: branches/Cog/nscogsrc/vm/cogit.h
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.h	2015-01-19 03:36:05 UTC (rev 3232)
+++ branches/Cog/nscogsrc/vm/cogit.h	2015-01-20 20:28:27 UTC (rev 3233)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1022 uuid: 69a59ffb-cfbd-4b9e-af74-7c2eb662beac
+	CCodeGenerator VMMaker.oscog-eem.1024 uuid: f6cf904e-36ea-4109-a415-b8564601d19e
  */
 
 

Modified: branches/Cog/nscogsrc/vm/cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.c	2015-01-19 03:36:05 UTC (rev 3232)
+++ branches/Cog/nscogsrc/vm/cointerp.c	2015-01-20 20:28:27 UTC (rev 3233)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1023 uuid: 3b0b931e-e8b1-4155-ac38-8a078ddcec98
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1024 uuid: f6cf904e-36ea-4109-a415-b8564601d19e
    from
-	CoInterpreter VMMaker.oscog-eem.1023 uuid: 3b0b931e-e8b1-4155-ac38-8a078ddcec98
+	CoInterpreter VMMaker.oscog-eem.1024 uuid: f6cf904e-36ea-4109-a415-b8564601d19e
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1023 uuid: 3b0b931e-e8b1-4155-ac38-8a078ddcec98 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1024 uuid: f6cf904e-36ea-4109-a415-b8564601d19e " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -464,7 +464,7 @@
 static sqInt iframeReceiver(char *theFP) NoDbgRegParms;
 static sqInt iframeSavedIP(char *theFP) NoDbgRegParms;
 void ifValidWriteBackStackPointersSaveTo(void *theCFP, void *theCSP, char **savedFPP, char **savedSPP);
-sqInt implicitReceiverFormixinimplementing(sqInt rcvr, sqInt mixin, sqInt selector);
+sqInt implicitReceiverFormixinimplementing(sqInt methodReceiver, sqInt methodMixin, sqInt selector);
 usqInt instructionPointerAddress(void);
 static sqInt instructionPointerForFramecurrentFPcurrentIP(char *spouseFP, char *currentFP, sqInt instrPtr) NoDbgRegParms;
 usqInt interpretAddress(void);
@@ -1058,7 +1058,7 @@
 sqInt doSignalSemaphoreWithIndex(sqInt index);
 static void dummyReferToProxy(void);
 EXPORT(sqInt) dumpImage(sqInt fileName);
-static sqInt enclosingObjectAtwithObjectwithMixin(sqInt n, sqInt anObject, sqInt mixin) NoDbgRegParms;
+static sqInt enclosingObjectAtwithObjectwithMixin(sqInt depth, sqInt methodReceiver, sqInt methodMixin) NoDbgRegParms;
 static sqInt ensureCallerContext(char *theFP) NoDbgRegParms;
 static void ensureImageFormatIsUpToDate(sqInt swapBytes) NoDbgRegParms;
 static char * establishFrameForContextToReturnTo(sqInt contextToReturnTo) NoDbgRegParms;
@@ -1072,8 +1072,6 @@
 sqInt fetchIntegerofObject(sqInt fieldIndex, sqInt objectPointer);
 static sqInt fetchPointerofMarriedContext(sqInt offset, sqInt aContext) NoDbgRegParms;
 static sqInt fetchStackPointerOf(sqInt aContext) NoDbgRegParms;
-static sqInt findApplicationOfTargetMixinstartingAtBehavior(sqInt targetMixin, sqInt aBehavior) NoDbgRegParms;
-static sqInt findApplicationOfTargetMixinstartingAtNonMetaClass(sqInt targetMixin, sqInt aClass) NoDbgRegParms;
 static sqInt findClassContainingMethodstartingAt(sqInt meth, sqInt classObj) NoDbgRegParms;
 sqInt findClassOfMethodforReceiver(sqInt meth, sqInt rcvr);
 static char * findFrameAboveinPage(char *theFP, StackPage *thePage) NoDbgRegParms;
@@ -1415,7 +1413,6 @@
 _iss sqInt tenuringThreshold;
 _iss sqInt forceTenureFlag;
 _iss sqInt longRunningPrimitiveCheckSequenceNumber;
-_iss sqInt methodDictLinearSearchLimit;
 _iss sqInt signalLowSpace;
 _iss usqLong statFullGCUsecs;
 _iss sqInt statFullGCs;
@@ -1431,6 +1428,7 @@
 _iss sqInt interruptKeycode;
 _iss sqInt interruptPending;
 _iss usqInt memory;
+_iss sqInt methodDictLinearSearchLimit;
 _iss usqLong nextPollUsecs;
 _iss usqLong statForceInterruptCheck;
 _iss usqLong statIGCDeltaUsecs;
@@ -2101,7 +2099,7 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 char expensiveAsserts = 0;
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1023";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1024";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -4904,9 +4902,12 @@
 		case 126:
 			/* dynamicSuperSendBytecode */
 			{
+				sqInt aBehavior;
 				sqInt ccIndex;
 				sqInt mClassMixin;
+				sqInt mixin;
 				sqInt mixinApplication;
+				sqInt mixinApplication1;
 				sqInt rcvr;
 
 				VM_LABEL(dynamicSuperSendBytecode);
@@ -4916,12 +4917,20 @@
 				GIV(messageSelector) = longAt((GIV(method) + BaseHeaderSize) + (((byteAtPointer(++localIP)) + LiteralStart) << (shiftForWord())));
 				rcvr = longAtPointer(localSP + (GIV(argumentCount) * BytesPerOop));
 				mClassMixin = methodClassOf(GIV(method));
-				mixinApplication = findApplicationOfTargetMixinstartingAtBehavior(mClassMixin, ((rcvr & 1)
+				/* begin findApplicationOfTargetMixin:startingAtBehavior: */
+				aBehavior = ((rcvr & 1)
 					? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << (shiftForWord())))
 					: (((ccIndex = (((usqInt) (longAt(rcvr))) >> (compactClassFieldLSB())) & 0x1F)) == 0
 							? (longAt(rcvr - BaseHeaderSize)) & AllButTypeMask
 							: (/* begin fetchPointer:ofObject: */
-								longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord())))))));
+								longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord()))))));
+				mixinApplication1 = aBehavior;
+				while (!((mixinApplication1 == GIV(nilObj))
+				 || ((mixinApplication1 == mClassMixin)
+				 || (((mixin = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << (shiftForWord()))))) == mClassMixin)))) {
+					mixinApplication1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << (shiftForWord())));
+				}
+				mixinApplication = mixinApplication1;
 				/* begin classTagForClass: */
 				lkupClassTag = longAt((mixinApplication + BaseHeaderSize) + (SuperclassIndex << (shiftForWord())));
 				goto commonSend;
@@ -12787,11 +12796,14 @@
 		case 497: /*241*/
 			/* extSendAbsentDynamicSuperBytecode */
 			{
+				sqInt aBehavior;
 				sqInt byte;
 				sqInt ccIndex;
 				sqInt i;
 				sqInt mClassMixin;
+				sqInt mixin;
 				sqInt mixinApplication;
+				sqInt mixinApplication1;
 				sqInt oop;
 
 				VM_LABEL(extSendAbsentDynamicSuperBytecode);
@@ -12813,12 +12825,20 @@
 				}
 				longAtPointerput(localSP + (GIV(argumentCount) * BytesPerOop), longAt(localFP + FoxIFReceiver));
 				mClassMixin = methodClassOf(GIV(method));
-				mixinApplication = findApplicationOfTargetMixinstartingAtBehavior(mClassMixin, (((longAt(localFP + FoxIFReceiver)) & 1)
+				/* begin findApplicationOfTargetMixin:startingAtBehavior: */
+				aBehavior = (((longAt(localFP + FoxIFReceiver)) & 1)
 					? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << (shiftForWord())))
 					: (((ccIndex = (((usqInt) (longAt(longAt(localFP + FoxIFReceiver)))) >> (compactClassFieldLSB())) & 0x1F)) == 0
 							? (longAt((longAt(localFP + FoxIFReceiver)) - BaseHeaderSize)) & AllButTypeMask
 							: (/* begin fetchPointer:ofObject: */
-								longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord())))))));
+								longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord()))))));
+				mixinApplication1 = aBehavior;
+				while (!((mixinApplication1 == GIV(nilObj))
+				 || ((mixinApplication1 == mClassMixin)
+				 || (((mixin = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << (shiftForWord()))))) == mClassMixin)))) {
+					mixinApplication1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << (shiftForWord())));
+				}
+				mixinApplication = mixinApplication1;
 				/* begin classTagForClass: */
 				lkupClassTag = longAt((mixinApplication + BaseHeaderSize) + (SuperclassIndex << (shiftForWord())));
 				goto commonSend;
@@ -12965,10 +12985,46 @@
 			}
 			break;
 		case 501: /*245*/
+			/* extSendAbsentSelfBytecode */
+			{
+				sqInt byte;
+				sqInt ccIndex;
+				sqInt classObj;
+				sqInt i;
+				sqInt oop;
+
+				VM_LABEL(extSendAbsentSelfBytecode);
+				byte = byteAtPointer(++localIP);
+				/* begin literal: */
+				assert(GIV(method) == (iframeMethod(localFP)));
+				GIV(messageSelector) = longAt((GIV(method) + BaseHeaderSize) + ((((((usqInt) byte) >> 3) + (extA << 5)) + LiteralStart) << (shiftForWord())));
+				extA = 0;
+				GIV(argumentCount) = (byte & 7) + (extB << 3);
+				extB = 0;
+				/* begin shuffleArgumentsAndStoreAbsentReceiver: */
+
+				/* a.k.a. self internalPush: anything */
+
+				localSP -= BytesPerOop;
+				for (i = 1; i <= GIV(argumentCount); i += 1) {
+					oop = longAtPointer(localSP + (i * BytesPerOop));
+					longAtPointerput(localSP + ((i - 1) * BytesPerOop), oop);
+				}
+				longAtPointerput(localSP + (GIV(argumentCount) * BytesPerOop), longAt(localFP + FoxIFReceiver));
+				/* begin classTagForClass: */
+				classObj = (((longAt(localFP + FoxIFReceiver)) & 1)
+					? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << (shiftForWord())))
+					: (((ccIndex = (((usqInt) (longAt(longAt(localFP + FoxIFReceiver)))) >> (compactClassFieldLSB())) & 0x1F)) == 0
+							? (longAt((longAt(localFP + FoxIFReceiver)) - BaseHeaderSize)) & AllButTypeMask
+							: (/* begin fetchPointer:ofObject: */
+								longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord()))))));
+				lkupClassTag = classObj;
+				goto commonSend;
+			}
+			break;
 		case 502: /*246*/
 		case 503: /*247*/
 		case 504: /*248*/
-		case 510: /*254*/
 		case 511: /*255*/
 			/* unknownBytecode */
 			{
@@ -13083,6 +13139,48 @@
 				longAtPointerput((localSP -= BytesPerOop), newClosure);
 			}
 			break;
+		case 510: /*254*/
+			/* extSendAbsentOuterBytecode */
+			{
+				sqInt absentReceiver;
+				sqInt byte;
+				sqInt ccIndex;
+				sqInt classObj;
+				sqInt depth;
+				sqInt i;
+				sqInt oop;
+
+				VM_LABEL(extSendAbsentOuterBytecode);
+				byte = byteAtPointer(++localIP);
+				/* begin literal: */
+				assert(GIV(method) == (iframeMethod(localFP)));
+				GIV(messageSelector) = longAt((GIV(method) + BaseHeaderSize) + ((((((usqInt) byte) >> 3) + (extA << 5)) + LiteralStart) << (shiftForWord())));
+				extA = 0;
+				GIV(argumentCount) = (byte & 7) + (extB << 3);
+				extB = 0;
+				depth = byteAtPointer(++localIP);
+				absentReceiver = enclosingObjectAtwithObjectwithMixin(depth, longAt(localFP + FoxIFReceiver), methodClassOf(GIV(method)));
+				/* begin shuffleArgumentsAndStoreAbsentReceiver: */
+
+				/* a.k.a. self internalPush: anything */
+
+				localSP -= BytesPerOop;
+				for (i = 1; i <= GIV(argumentCount); i += 1) {
+					oop = longAtPointer(localSP + (i * BytesPerOop));
+					longAtPointerput(localSP + ((i - 1) * BytesPerOop), oop);
+				}
+				longAtPointerput(localSP + (GIV(argumentCount) * BytesPerOop), absentReceiver);
+				/* begin classTagForClass: */
+				classObj = ((absentReceiver & 1)
+					? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << (shiftForWord())))
+					: (((ccIndex = (((usqInt) (longAt(absentReceiver))) >> (compactClassFieldLSB())) & 0x1F)) == 0
+							? (longAt(absentReceiver - BaseHeaderSize)) & AllButTypeMask
+							: (/* begin fetchPointer:ofObject: */
+								longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord()))))));
+				lkupClassTag = classObj;
+				goto commonSend;
+			}
+			break;
 		}
 	}
 
@@ -14212,6 +14310,7 @@
 sqInt
 ceDynamicSuperSendtonumArgs(sqInt selector, sqInt rcvr, sqInt numArgs)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt aBehavior;
     sqInt ccIndex;
     sqInt classTag;
     CogMethod *cogMethod;
@@ -14220,7 +14319,9 @@
     sqInt mClassMixin;
     sqInt methodHeader;
     sqInt methodHeader1;
+    sqInt mixin;
     sqInt mixinApplication;
+    sqInt mixinApplication1;
     CogMethod *newCogMethod;
     sqInt top;
     sqInt top1;
@@ -14234,12 +14335,20 @@
 	/* begin sendBreakpoint:receiver: */
 	sendBreakpointreceiver(firstFixedFieldOfMaybeImmediate(selector), lengthOfMaybeImmediate(selector), rcvr);
 	mClassMixin = methodClassOf(((mframeHomeMethod(GIV(framePointer)))->methodObject));
-	mixinApplication = findApplicationOfTargetMixinstartingAtBehavior(mClassMixin, ((rcvr & 1)
+	/* begin findApplicationOfTargetMixin:startingAtBehavior: */
+	aBehavior = ((rcvr & 1)
 		? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << (shiftForWord())))
 		: (((ccIndex = (((usqInt) (longAt(rcvr))) >> (compactClassFieldLSB())) & 0x1F)) == 0
 				? (longAt(rcvr - BaseHeaderSize)) & AllButTypeMask
 				: (/* begin fetchPointer:ofObject: */
-					longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord())))))));
+					longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord()))))));
+	mixinApplication1 = aBehavior;
+	while (!((mixinApplication1 == GIV(nilObj))
+	 || ((mixinApplication1 == mClassMixin)
+	 || (((mixin = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << (shiftForWord()))))) == mClassMixin)))) {
+		mixinApplication1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << (shiftForWord())));
+	}
+	mixinApplication = mixinApplication1;
 	assert((lengthOf(mixinApplication)) > (InstanceSpecificationIndex + 1));
 	/* begin classTagForClass: */
 	classTag = longAt((mixinApplication + BaseHeaderSize) + (SuperclassIndex << (shiftForWord())));
@@ -16643,251 +16752,144 @@
 }
 
 
-/*	This is used to implement the innards of the pushImplicitReceiverBytecode,
-	used for implicit receiver sends in NS2/NS3. Find the nearest
-	lexically-enclosing implementation of selector by searching up the static
-	chain of anObject,
-	starting at mixin's application. This is an iterative implementation
+/*	This is used to implement implicit receiver sends in Newspeak. Find the
+	nearest lexically-enclosing implementation of selector by searching up the
+	static chain of the
+	method's receiver, starting at mixin's application. This implementation is
 	derived from
 	
-	<ContextPart> implicitReceiverFor: obj <Object>
-	withMixin: mixin <Mixin>
+	<ContextPart> implicitReceiverFor: methodReceiver <Object>
+	in: methodMixin <Mixin>
 	implementing: selector <Symbol> ^<Object> */
-/*	This is used to implement the innards of the pushImplicitReceiverBytecode,
-	used for implicit receiver sends in NS2/NS3. Find the nearest
-	lexically-enclosing implementation of selector by searching up the static
-	chain of anObject,
-	starting at mixin's application. This is an iterative implementation
+/*	This is used to implement implicit receiver sends in Newspeak. Find the
+	nearest lexically-enclosing implementation of selector by searching up the
+	static chain of the
+	method's receiver, starting at mixin's application. This implementation is
 	derived from
 	
-	<ContextPart> implicitReceiverFor: obj <Object>
-	withMixin: mixin <Mixin>
+	<ContextPart> implicitReceiverFor: methodReceiver <Object>
+	in: methodMixin <Mixin>
 	implementing: selector <Symbol> ^<Object> */
 
 sqInt
-implicitReceiverFormixinimplementing(sqInt rcvr, sqInt mixin, sqInt selector)
+implicitReceiverFormixinimplementing(sqInt methodReceiver, sqInt methodMixin, sqInt selector)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
-    sqInt anObject;
+    sqInt aBehavior;
+    sqInt candidateMixin;
+    sqInt candidateMixinApplication;
+    sqInt candidateReceiver;
     sqInt ccIndex;
-    sqInt ccIndex1;
     sqInt dictionary;
-    sqInt dictionary1;
     sqInt found;
-    sqInt found1;
     sqInt header;
-    sqInt header1;
-    sqInt implicitReceiver;
-    sqInt implicitReceiverOrNil;
     sqInt index;
-    sqInt index1;
     sqInt length;
-    sqInt length1;
     sqInt mask;
-    sqInt mask1;
     sqInt methodArray;
-    sqInt methodArray1;
-    sqInt mixin1;
+    sqInt mixin;
     sqInt mixinApplication;
-    sqInt mixinApplication1;
     sqInt nextSelector;
-    sqInt nextSelector1;
     sqInt sz;
-    sqInt sz1;
-    sqInt targetMixin;
-    sqInt theMixin;
-    sqInt theMixin1;
     sqInt wrapAround;
-    sqInt wrapAround1;
 
 	if (breakOnImplicitReceiver()) {
 		/* begin sendBreakpoint:receiver: */
 		sendBreakpointreceiver(firstFixedFieldOfMaybeImmediate(selector), lengthOfMaybeImmediate(selector), null);
 	}
-	assert(!((isOopForwarded(rcvr))));
-	assert(!((isForwarded(mixin))));
+	assert(!((isOopForwarded(methodReceiver))));
+	assert(!((isForwarded(methodMixin))));
 	GIV(messageSelector) = selector;
-	mixinApplication = findApplicationOfTargetMixinstartingAtBehavior(mixin, ((rcvr & 1)
-		? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << (shiftForWord())))
-		: (((ccIndex = (((usqInt) (longAt(rcvr))) >> (compactClassFieldLSB())) & 0x1F)) == 0
-				? (longAt(rcvr - BaseHeaderSize)) & AllButTypeMask
-				: (/* begin fetchPointer:ofObject: */
-					longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord())))))));
-	if (mixinApplication == GIV(nilObj)) {
-		return rcvr;
-	}
-	dictionary = longAt((mixinApplication + BaseHeaderSize) + (MethodDictionaryIndex << (shiftForWord())));
-	/* begin lookupMethodInDictionary: */
-	/* begin numSlotsOf: */
-	header = longAt(dictionary);
-	sz = ((header & TypeMask) == HeaderTypeSizeAndClass
-		? (longAt(dictionary - (BytesPerWord * 2))) & AllButTypeMask
-		: header & SizeMask);
-	length = ((usqInt) (sz - BaseHeaderSize)) >> (shiftForWord());
+	candidateReceiver = methodReceiver;
+	candidateMixin = methodMixin;
+	while (1) {
+		/* begin findApplicationOfTargetMixin:startingAtBehavior: */
+		aBehavior = ((candidateReceiver & 1)
+			? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << (shiftForWord())))
+			: (((ccIndex = (((usqInt) (longAt(candidateReceiver))) >> (compactClassFieldLSB())) & 0x1F)) == 0
+					? (longAt(candidateReceiver - BaseHeaderSize)) & AllButTypeMask
+					: (/* begin fetchPointer:ofObject: */
+						longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord()))))));
+		mixinApplication = aBehavior;
+		while (!((mixinApplication == GIV(nilObj))
+		 || ((mixinApplication == candidateMixin)
+		 || (((mixin = longAt((mixinApplication + BaseHeaderSize) + (MixinIndex << (shiftForWord()))))) == candidateMixin)))) {
+			mixinApplication = longAt((mixinApplication + BaseHeaderSize) + (SuperclassIndex << (shiftForWord())));
+		}
+		candidateMixinApplication = mixinApplication;
+		assert(!((candidateMixinApplication == (nilObject()))));
+		dictionary = longAt((candidateMixinApplication + BaseHeaderSize) + (MethodDictionaryIndex << (shiftForWord())));
+		/* begin lookupMethodInDictionary: */
+		/* begin numSlotsOf: */
+		header = longAt(dictionary);
+		sz = ((header & TypeMask) == HeaderTypeSizeAndClass
+			? (longAt(dictionary - (BytesPerWord * 2))) & AllButTypeMask
+			: header & SizeMask);
+		length = ((usqInt) (sz - BaseHeaderSize)) >> (shiftForWord());
 
-	/* Use linear search on small dictionaries; its cheaper.
-	   Also the limit can be set to force linear search of all dictionaries, which supports the
-	   booting of images that need rehashing (e.g. because a tracer has generated an image
-	   with different hashes but hasn't rehashed it yet.) */
+		/* Use linear search on small dictionaries; its cheaper.
+		   Also the limit can be set to force linear search of all dictionaries, which supports the
+		   booting of images that need rehashing (e.g. because a tracer has generated an image
+		   with different hashes but hasn't rehashed it yet.) */
 
-	mask = (length - SelectorStart) - 1;
-	if (mask <= GIV(methodDictLinearSearchLimit)) {
-		index = 0;
-		while (index <= mask) {
-			nextSelector = longAt((dictionary + BaseHeaderSize) + ((index + SelectorStart) << (shiftForWord())));
-			
-			if (nextSelector == GIV(messageSelector)) {
-				methodArray = longAt((dictionary + BaseHeaderSize) + (MethodArrayIndex << (shiftForWord())));
-				GIV(newMethod) = longAt((methodArray + BaseHeaderSize) + (index << (shiftForWord())));
-				found = 1;
-				goto l1;
+		mask = (length - SelectorStart) - 1;
+		if (mask <= GIV(methodDictLinearSearchLimit)) {
+			index = 0;
+			while (index <= mask) {
+				nextSelector = longAt((dictionary + BaseHeaderSize) + ((index + SelectorStart) << (shiftForWord())));
+				
+				if (nextSelector == GIV(messageSelector)) {
+					methodArray = longAt((dictionary + BaseHeaderSize) + (MethodArrayIndex << (shiftForWord())));
+					GIV(newMethod) = longAt((methodArray + BaseHeaderSize) + (index << (shiftForWord())));
+					found = 1;
+					goto l1;
+				}
+				index += 1;
 			}
-			index += 1;
+			found = 0;
+			goto l1;
 		}
-		found = 0;
-		goto l1;
-	}
 
-	/* It is assumed that there are some nils in this dictionary, and search will
-	   stop when one is encountered. However, if there are no nils, then wrapAround
-	   will be detected the second time the loop gets to the end of the table. */
+		/* It is assumed that there are some nils in this dictionary, and search will
+		   stop when one is encountered. However, if there are no nils, then wrapAround
+		   will be detected the second time the loop gets to the end of the table. */
 
-	index = SelectorStart + (mask & (((GIV(messageSelector) & 1)
+		index = SelectorStart + (mask & (((GIV(messageSelector) & 1)
 	? (GIV(messageSelector) >> 1)
 	: (((usqInt) (longAt(GIV(messageSelector)))) >> HashBitsOffset) & HashMaskUnshifted)));
-	wrapAround = 0;
-	while (1) {
-		nextSelector = longAt((dictionary + BaseHeaderSize) + (index << (shiftForWord())));
-		if (nextSelector == GIV(nilObj)) {
-			found = 0;
-			goto l1;
-		}
-		
-		if (nextSelector == GIV(messageSelector)) {
-			methodArray = longAt((dictionary + BaseHeaderSize) + (MethodArrayIndex << (shiftForWord())));
-			GIV(newMethod) = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << (shiftForWord())));
-			found = 1;
-			goto l1;
-		}
-		index += 1;
-		if (index == length) {
-			if (wrapAround) {
+		wrapAround = 0;
+		while (1) {
+			nextSelector = longAt((dictionary + BaseHeaderSize) + (index << (shiftForWord())));
+			if (nextSelector == GIV(nilObj)) {
 				found = 0;
 				goto l1;
 			}
-			wrapAround = 1;
-			index = SelectorStart;
-		}
-	}
-	found = 0;
-l1:	/* end lookupMethodInDictionary: */;
-	if (!found) {
-		theMixin = longAt((mixinApplication + BaseHeaderSize) + (MixinIndex << (shiftForWord())));
-		/* begin nextImplicitReceiverFor:withMixin: */
-		anObject = longAt((mixinApplication + BaseHeaderSize) + (EnclosingObjectIndex << (shiftForWord())));
-		mixin1 = longAt((theMixin + BaseHeaderSize) + (EnclosingMixinIndex << (shiftForWord())));
-		assert(!((isOopForwarded(anObject))));
-		assert(!((isForwarded(mixin1))));
-		implicitReceiver = anObject;
-		targetMixin = mixin1;
-		while (1) {
-			if (targetMixin == GIV(nilObj)) {
-
-				/* or: [implicitReceiver = objectMemory nilObject] */
-
-				implicitReceiverOrNil = GIV(nilObj);
-				goto l3;
+			
+			if (nextSelector == GIV(messageSelector)) {
+				methodArray = longAt((dictionary + BaseHeaderSize) + (MethodArrayIndex << (shiftForWord())));
+				GIV(newMethod) = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << (shiftForWord())));
+				found = 1;
+				goto l1;
 			}
-			mixinApplication1 = findApplicationOfTargetMixinstartingAtNonMetaClass(targetMixin, ((implicitReceiver & 1)
-				? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << (shiftForWord())))
-				: (((ccIndex1 = (((usqInt) (longAt(implicitReceiver))) >> (compactClassFieldLSB())) & 0x1F)) == 0
-						? (longAt(implicitReceiver - BaseHeaderSize)) & AllButTypeMask
-						: (/* begin fetchPointer:ofObject: */
-							longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex1 - 1) << (shiftForWord())))))));
-			if (mixinApplication1 == GIV(nilObj)) {
-				implicitReceiverOrNil = GIV(nilObj);
-				goto l3;
-			}
-			dictionary1 = longAt((mixinApplication1 + BaseHeaderSize) + (MethodDictionaryIndex << (shiftForWord())));
-			/* begin lookupMethodInDictionary: */
-			/* begin numSlotsOf: */
-			header1 = longAt(dictionary1);
-			sz1 = ((header1 & TypeMask) == HeaderTypeSizeAndClass
-				? (longAt(dictionary1 - (BytesPerWord * 2))) & AllButTypeMask
-				: header1 & SizeMask);
-			length1 = ((usqInt) (sz1 - BaseHeaderSize)) >> (shiftForWord());
-
-			/* Use linear search on small dictionaries; its cheaper.
-			   Also the limit can be set to force linear search of all dictionaries, which supports the
-			   booting of images that need rehashing (e.g. because a tracer has generated an image
-			   with different hashes but hasn't rehashed it yet.) */
-
-			mask1 = (length1 - SelectorStart) - 1;
-			if (mask1 <= GIV(methodDictLinearSearchLimit)) {
-				index1 = 0;
-				while (index1 <= mask1) {
-					nextSelector1 = longAt((dictionary1 + BaseHeaderSize) + ((index1 + SelectorStart) << (shiftForWord())));
-					
-					if (nextSelector1 == GIV(messageSelector)) {
-						methodArray1 = longAt((dictionary1 + BaseHeaderSize) + (MethodArrayIndex << (shiftForWord())));
-						GIV(newMethod) = longAt((methodArray1 + BaseHeaderSize) + (index1 << (shiftForWord())));
-						found1 = 1;
-						goto l2;
-					}
-					index1 += 1;
+			index += 1;
+			if (index == length) {
+				if (wrapAround) {
+					found = 0;
+					goto l1;
 				}
-				found1 = 0;
-				goto l2;
+				wrapAround = 1;
+				index = SelectorStart;
 			}
-
-			/* It is assumed that there are some nils in this dictionary, and search will
-			   stop when one is encountered. However, if there are no nils, then wrapAround
-			   will be detected the second time the loop gets to the end of the table. */
-
-			index1 = SelectorStart + (mask1 & (((GIV(messageSelector) & 1)
-	? (GIV(messageSelector) >> 1)
-	: (((usqInt) (longAt(GIV(messageSelector)))) >> HashBitsOffset) & HashMaskUnshifted)));
-			wrapAround1 = 0;
-			while (1) {
-				nextSelector1 = longAt((dictionary1 + BaseHeaderSize) + (index1 << (shiftForWord())));
-				if (nextSelector1 == GIV(nilObj)) {
-					found1 = 0;
-					goto l2;
-				}
-				
-				if (nextSelector1 == GIV(messageSelector)) {
-					methodArray1 = longAt((dictionary1 + BaseHeaderSize) + (MethodArrayIndex << (shiftForWord())));
-					GIV(newMethod) = longAt((methodArray1 + BaseHeaderSize) + ((index1 - SelectorStart) << (shiftForWord())));
-					found1 = 1;
-					goto l2;
-				}
-				index1 += 1;
-				if (index1 == length1) {
-					if (wrapAround1) {
-						found1 = 0;
-						goto l2;
-					}
-					wrapAround1 = 1;
-					index1 = SelectorStart;
-				}
-			}
-			found1 = 0;
-		l2:	/* end lookupMethodInDictionary: */;
-			if (found1) break;
-			implicitReceiver = longAt((mixinApplication1 + BaseHeaderSize) + (EnclosingObjectIndex << (shiftForWord())));
-			theMixin1 = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << (shiftForWord())));
-			if (theMixin1 == GIV(nilObj)) {
-				implicitReceiverOrNil = GIV(nilObj);
-				goto l3;
-			}
-			targetMixin = longAt((theMixin1 + BaseHeaderSize) + (EnclosingMixinIndex << (shiftForWord())));
 		}
-		implicitReceiverOrNil = implicitReceiver;
-	l3:	/* end nextImplicitReceiverFor:withMixin: */;
-		if (implicitReceiverOrNil != GIV(nilObj)) {
-			return implicitReceiverOrNil;
+		found = 0;
+	l1:	/* end lookupMethodInDictionary: */;
+		if (found) {
+			return candidateReceiver;
 		}
+		candidateMixin = longAt((candidateMixin + BaseHeaderSize) + (EnclosingMixinIndex << (shiftForWord())));
+		if (candidateMixin == GIV(nilObj)) break;
+		candidateReceiver = longAt((candidateMixinApplication + BaseHeaderSize) + (EnclosingObjectIndex << (shiftForWord())));
 	}
-	return rcvr;
+	return methodReceiver;
 }
 
 usqInt
@@ -44811,36 +44813,41 @@
 }
 
 
-/*	This is used to implement the innards of the pushEnclosingObjectBytecode,
-	used for explicit outer sends in NS2/NS3.  */
+/*	This is used to implement outer sends and outer expressions in Newspeak. */
 
 static sqInt
-enclosingObjectAtwithObjectwithMixin(sqInt n, sqInt anObject, sqInt mixin)
+enclosingObjectAtwithObjectwithMixin(sqInt depth, sqInt methodReceiver, sqInt methodMixin)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt aBehavior;
     sqInt ccIndex;
     sqInt count;
     sqInt enclosingObject;
+    sqInt mixin;
     sqInt mixinApplication;
+    sqInt mixinApplication1;
     sqInt targetMixin;
 
-	enclosingObject = anObject;
-	targetMixin = mixin;
+	enclosingObject = methodReceiver;
+	targetMixin = methodMixin;
 	count = 0;
-	while (count < n) {
+	while (count < depth) {
 		count += 1;
-		if ((targetMixin == GIV(nilObj))
-		 || (enclosingObject == GIV(nilObj))) {
-			return GIV(nilObj);
-		}
-		mixinApplication = findApplicationOfTargetMixinstartingAtNonMetaClass(targetMixin, ((enclosingObject & 1)
+		assert(!((targetMixin == (nilObject()))));
+		/* begin findApplicationOfTargetMixin:startingAtBehavior: */
+		aBehavior = ((enclosingObject & 1)
 			? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << (shiftForWord())))
 			: (((ccIndex = (((usqInt) (longAt(enclosingObject))) >> (compactClassFieldLSB())) & 0x1F)) == 0
 					? (longAt(enclosingObject - BaseHeaderSize)) & AllButTypeMask
 					: (/* begin fetchPointer:ofObject: */
-						longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord())))))));
-		if (mixinApplication == GIV(nilObj)) {
-			return GIV(nilObj);
+						longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord()))))));
+		mixinApplication1 = aBehavior;
+		while (!((mixinApplication1 == GIV(nilObj))
+		 || ((mixinApplication1 == targetMixin)
+		 || (((mixin = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << (shiftForWord()))))) == targetMixin)))) {
+			mixinApplication1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << (shiftForWord())));
 		}
+		mixinApplication = mixinApplication1;
+		assert(!((mixinApplication == (nilObject()))));
 		enclosingObject = longAt((mixinApplication + BaseHeaderSize) + (EnclosingObjectIndex << (shiftForWord())));
 		targetMixin = longAt((targetMixin + BaseHeaderSize) + (EnclosingMixinIndex << (shiftForWord())));
 	}
@@ -45602,63 +45609,7 @@
 	return (sp >> 1);
 }
 
-
-/*	This is used to implement the innards of the pushImplicitReceiverBytecode,
-	used for outer sends in NS2/NS3. Find the MixinApplcation of which
-	aBehavior is a subclass that is an application of targetMixin. This is an
-	implementation derived from
-	
-	<ContextPart> findApplicationOfTargetMixin: targetMixin
-	startingAtBehavior: aBehavior
-	 */
-
 static sqInt
-findApplicationOfTargetMixinstartingAtBehavior(sqInt targetMixin, sqInt aBehavior)
-{   DECL_MAYBE_SQ_GLOBAL_STRUCT
-    sqInt ccIndex;
-    sqInt mixin;
-    sqInt mixinOrMixinApplication;
-
-	mixinOrMixinApplication = aBehavior;
-	while (!((mixinOrMixinApplication == GIV(nilObj))
-	 || ((mixinOrMixinApplication == targetMixin)
-	 || ((((mixin = longAt((mixinOrMixinApplication + BaseHeaderSize) + (MixinIndex << (shiftForWord()))))) == targetMixin)
-	 || (((((ccIndex = (((usqInt) (longAt(mixin))) >> (compactClassFieldLSB())) & 0x1F)) == 0
-	? (longAt(mixin - BaseHeaderSize)) & AllButTypeMask
-	: (/* begin fetchPointer:ofObject: */
-		longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord())))))) == targetMixin))))) {
-		mixinOrMixinApplication = longAt((mixinOrMixinApplication + BaseHeaderSize) + (SuperclassIndex << (shiftForWord())));
-	}
-	return mixinOrMixinApplication;
-}
-
-
-/*	This is used to implement the innards of the pushImplicitReceiverBytecode,
-	used for outer sends in NS2/NS3. Find the MixinApplcation of which aClass
-	is a subclass that is an application of targetMixin. This is an
-	implementation derived from
-	
-	<ContextPart> findApplicationOfTargetMixin: targetMixin
-	startingAtNonMetaClass: aClass
-	 */
-
-static sqInt
-findApplicationOfTargetMixinstartingAtNonMetaClass(sqInt targetMixin, sqInt aClass)
-{   DECL_MAYBE_SQ_GLOBAL_STRUCT
-    sqInt mixinOrMixinApplication;
-
-	assert(!((isForwarded(targetMixin))));
-	assert(!((isForwarded(aClass))));
-	mixinOrMixinApplication = aClass;
-	while (!((mixinOrMixinApplication == GIV(nilObj))
-	 || ((mixinOrMixinApplication == targetMixin)
-	 || ((longAt((mixinOrMixinApplication + BaseHeaderSize) + (MixinIndex << (shiftForWord())))) == targetMixin)))) {
-		mixinOrMixinApplication = longAt((mixinOrMixinApplication + BaseHeaderSize) + (SuperclassIndex << (shiftForWord())));
-	}
-	return mixinOrMixinApplication;
-}
-
-static sqInt
 findClassContainingMethodstartingAt(sqInt meth, sqInt classObj)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt classDict;

Modified: branches/Cog/nscogsrc/vm/cointerp.h
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.h	2015-01-19 03:36:05 UTC (rev 3232)
+++ branches/Cog/nscogsrc/vm/cointerp.h	2015-01-20 20:28:27 UTC (rev 3233)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1023 uuid: 3b0b931e-e8b1-4155-ac38-8a078ddcec98
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1024 uuid: f6cf904e-36ea-4109-a415-b8564601d19e
  */
 
 
@@ -64,7 +64,7 @@
 void (*functionPointerForCompiledMethodprimitiveIndex(sqInt methodObj, sqInt primIndex))(void) ;
 sqInt getCheckAllocFiller(void);
 void ifValidWriteBackStackPointersSaveTo(void *theCFP, void *theCSP, char **savedFPP, char **savedSPP);
-sqInt implicitReceiverFormixinimplementing(sqInt rcvr, sqInt mixin, sqInt selector);
+sqInt implicitReceiverFormixinimplementing(sqInt methodReceiver, sqInt methodMixin, sqInt selector);
 usqInt instructionPointerAddress(void);
 usqInt interpretAddress(void);
 sqInt isCogMethodReference(sqInt methodHeader);

Modified: branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2015-01-19 03:36:05 UTC (rev 3232)
+++ branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2015-01-20 20:28:27 UTC (rev 3233)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1023 uuid: 3b0b931e-e8b1-4155-ac38-8a078ddcec98
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1024 uuid: f6cf904e-36ea-4109-a415-b8564601d19e
    from
-	CoInterpreter VMMaker.oscog-eem.1023 uuid: 3b0b931e-e8b1-4155-ac38-8a078ddcec98
+	CoInterpreter VMMaker.oscog-eem.1024 uuid: f6cf904e-36ea-4109-a415-b8564601d19e
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1023 uuid: 3b0b931e-e8b1-4155-ac38-8a078ddcec98 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1024 uuid: f6cf904e-36ea-4109-a415-b8564601d19e " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -467,7 +467,7 @@
 static sqInt iframeReceiver(char *theFP) NoDbgRegParms;
 static sqInt iframeSavedIP(char *theFP) NoDbgRegParms;
 void ifValidWriteBackStackPointersSaveTo(void *theCFP, void *theCSP, char **savedFPP, char **savedSPP);
-sqInt implicitReceiverFormixinimplementing(sqInt rcvr, sqInt mixin, sqInt selector);
+sqInt implicitReceiverFormixinimplementing(sqInt methodReceiver, sqInt methodMixin, sqInt selector);
 usqInt instructionPointerAddress(void);
 static sqInt instructionPointerForFramecurrentFPcurrentIP(char *spouseFP, char *currentFP, sqInt instrPtr) NoDbgRegParms;
 usqInt interpretAddress(void);
@@ -1061,7 +1061,7 @@
 sqInt doSignalSemaphoreWithIndex(sqInt index);
 static void dummyReferToProxy(void);
 EXPORT(sqInt) dumpImage(sqInt fileName);
-static sqInt enclosingObjectAtwithObjectwithMixin(sqInt n, sqInt anObject, sqInt mixin) NoDbgRegParms;
+static sqInt enclosingObjectAtwithObjectwithMixin(sqInt depth, sqInt methodReceiver, sqInt methodMixin) NoDbgRegParms;
 static sqInt ensureCallerContext(char *theFP) NoDbgRegParms;
 static void ensureImageFormatIsUpToDate(sqInt swapBytes) NoDbgRegParms;
 static char * establishFrameForContextToReturnTo(sqInt contextToReturnTo) NoDbgRegParms;
@@ -1075,8 +1075,6 @@
 sqInt fetchIntegerofObject(sqInt fieldIndex, sqInt objectPointer);
 static sqInt fetchPointerofMarriedContext(sqInt offset, sqInt aContext) NoDbgRegParms;
 static sqInt fetchStackPointerOf(sqInt aContext) NoDbgRegParms;
-static sqInt findApplicationOfTargetMixinstartingAtBehavior(sqInt targetMixin, sqInt aBehavior) NoDbgRegParms;
-static sqInt findApplicationOfTargetMixinstartingAtNonMetaClass(sqInt targetMixin, sqInt aClass) NoDbgRegParms;
 static sqInt findClassContainingMethodstartingAt(sqInt meth, sqInt classObj) NoDbgRegParms;
 sqInt findClassOfMethodforReceiver(sqInt meth, sqInt rcvr);
 static char * findFrameAboveinPage(char *theFP, StackPage *thePage) NoDbgRegParms;
@@ -1418,7 +1416,6 @@
 _iss sqInt tenuringThreshold;
 _iss sqInt forceTenureFlag;
 _iss sqInt longRunningPrimitiveCheckSequenceNumber;
-_iss sqInt methodDictLinearSearchLimit;
 _iss sqInt signalLowSpace;
 _iss usqLong statFullGCUsecs;
 _iss sqInt statFullGCs;
@@ -1434,6 +1431,7 @@
 _iss sqInt interruptKeycode;
 _iss sqInt interruptPending;
 _iss usqInt memory;
+_iss sqInt methodDictLinearSearchLimit;
 _iss usqLong nextPollUsecs;
 _iss usqLong statForceInterruptCheck;
 _iss usqLong statIGCDeltaUsecs;
@@ -2104,7 +2102,7 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 char expensiveAsserts = 0;
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1023";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1024";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -4913,9 +4911,12 @@
 		CASE(126)
 			/* dynamicSuperSendBytecode */
 			{
+				sqInt aBehavior;
 				sqInt ccIndex;
 				sqInt mClassMixin;
+				sqInt mixin;
 				sqInt mixinApplication;
+				sqInt mixinApplication1;
 				sqInt rcvr;
 
 				VM_LABEL(dynamicSuperSendBytecode);
@@ -4925,12 +4926,20 @@
 				GIV(messageSelector) = longAt((GIV(method) + BaseHeaderSize) + (((byteAtPointer(++localIP)) + LiteralStart) << (shiftForWord())));
 				rcvr = longAtPointer(localSP + (GIV(argumentCount) * BytesPerOop));
 				mClassMixin = methodClassOf(GIV(method));
-				mixinApplication = findApplicationOfTargetMixinstartingAtBehavior(mClassMixin, ((rcvr & 1)
+				/* begin findApplicationOfTargetMixin:startingAtBehavior: */
+				aBehavior = ((rcvr & 1)
 					? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << (shiftForWord())))
 					: (((ccIndex = (((usqInt) (longAt(rcvr))) >> (compactClassFieldLSB())) & 0x1F)) == 0
 							? (longAt(rcvr - BaseHeaderSize)) & AllButTypeMask
 							: (/* begin fetchPointer:ofObject: */
-								longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord())))))));
+								longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord()))))));
+				mixinApplication1 = aBehavior;
+				while (!((mixinApplication1 == GIV(nilObj))
+				 || ((mixinApplication1 == mClassMixin)
+				 || (((mixin = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << (shiftForWord()))))) == mClassMixin)))) {
+					mixinApplication1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << (shiftForWord())));
+				}
+				mixinApplication = mixinApplication1;
 				/* begin classTagForClass: */
 				lkupClassTag = longAt((mixinApplication + BaseHeaderSize) + (SuperclassIndex << (shiftForWord())));
 				goto commonSend;
@@ -12796,11 +12805,14 @@
 		CASE(497) /*241*/
 			/* extSendAbsentDynamicSuperBytecode */
 			{
+				sqInt aBehavior;
 				sqInt byte;
 				sqInt ccIndex;
 				sqInt i;
 				sqInt mClassMixin;
+				sqInt mixin;
 				sqInt mixinApplication;
+				sqInt mixinApplication1;
 				sqInt oop;
 
 				VM_LABEL(extSendAbsentDynamicSuperBytecode);
@@ -12822,12 +12834,20 @@
 				}
 				longAtPointerput(localSP + (GIV(argumentCount) * BytesPerOop), longAt(localFP + FoxIFReceiver));
 				mClassMixin = methodClassOf(GIV(method));
-				mixinApplication = findApplicationOfTargetMixinstartingAtBehavior(mClassMixin, (((longAt(localFP + FoxIFReceiver)) & 1)
+				/* begin findApplicationOfTargetMixin:startingAtBehavior: */
+				aBehavior = (((longAt(localFP + FoxIFReceiver)) & 1)
 					? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << (shiftForWord())))
 					: (((ccIndex = (((usqInt) (longAt(longAt(localFP + FoxIFReceiver)))) >> (compactClassFieldLSB())) & 0x1F)) == 0
 							? (longAt((longAt(localFP + FoxIFReceiver)) - BaseHeaderSize)) & AllButTypeMask
 							: (/* begin fetchPointer:ofObject: */
-								longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord())))))));
+								longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord()))))));
+				mixinApplication1 = aBehavior;
+				while (!((mixinApplication1 == GIV(nilObj))
+				 || ((mixinApplication1 == mClassMixin)
+				 || (((mixin = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << (shiftForWord()))))) == mClassMixin)))) {
+					mixinApplication1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << (shiftForWord())));
+				}
+				mixinApplication = mixinApplication1;
 				/* begin classTagForClass: */
 				lkupClassTag = longAt((mixinApplication + BaseHeaderSize) + (SuperclassIndex << (shiftForWord())));
 				goto commonSend;
@@ -12974,10 +12994,46 @@
 			}
 			BREAK;
 		CASE(501) /*245*/
+			/* extSendAbsentSelfBytecode */
+			{
+				sqInt byte;
+				sqInt ccIndex;
+				sqInt classObj;
+				sqInt i;
+				sqInt oop;
+
+				VM_LABEL(extSendAbsentSelfBytecode);
+				byte = byteAtPointer(++localIP);
+				/* begin literal: */
+				assert(GIV(method) == (iframeMethod(localFP)));
+				GIV(messageSelector) = longAt((GIV(method) + BaseHeaderSize) + ((((((usqInt) byte) >> 3) + (extA << 5)) + LiteralStart) << (shiftForWord())));
+				extA = 0;
+				GIV(argumentCount) = (byte & 7) + (extB << 3);
+				extB = 0;
+				/* begin shuffleArgumentsAndStoreAbsentReceiver: */
+
+				/* a.k.a. self internalPush: anything */
+
+				localSP -= BytesPerOop;
+				for (i = 1; i <= GIV(argumentCount); i += 1) {
+					oop = longAtPointer(localSP + (i * BytesPerOop));
+					longAtPointerput(localSP + ((i - 1) * BytesPerOop), oop);
+				}

@@ Diff output truncated at 50000 characters. @@


More information about the Vm-dev mailing list