[Vm-dev] [commit][3246] CogVM source as per VMMaker.oscog-eem.1041

commits at squeakvm.org commits at squeakvm.org
Wed Feb 4 23:48:16 UTC 2015


Revision: 3246
Author:   eliot
Date:     2015-02-04 15:48:12 -0800 (Wed, 04 Feb 2015)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.1041

Allow primitivePerformWithArgs to avoid fetchClassOf: in Spur by making the last
arg to primitiveObject:perform:withArguments:lookedUpIn: lookupClassOrNil.

Update Slang constant folding to include nil isNil/notNil.

Eliminate NewspeakV3 support from the Newspeak Spur VMs.
Fix commonSendAbsent's comment.

Use numSlotsOfAny: to avoid unnecessary assert fails in some
printing & testing code.  Fix ... bug in longPrintOop:

Spur:
Like V3's, Spur's fetchClassOf: also needs to be inlineable in ifs.

Never inline fetchClassOfNonImm: in Spur; it's a lot of code
and should be rare, dynamically.

Spur image segments:
Offset class indices in objects in segment to avoid
confusion with forwarders etc.

Comment helper methods better.

Add 32-bit byte swapping for 64-bit segment support.

Don't expunge unmarked entries from the class table in the
segment storage markObjects: invocation.

Do 32-bit word reversal in 64-bit Spur and hence fix 64-bit image segment load.

Make sure the leak checker is run when image segment
leak checking is enabled.

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-02-02 02:24:35 UTC (rev 3245)
+++ branches/Cog/nscogsrc/vm/cogit.c	2015-02-04 23:48:12 UTC (rev 3246)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1025 uuid: 1a29f456-a8e2-4312-a391-8e2cdb0430ee
+	CCodeGenerator VMMaker.oscog-eem.1039 uuid: 931d69b1-7be3-42dd-8833-1ba325d2b5f2
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.1025 uuid: 1a29f456-a8e2-4312-a391-8e2cdb0430ee
+	StackToRegisterMappingCogit VMMaker.oscog-eem.1039 uuid: 931d69b1-7be3-42dd-8833-1ba325d2b5f2
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1025 uuid: 1a29f456-a8e2-4312-a391-8e2cdb0430ee " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1039 uuid: 931d69b1-7be3-42dd-8833-1ba325d2b5f2 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 

Modified: branches/Cog/nscogsrc/vm/cogit.h
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.h	2015-02-02 02:24:35 UTC (rev 3245)
+++ branches/Cog/nscogsrc/vm/cogit.h	2015-02-04 23:48:12 UTC (rev 3246)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1025 uuid: 1a29f456-a8e2-4312-a391-8e2cdb0430ee
+	CCodeGenerator VMMaker.oscog-eem.1039 uuid: 931d69b1-7be3-42dd-8833-1ba325d2b5f2
  */
 
 

Modified: branches/Cog/nscogsrc/vm/cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.c	2015-02-02 02:24:35 UTC (rev 3245)
+++ branches/Cog/nscogsrc/vm/cointerp.c	2015-02-04 23:48:12 UTC (rev 3246)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1035 uuid: 33a34378-0618-40c7-8fbb-c467fb40fc57
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1040 uuid: be108ef5-00a3-425b-b228-16515cc447c7
    from
-	CoInterpreter VMMaker.oscog-eem.1035 uuid: 33a34378-0618-40c7-8fbb-c467fb40fc57
+	CoInterpreter VMMaker.oscog-eem.1040 uuid: be108ef5-00a3-425b-b228-16515cc447c7
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1035 uuid: 33a34378-0618-40c7-8fbb-c467fb40fc57 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1040 uuid: be108ef5-00a3-425b-b228-16515cc447c7 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -1174,7 +1174,6 @@
 EXPORT(void) primitiveEventProcessingControl(void);
 sqInt primitiveIndexOfMethodheader(sqInt theMethod, sqInt methodHeader);
 sqInt primitiveIndexOf(sqInt methodPointer);
-static sqInt primitiveObjectperformwithArgumentslookedUpIn(sqInt actualReceiver, sqInt selector, sqInt argumentArray, sqInt lookupClass) NoDbgRegParms;
 static void printActivationNameForSelectorstartClass(sqInt aSelector, sqInt startClass) NoDbgRegParms;
 static void printActivationNameForreceiverisBlockfirstTemporary(sqInt aMethod, sqInt anObject, sqInt isBlock, sqInt maybeMessage) NoDbgRegParms;
 void printAllStacks(void);
@@ -2098,7 +2097,7 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 char expensiveAsserts = 0;
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1035";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1040";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -30675,10 +30674,26 @@
 static void
 primitivePerformInSuperclass(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt argumentArray;
+    sqInt arraySize;
     sqInt ccIndex;
+    sqInt ccIndex1;
+    sqInt ccIndex2;
     sqInt currentClass;
+    sqInt delta;
+    sqInt header;
+    sqInt index;
     sqInt lookupClass;
+    sqInt offset;
+    sqInt performArgCount;
     sqInt rcvr;
+    sqInt selector;
+    sqInt selector1;
+    char *sp;
+    char *sp1;
+    char *sp2;
+    sqInt sz;
+    sqInt top;
 
 	lookupClass = longAt(GIV(stackPointer));
 	rcvr = longAt(GIV(stackPointer) + (3 * BytesPerWord));
@@ -30695,24 +30710,206 @@
 			return;
 		}
 	}
-	primitiveObjectperformwithArgumentslookedUpIn(rcvr, longAt(GIV(stackPointer) + (2 * BytesPerWord)), longAt(GIV(stackPointer) + (1 * BytesPerWord)), lookupClass);
+	/* begin primitiveObject:perform:withArguments:lookedUpIn: */
+	selector = longAt(GIV(stackPointer) + (2 * BytesPerWord));
+	argumentArray = longAt(GIV(stackPointer) + (1 * BytesPerWord));
+	if (!(((argumentArray & 1) == 0)
+		 && (((((usqInt) (longAt(argumentArray))) >> (instFormatFieldLSB())) & 15) == 2))) {
+		GIV(primFailCode) = PrimErrBadArgument;
+		goto l1;
+	}
+	/* begin numSlotsOf: */
+	header = longAt(argumentArray);
+	sz = ((header & TypeMask) == HeaderTypeSizeAndClass
+		? (longAt(argumentArray - (BytesPerWord * 2))) & AllButTypeMask
+		: header & SizeMask);
+	arraySize = ((usqInt) (sz - BaseHeaderSize)) >> (shiftForWord());
+	if (arraySize > LargeContextSlots) {
+		GIV(primFailCode) = PrimErrBadNumArgs;
+		goto l1;
+	}
+
+	/* Push newMethod to save it in case of failure,
+	   then push the actual receiver and args out of the array. */
+
+	performArgCount = GIV(argumentCount);
+	/* begin push: */
+	longAtput((sp1 = GIV(stackPointer) - BytesPerWord), GIV(newMethod));
+	GIV(stackPointer) = sp1;
+	/* begin push: */
+	longAtput((sp2 = GIV(stackPointer) - BytesPerWord), rcvr);
+	GIV(stackPointer) = sp2;
+	for (index = 1; index <= arraySize; index += 1) {
+		/* begin push: */
+		longAtput((sp = GIV(stackPointer) - BytesPerWord), longAt((argumentArray + BaseHeaderSize) + ((index - 1) << (shiftForWord()))));
+		GIV(stackPointer) = sp;
+	}
+	GIV(argumentCount) = arraySize;
+	GIV(messageSelector) = selector;
+	/* begin sendBreakpoint:receiver: */
+	selector1 = GIV(messageSelector);
+	sendBreakpointreceiver(firstFixedFieldOfMaybeImmediate(selector1), lengthOfMaybeImmediate(selector1), rcvr);
+	if (printOnTrace()) {
+		printActivationNameForSelectorstartClass(GIV(messageSelector), (lookupClass == null
+			? ((rcvr & 1)
+					? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << (shiftForWord())))
+					: (((ccIndex2 = (((usqInt) (longAt(rcvr))) >> (compactClassFieldLSB())) & 0x1F)) == 0
+							? (longAt(rcvr - BaseHeaderSize)) & AllButTypeMask
+							: (/* begin fetchPointer:ofObject: */
+								longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex2 - 1) << (shiftForWord()))))))
+			: lookupClass));
+		/* begin cr */
+		printf("\n");
+	}
+	findNewMethodInClassTag((lookupClass == null
+		? ((rcvr & 1)
+				? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << (shiftForWord())))
+				: (((ccIndex1 = (((usqInt) (longAt(rcvr))) >> (compactClassFieldLSB())) & 0x1F)) == 0
+						? (longAt(rcvr - BaseHeaderSize)) & AllButTypeMask
+						: (/* begin fetchPointer:ofObject: */
+							longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex1 - 1) << (shiftForWord()))))))
+		: lookupClass));
+	if ((((GIV(newMethod) & 1) == 0)
+	 && (((((usqInt) (longAt(GIV(newMethod)))) >> (instFormatFieldLSB())) & 15) >= 12))
+	 && ((argumentCountOf(GIV(newMethod))) != GIV(argumentCount))) {
+
+		/* Restore the state by popping all those array entries and pushing back the selector and array, and fail */
+
+		/* begin pop: */
+		GIV(stackPointer) += (arraySize + 1) * BytesPerWord;
+		null;
+		/* begin popStack */
+		top = longAt(GIV(stackPointer));
+		GIV(stackPointer) += BytesPerWord;
+		GIV(newMethod) = ((sqInt) top);
+		GIV(primFailCode) = PrimErrBadNumArgs;
+		goto l1;
+	}
+
+	/* +2 = receiver + saved newMethod */
+
+	delta = BytesPerWord * (performArgCount + 2);
+	for (offset = (GIV(argumentCount) * BytesPerWord); offset >= 0; offset += (-BytesPerWord)) {
+		longAtput((GIV(stackPointer) + offset) + delta, longAt(GIV(stackPointer) + offset));
+	}
+	/* begin pop: */
+	GIV(stackPointer) += (performArgCount + 2) * BytesPerWord;
+	null;
+	executeNewMethod();
+	/* begin initPrimCall */
+	GIV(primFailCode) = 0;
+	null;
+l1:	/* end primitiveObject:perform:withArguments:lookedUpIn: */;
 }
 
 static void
 primitivePerformWithArgs(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt actualReceiver;
+    sqInt argumentArray;
+    sqInt arraySize;
     sqInt ccIndex;
-    sqInt lookupClass;
-    sqInt rcvr;
+    sqInt ccIndex1;
+    sqInt delta;
+    sqInt header;
+    sqInt index;
+    sqInt offset;
+    sqInt performArgCount;
+    sqInt selector;
+    sqInt selector1;
+    char *sp;
+    char *sp1;
+    char *sp2;
+    sqInt sz;
+    sqInt top;
 
-	rcvr = longAt(GIV(stackPointer) + (2 * BytesPerWord));
-	lookupClass = ((rcvr & 1)
+	/* begin primitiveObject:perform:withArguments:lookedUpIn: */
+	actualReceiver = longAt(GIV(stackPointer) + (2 * BytesPerWord));
+	selector = longAt(GIV(stackPointer) + (1 * BytesPerWord));
+	argumentArray = longAt(GIV(stackPointer));
+	if (!(((argumentArray & 1) == 0)
+		 && (((((usqInt) (longAt(argumentArray))) >> (instFormatFieldLSB())) & 15) == 2))) {
+		GIV(primFailCode) = PrimErrBadArgument;
+		goto l1;
+	}
+	/* begin numSlotsOf: */
+	header = longAt(argumentArray);
+	sz = ((header & TypeMask) == HeaderTypeSizeAndClass
+		? (longAt(argumentArray - (BytesPerWord * 2))) & AllButTypeMask
+		: header & SizeMask);
+	arraySize = ((usqInt) (sz - BaseHeaderSize)) >> (shiftForWord());
+	if (arraySize > LargeContextSlots) {
+		GIV(primFailCode) = PrimErrBadNumArgs;
+		goto l1;
+	}
+
+	/* Push newMethod to save it in case of failure,
+	   then push the actual receiver and args out of the array. */
+
+	performArgCount = GIV(argumentCount);
+	/* begin push: */
+	longAtput((sp1 = GIV(stackPointer) - BytesPerWord), GIV(newMethod));
+	GIV(stackPointer) = sp1;
+	/* begin push: */
+	longAtput((sp2 = GIV(stackPointer) - BytesPerWord), actualReceiver);
+	GIV(stackPointer) = sp2;
+	for (index = 1; index <= arraySize; index += 1) {
+		/* begin push: */
+		longAtput((sp = GIV(stackPointer) - BytesPerWord), longAt((argumentArray + BaseHeaderSize) + ((index - 1) << (shiftForWord()))));
+		GIV(stackPointer) = sp;
+	}
+	GIV(argumentCount) = arraySize;
+	GIV(messageSelector) = selector;
+	/* begin sendBreakpoint:receiver: */
+	selector1 = GIV(messageSelector);
+	sendBreakpointreceiver(firstFixedFieldOfMaybeImmediate(selector1), lengthOfMaybeImmediate(selector1), actualReceiver);
+	if (printOnTrace()) {
+		printActivationNameForSelectorstartClass(GIV(messageSelector), ((actualReceiver & 1)
+			? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << (shiftForWord())))
+			: (((ccIndex = (((usqInt) (longAt(actualReceiver))) >> (compactClassFieldLSB())) & 0x1F)) == 0
+					? (longAt(actualReceiver - BaseHeaderSize)) & AllButTypeMask
+					: (/* begin fetchPointer:ofObject: */
+						longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord())))))));
+		/* begin cr */
+		printf("\n");
+	}
+	findNewMethodInClassTag(((actualReceiver & 1)
 		? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << (shiftForWord())))
-		: (((ccIndex = (((usqInt) (longAt(rcvr))) >> (compactClassFieldLSB())) & 0x1F)) == 0
-				? (longAt(rcvr - BaseHeaderSize)) & AllButTypeMask
+		: (((ccIndex1 = (((usqInt) (longAt(actualReceiver))) >> (compactClassFieldLSB())) & 0x1F)) == 0
+				? (longAt(actualReceiver - BaseHeaderSize)) & AllButTypeMask
 				: (/* begin fetchPointer:ofObject: */
-					longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord()))))));
-	primitiveObjectperformwithArgumentslookedUpIn(rcvr, longAt(GIV(stackPointer) + (1 * BytesPerWord)), longAt(GIV(stackPointer)), lookupClass);
+					longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex1 - 1) << (shiftForWord())))))));
+	if ((((GIV(newMethod) & 1) == 0)
+	 && (((((usqInt) (longAt(GIV(newMethod)))) >> (instFormatFieldLSB())) & 15) >= 12))
+	 && ((argumentCountOf(GIV(newMethod))) != GIV(argumentCount))) {
+
+		/* Restore the state by popping all those array entries and pushing back the selector and array, and fail */
+
+		/* begin pop: */
+		GIV(stackPointer) += (arraySize + 1) * BytesPerWord;
+		null;
+		/* begin popStack */
+		top = longAt(GIV(stackPointer));
+		GIV(stackPointer) += BytesPerWord;
+		GIV(newMethod) = ((sqInt) top);
+		GIV(primFailCode) = PrimErrBadNumArgs;
+		goto l1;
+	}
+
+	/* +2 = receiver + saved newMethod */
+
+	delta = BytesPerWord * (performArgCount + 2);
+	for (offset = (GIV(argumentCount) * BytesPerWord); offset >= 0; offset += (-BytesPerWord)) {
+		longAtput((GIV(stackPointer) + offset) + delta, longAt(GIV(stackPointer) + offset));
+	}
+	/* begin pop: */
+	GIV(stackPointer) += (performArgCount + 2) * BytesPerWord;
+	null;
+	executeNewMethod();
+	/* begin initPrimCall */
+	GIV(primFailCode) = 0;
+	null;
+l1:	/* end primitiveObject:perform:withArguments:lookedUpIn: */;
 }
 
 
@@ -47223,7 +47420,7 @@
 		}
 	}
 	else {
-		if (startIP > 64) {
+		if (startIP > lastIndex) {
 			print("...");
 			/* begin cr */
 			printf("\n");
@@ -48679,109 +48876,6 @@
 			(primBits & 0x1FF) + ((((usqInt) primBits) >> 19) & 512)));
 }
 
-
-/*	Common routine used by perform:withArgs:, perform:withArgs:inSuperclass:,
-	object:perform:withArgs:inClass: et al. Answer nil on success.
-	
-	NOTE: The case of doesNotUnderstand: is not a failure to perform.
-	The only failures are arg types and consistency of argumentCount.
-	
-	Since we're in the stack VM we can assume there is space to push the
-	arguments provided they are within limits (max argument count is 15). We
-	can therefore deal
-	with the arbitrary amount of state to remove from the stack (lookup class,
-	selector, mirror receiver) and arbitrary argument orders by deferring
-	popping anything until
-	we know whether the send has succeeded. So on failure we merely have to
-	remove the actual receiver and arguments pushed, and on success we have to
-	slide the actual
-	receiver and arguments down to replace the original ones. */
-
-static sqInt
-primitiveObjectperformwithArgumentslookedUpIn(sqInt actualReceiver, sqInt selector, sqInt argumentArray, sqInt lookupClass)
-{   DECL_MAYBE_SQ_GLOBAL_STRUCT
-    sqInt arraySize;
-    sqInt delta;
-    sqInt header;
-    sqInt index;
-    sqInt offset;
-    sqInt performArgCount;
-    char *sp;
-    char *sp1;
-    char *sp2;
-    sqInt sz;
-    sqInt top;
-
-	if (!(((argumentArray & 1) == 0)
-		 && (((((usqInt) (longAt(argumentArray))) >> (instFormatFieldLSB())) & 15) == 2))) {
-		return (GIV(primFailCode) = PrimErrBadArgument);
-	}
-	/* begin numSlotsOf: */
-	header = longAt(argumentArray);
-	sz = ((header & TypeMask) == HeaderTypeSizeAndClass
-		? (longAt(argumentArray - (BytesPerWord * 2))) & AllButTypeMask
-		: header & SizeMask);
-	arraySize = ((usqInt) (sz - BaseHeaderSize)) >> (shiftForWord());
-	if (arraySize > LargeContextSlots) {
-		return (GIV(primFailCode) = PrimErrBadNumArgs);
-	}
-
-	/* Push newMethod to save it in case of failure,
-	   then push the actual receiver and args out of the array. */
-
-	performArgCount = GIV(argumentCount);
-	/* begin push: */
-	longAtput((sp1 = GIV(stackPointer) - BytesPerWord), GIV(newMethod));
-	GIV(stackPointer) = sp1;
-	/* begin push: */
-	longAtput((sp2 = GIV(stackPointer) - BytesPerWord), actualReceiver);
-	GIV(stackPointer) = sp2;
-	for (index = 1; index <= arraySize; index += 1) {
-		/* begin push: */
-		longAtput((sp = GIV(stackPointer) - BytesPerWord), longAt((argumentArray + BaseHeaderSize) + ((index - 1) << (shiftForWord()))));
-		GIV(stackPointer) = sp;
-	}
-	GIV(argumentCount) = arraySize;
-	GIV(messageSelector) = selector;
-	/* begin sendBreakpoint:receiver: */
-	sendBreakpointreceiver(firstFixedFieldOfMaybeImmediate(GIV(messageSelector)), lengthOfMaybeImmediate(GIV(messageSelector)), actualReceiver);
-	if (printOnTrace()) {
-		printActivationNameForSelectorstartClass(GIV(messageSelector), lookupClass);
-		/* begin cr */
-		printf("\n");
-	}
-	findNewMethodInClassTag(lookupClass);
-	if ((((GIV(newMethod) & 1) == 0)
-	 && (((((usqInt) (longAt(GIV(newMethod)))) >> (instFormatFieldLSB())) & 15) >= 12))
-	 && ((argumentCountOf(GIV(newMethod))) != GIV(argumentCount))) {
-
-		/* Restore the state by popping all those array entries and pushing back the selector and array, and fail */
-
-		/* begin pop: */
-		GIV(stackPointer) += (arraySize + 1) * BytesPerWord;
-		null;
-		/* begin popStack */
-		top = longAt(GIV(stackPointer));
-		GIV(stackPointer) += BytesPerWord;
-		GIV(newMethod) = ((sqInt) top);
-		return (GIV(primFailCode) = PrimErrBadNumArgs);
-	}
-
-	/* +2 = receiver + saved newMethod */
-
-	delta = BytesPerWord * (performArgCount + 2);
-	for (offset = (GIV(argumentCount) * BytesPerWord); offset >= 0; offset += (-BytesPerWord)) {
-		longAtput((GIV(stackPointer) + offset) + delta, longAt(GIV(stackPointer) + offset));
-	}
-	/* begin pop: */
-	GIV(stackPointer) += (performArgCount + 2) * BytesPerWord;
-	null;
-	executeNewMethod();
-	/* begin initPrimCall */
-	GIV(primFailCode) = 0;
-	return null;
-}
-
 static void
 printActivationNameForSelectorstartClass(sqInt aSelector, sqInt startClass)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT

Modified: branches/Cog/nscogsrc/vm/cointerp.h
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.h	2015-02-02 02:24:35 UTC (rev 3245)
+++ branches/Cog/nscogsrc/vm/cointerp.h	2015-02-04 23:48:12 UTC (rev 3246)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1035 uuid: 33a34378-0618-40c7-8fbb-c467fb40fc57
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1040 uuid: be108ef5-00a3-425b-b228-16515cc447c7
  */
 
 

Modified: branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2015-02-02 02:24:35 UTC (rev 3245)
+++ branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2015-02-04 23:48:12 UTC (rev 3246)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1035 uuid: 33a34378-0618-40c7-8fbb-c467fb40fc57
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1040 uuid: be108ef5-00a3-425b-b228-16515cc447c7
    from
-	CoInterpreter VMMaker.oscog-eem.1035 uuid: 33a34378-0618-40c7-8fbb-c467fb40fc57
+	CoInterpreter VMMaker.oscog-eem.1040 uuid: be108ef5-00a3-425b-b228-16515cc447c7
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1035 uuid: 33a34378-0618-40c7-8fbb-c467fb40fc57 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1040 uuid: be108ef5-00a3-425b-b228-16515cc447c7 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -1177,7 +1177,6 @@
 EXPORT(void) primitiveEventProcessingControl(void);
 sqInt primitiveIndexOfMethodheader(sqInt theMethod, sqInt methodHeader);
 sqInt primitiveIndexOf(sqInt methodPointer);
-static sqInt primitiveObjectperformwithArgumentslookedUpIn(sqInt actualReceiver, sqInt selector, sqInt argumentArray, sqInt lookupClass) NoDbgRegParms;
 static void printActivationNameForSelectorstartClass(sqInt aSelector, sqInt startClass) NoDbgRegParms;
 static void printActivationNameForreceiverisBlockfirstTemporary(sqInt aMethod, sqInt anObject, sqInt isBlock, sqInt maybeMessage) NoDbgRegParms;
 void printAllStacks(void);
@@ -2101,7 +2100,7 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 char expensiveAsserts = 0;
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1035";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1040";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -30684,10 +30683,26 @@
 static void
 primitivePerformInSuperclass(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt argumentArray;
+    sqInt arraySize;
     sqInt ccIndex;
+    sqInt ccIndex1;
+    sqInt ccIndex2;
     sqInt currentClass;
+    sqInt delta;
+    sqInt header;
+    sqInt index;
     sqInt lookupClass;
+    sqInt offset;
+    sqInt performArgCount;
     sqInt rcvr;
+    sqInt selector;
+    sqInt selector1;
+    char *sp;
+    char *sp1;
+    char *sp2;
+    sqInt sz;
+    sqInt top;
 
 	lookupClass = longAt(GIV(stackPointer));
 	rcvr = longAt(GIV(stackPointer) + (3 * BytesPerWord));
@@ -30704,24 +30719,206 @@
 			return;
 		}
 	}
-	primitiveObjectperformwithArgumentslookedUpIn(rcvr, longAt(GIV(stackPointer) + (2 * BytesPerWord)), longAt(GIV(stackPointer) + (1 * BytesPerWord)), lookupClass);
+	/* begin primitiveObject:perform:withArguments:lookedUpIn: */
+	selector = longAt(GIV(stackPointer) + (2 * BytesPerWord));
+	argumentArray = longAt(GIV(stackPointer) + (1 * BytesPerWord));
+	if (!(((argumentArray & 1) == 0)
+		 && (((((usqInt) (longAt(argumentArray))) >> (instFormatFieldLSB())) & 15) == 2))) {
+		GIV(primFailCode) = PrimErrBadArgument;
+		goto l1;
+	}
+	/* begin numSlotsOf: */
+	header = longAt(argumentArray);
+	sz = ((header & TypeMask) == HeaderTypeSizeAndClass
+		? (longAt(argumentArray - (BytesPerWord * 2))) & AllButTypeMask
+		: header & SizeMask);
+	arraySize = ((usqInt) (sz - BaseHeaderSize)) >> (shiftForWord());
+	if (arraySize > LargeContextSlots) {
+		GIV(primFailCode) = PrimErrBadNumArgs;
+		goto l1;
+	}
+
+	/* Push newMethod to save it in case of failure,
+	   then push the actual receiver and args out of the array. */
+
+	performArgCount = GIV(argumentCount);
+	/* begin push: */
+	longAtput((sp1 = GIV(stackPointer) - BytesPerWord), GIV(newMethod));
+	GIV(stackPointer) = sp1;
+	/* begin push: */
+	longAtput((sp2 = GIV(stackPointer) - BytesPerWord), rcvr);
+	GIV(stackPointer) = sp2;
+	for (index = 1; index <= arraySize; index += 1) {
+		/* begin push: */
+		longAtput((sp = GIV(stackPointer) - BytesPerWord), longAt((argumentArray + BaseHeaderSize) + ((index - 1) << (shiftForWord()))));
+		GIV(stackPointer) = sp;
+	}
+	GIV(argumentCount) = arraySize;
+	GIV(messageSelector) = selector;
+	/* begin sendBreakpoint:receiver: */
+	selector1 = GIV(messageSelector);
+	sendBreakpointreceiver(firstFixedFieldOfMaybeImmediate(selector1), lengthOfMaybeImmediate(selector1), rcvr);
+	if (printOnTrace()) {
+		printActivationNameForSelectorstartClass(GIV(messageSelector), (lookupClass == null
+			? ((rcvr & 1)
+					? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << (shiftForWord())))
+					: (((ccIndex2 = (((usqInt) (longAt(rcvr))) >> (compactClassFieldLSB())) & 0x1F)) == 0
+							? (longAt(rcvr - BaseHeaderSize)) & AllButTypeMask
+							: (/* begin fetchPointer:ofObject: */
+								longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex2 - 1) << (shiftForWord()))))))
+			: lookupClass));
+		/* begin cr */
+		printf("\n");
+	}
+	findNewMethodInClassTag((lookupClass == null
+		? ((rcvr & 1)
+				? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << (shiftForWord())))
+				: (((ccIndex1 = (((usqInt) (longAt(rcvr))) >> (compactClassFieldLSB())) & 0x1F)) == 0
+						? (longAt(rcvr - BaseHeaderSize)) & AllButTypeMask
+						: (/* begin fetchPointer:ofObject: */
+							longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex1 - 1) << (shiftForWord()))))))
+		: lookupClass));
+	if ((((GIV(newMethod) & 1) == 0)
+	 && (((((usqInt) (longAt(GIV(newMethod)))) >> (instFormatFieldLSB())) & 15) >= 12))
+	 && ((argumentCountOf(GIV(newMethod))) != GIV(argumentCount))) {
+
+		/* Restore the state by popping all those array entries and pushing back the selector and array, and fail */
+
+		/* begin pop: */
+		GIV(stackPointer) += (arraySize + 1) * BytesPerWord;
+		null;
+		/* begin popStack */
+		top = longAt(GIV(stackPointer));
+		GIV(stackPointer) += BytesPerWord;
+		GIV(newMethod) = ((sqInt) top);
+		GIV(primFailCode) = PrimErrBadNumArgs;
+		goto l1;
+	}
+
+	/* +2 = receiver + saved newMethod */
+
+	delta = BytesPerWord * (performArgCount + 2);
+	for (offset = (GIV(argumentCount) * BytesPerWord); offset >= 0; offset += (-BytesPerWord)) {
+		longAtput((GIV(stackPointer) + offset) + delta, longAt(GIV(stackPointer) + offset));
+	}
+	/* begin pop: */
+	GIV(stackPointer) += (performArgCount + 2) * BytesPerWord;
+	null;
+	executeNewMethod();
+	/* begin initPrimCall */
+	GIV(primFailCode) = 0;
+	null;
+l1:	/* end primitiveObject:perform:withArguments:lookedUpIn: */;
 }
 
 static void
 primitivePerformWithArgs(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt actualReceiver;
+    sqInt argumentArray;
+    sqInt arraySize;
     sqInt ccIndex;
-    sqInt lookupClass;
-    sqInt rcvr;
+    sqInt ccIndex1;
+    sqInt delta;
+    sqInt header;
+    sqInt index;
+    sqInt offset;
+    sqInt performArgCount;
+    sqInt selector;
+    sqInt selector1;
+    char *sp;
+    char *sp1;
+    char *sp2;
+    sqInt sz;
+    sqInt top;
 
-	rcvr = longAt(GIV(stackPointer) + (2 * BytesPerWord));
-	lookupClass = ((rcvr & 1)
+	/* begin primitiveObject:perform:withArguments:lookedUpIn: */
+	actualReceiver = longAt(GIV(stackPointer) + (2 * BytesPerWord));
+	selector = longAt(GIV(stackPointer) + (1 * BytesPerWord));
+	argumentArray = longAt(GIV(stackPointer));
+	if (!(((argumentArray & 1) == 0)
+		 && (((((usqInt) (longAt(argumentArray))) >> (instFormatFieldLSB())) & 15) == 2))) {
+		GIV(primFailCode) = PrimErrBadArgument;
+		goto l1;
+	}
+	/* begin numSlotsOf: */
+	header = longAt(argumentArray);
+	sz = ((header & TypeMask) == HeaderTypeSizeAndClass
+		? (longAt(argumentArray - (BytesPerWord * 2))) & AllButTypeMask
+		: header & SizeMask);
+	arraySize = ((usqInt) (sz - BaseHeaderSize)) >> (shiftForWord());
+	if (arraySize > LargeContextSlots) {
+		GIV(primFailCode) = PrimErrBadNumArgs;
+		goto l1;
+	}
+
+	/* Push newMethod to save it in case of failure,
+	   then push the actual receiver and args out of the array. */
+
+	performArgCount = GIV(argumentCount);
+	/* begin push: */
+	longAtput((sp1 = GIV(stackPointer) - BytesPerWord), GIV(newMethod));
+	GIV(stackPointer) = sp1;
+	/* begin push: */
+	longAtput((sp2 = GIV(stackPointer) - BytesPerWord), actualReceiver);
+	GIV(stackPointer) = sp2;
+	for (index = 1; index <= arraySize; index += 1) {
+		/* begin push: */
+		longAtput((sp = GIV(stackPointer) - BytesPerWord), longAt((argumentArray + BaseHeaderSize) + ((index - 1) << (shiftForWord()))));
+		GIV(stackPointer) = sp;
+	}
+	GIV(argumentCount) = arraySize;
+	GIV(messageSelector) = selector;
+	/* begin sendBreakpoint:receiver: */
+	selector1 = GIV(messageSelector);
+	sendBreakpointreceiver(firstFixedFieldOfMaybeImmediate(selector1), lengthOfMaybeImmediate(selector1), actualReceiver);
+	if (printOnTrace()) {
+		printActivationNameForSelectorstartClass(GIV(messageSelector), ((actualReceiver & 1)
+			? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << (shiftForWord())))
+			: (((ccIndex = (((usqInt) (longAt(actualReceiver))) >> (compactClassFieldLSB())) & 0x1F)) == 0
+					? (longAt(actualReceiver - BaseHeaderSize)) & AllButTypeMask
+					: (/* begin fetchPointer:ofObject: */
+						longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord())))))));
+		/* begin cr */
+		printf("\n");
+	}
+	findNewMethodInClassTag(((actualReceiver & 1)
 		? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << (shiftForWord())))
-		: (((ccIndex = (((usqInt) (longAt(rcvr))) >> (compactClassFieldLSB())) & 0x1F)) == 0
-				? (longAt(rcvr - BaseHeaderSize)) & AllButTypeMask
+		: (((ccIndex1 = (((usqInt) (longAt(actualReceiver))) >> (compactClassFieldLSB())) & 0x1F)) == 0
+				? (longAt(actualReceiver - BaseHeaderSize)) & AllButTypeMask
 				: (/* begin fetchPointer:ofObject: */
-					longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex - 1) << (shiftForWord()))))));
-	primitiveObjectperformwithArgumentslookedUpIn(rcvr, longAt(GIV(stackPointer) + (1 * BytesPerWord)), longAt(GIV(stackPointer)), lookupClass);
+					longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << (shiftForWord())))) + BaseHeaderSize) + ((ccIndex1 - 1) << (shiftForWord())))))));
+	if ((((GIV(newMethod) & 1) == 0)
+	 && (((((usqInt) (longAt(GIV(newMethod)))) >> (instFormatFieldLSB())) & 15) >= 12))
+	 && ((argumentCountOf(GIV(newMethod))) != GIV(argumentCount))) {
+
+		/* Restore the state by popping all those array entries and pushing back the selector and array, and fail */
+
+		/* begin pop: */
+		GIV(stackPointer) += (arraySize + 1) * BytesPerWord;
+		null;
+		/* begin popStack */
+		top = longAt(GIV(stackPointer));
+		GIV(stackPointer) += BytesPerWord;
+		GIV(newMethod) = ((sqInt) top);
+		GIV(primFailCode) = PrimErrBadNumArgs;
+		goto l1;
+	}
+
+	/* +2 = receiver + saved newMethod */
+
+	delta = BytesPerWord * (performArgCount + 2);
+	for (offset = (GIV(argumentCount) * BytesPerWord); offset >= 0; offset += (-BytesPerWord)) {
+		longAtput((GIV(stackPointer) + offset) + delta, longAt(GIV(stackPointer) + offset));
+	}
+	/* begin pop: */
+	GIV(stackPointer) += (performArgCount + 2) * BytesPerWord;
+	null;
+	executeNewMethod();
+	/* begin initPrimCall */
+	GIV(primFailCode) = 0;
+	null;
+l1:	/* end primitiveObject:perform:withArguments:lookedUpIn: */;
 }
 
 
@@ -47232,7 +47429,7 @@
 		}
 	}
 	else {
-		if (startIP > 64) {
+		if (startIP > lastIndex) {
 			print("...");
 			/* begin cr */
 			printf("\n");
@@ -48688,109 +48885,6 @@
 			(primBits & 0x1FF) + ((((usqInt) primBits) >> 19) & 512)));
 }
 
-
-/*	Common routine used by perform:withArgs:, perform:withArgs:inSuperclass:,
-	object:perform:withArgs:inClass: et al. Answer nil on success.
-	
-	NOTE: The case of doesNotUnderstand: is not a failure to perform.
-	The only failures are arg types and consistency of argumentCount.
-	
-	Since we're in the stack VM we can assume there is space to push the
-	arguments provided they are within limits (max argument count is 15). We
-	can therefore deal
-	with the arbitrary amount of state to remove from the stack (lookup class,
-	selector, mirror receiver) and arbitrary argument orders by deferring
-	popping anything until
-	we know whether the send has succeeded. So on failure we merely have to
-	remove the actual receiver and arguments pushed, and on success we have to
-	slide the actual
-	receiver and arguments down to replace the original ones. */
-
-static sqInt
-primitiveObjectperformwithArgumentslookedUpIn(sqInt actualReceiver, sqInt selector, sqInt argumentArray, sqInt lookupClass)
-{   DECL_MAYBE_SQ_GLOBAL_STRUCT
-    sqInt arraySize;
-    sqInt delta;
-    sqInt header;
-    sqInt index;
-    sqInt offset;
-    sqInt performArgCount;
-    char *sp;
-    char *sp1;
-    char *sp2;
-    sqInt sz;
-    sqInt top;
-
-	if (!(((argumentArray & 1) == 0)
-		 && (((((usqInt) (longAt(argumentArray))) >> (instFormatFieldLSB())) & 15) == 2))) {
-		return (GIV(primFailCode) = PrimErrBadArgument);
-	}
-	/* begin numSlotsOf: */
-	header = longAt(argumentArray);
-	sz = ((header & TypeMask) == HeaderTypeSizeAndClass
-		? (longAt(argumentArray - (BytesPerWord * 2))) & AllButTypeMask
-		: header & SizeMask);
-	arraySize = ((usqInt) (sz - BaseHeaderSize)) >> (shiftForWord());
-	if (arraySize > LargeContextSlots) {
-		return (GIV(primFailCode) = PrimErrBadNumArgs);
-	}
-
-	/* Push newMethod to save it in case of failure,
-	   then push the actual receiver and args out of the array. */
-
-	performArgCount = GIV(argumentCount);
-	/* begin push: */
-	longAtput((sp1 = GIV(stackPointer) - BytesPerWord), GIV(newMethod));
-	GIV(stackPointer) = sp1;
-	/* begin push: */
-	longAtput((sp2 = GIV(stackPointer) - BytesPerWord), actualReceiver);
-	GIV(stackPointer) = sp2;
-	for (index = 1; index <= arraySize; index += 1) {
-		/* begin push: */
-		longAtput((sp = GIV(stackPointer) - BytesPerWord), longAt((argumentArray + BaseHeaderSize) + ((index - 1) << (shiftForWord()))));
-		GIV(stackPointer) = sp;
-	}
-	GIV(argumentCount) = arraySize;
-	GIV(messageSelector) = selector;
-	/* begin sendBreakpoint:receiver: */
-	sendBreakpointreceiver(firstFixedFieldOfMaybeImmediate(GIV(messageSelector)), lengthOfMaybeImmediate(GIV(messageSelector)), actualReceiver);
-	if (printOnTrace()) {
-		printActivationNameForSelectorstartClass(GIV(messageSelector), lookupClass);
-		/* begin cr */
-		printf("\n");
-	}
-	findNewMethodInClassTag(lookupClass);
-	if ((((GIV(newMethod) & 1) == 0)
-	 && (((((usqInt) (longAt(GIV(newMethod)))) >> (instFormatFieldLSB())) & 15) >= 12))
-	 && ((argumentCountOf(GIV(newMethod))) != GIV(argumentCount))) {
-
-		/* Restore the state by popping all those array entries and pushing back the selector and array, and fail */
-
-		/* begin pop: */
-		GIV(stackPointer) += (arraySize + 1) * BytesPerWord;
-		null;
-		/* begin popStack */
-		top = longAt(GIV(stackPointer));
-		GIV(stackPointer) += BytesPerWord;
-		GIV(newMethod) = ((sqInt) top);
-		return (GIV(primFailCode) = PrimErrBadNumArgs);
-	}
-
-	/* +2 = receiver + saved newMethod */
-
-	delta = BytesPerWord * (performArgCount + 2);
-	for (offset = (GIV(argumentCount) * BytesPerWord); offset >= 0; offset += (-BytesPerWord)) {
-		longAtput((GIV(stackPointer) + offset) + delta, longAt(GIV(stackPointer) + offset));
-	}
-	/* begin pop: */
-	GIV(stackPointer) += (performArgCount + 2) * BytesPerWord;
-	null;
-	executeNewMethod();
-	/* begin initPrimCall */
-	GIV(primFailCode) = 0;
-	return null;
-}
-
 static void
 printActivationNameForSelectorstartClass(sqInt aSelector, sqInt startClass)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT

Modified: branches/Cog/nsspursrc/vm/cogit.c
===================================================================
--- branches/Cog/nsspursrc/vm/cogit.c	2015-02-02 02:24:35 UTC (rev 3245)
+++ branches/Cog/nsspursrc/vm/cogit.c	2015-02-04 23:48:12 UTC (rev 3246)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1025 uuid: 1a29f456-a8e2-4312-a391-8e2cdb0430ee
+	CCodeGenerator VMMaker.oscog-eem.1039 uuid: 931d69b1-7be3-42dd-8833-1ba325d2b5f2
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.1025 uuid: 1a29f456-a8e2-4312-a391-8e2cdb0430ee
+	StackToRegisterMappingCogit VMMaker.oscog-eem.1039 uuid: 931d69b1-7be3-42dd-8833-1ba325d2b5f2
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1025 uuid: 1a29f456-a8e2-4312-a391-8e2cdb0430ee " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1039 uuid: 931d69b1-7be3-42dd-8833-1ba325d2b5f2 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -296,7 +296,7 @@
 #define NewspeakVM 1
 #define Nop 8
 #define NotFullyInitialized -1
-#define NSSendIsPCAnnotated 1
+#define NSSendIsPCAnnotated 0
 #define NumObjRefsInRuntime 0
 #define NumOopsPerIRC 2
 #define NumSendTrampolines 4
@@ -929,7 +929,6 @@
 static sqInt frameOffsetOfTemporary(sqInt index) NoDbgRegParms;
 static sqInt genBlockReturn(void);
 static AbstractInstruction * genDoubleFailIfZeroArgRcvrarg(sqInt rcvrReg, sqInt argReg) NoDbgRegParms;
-static sqInt genDynamicSuperSendBytecode(void);
 static sqInt genExtendedSendBytecode(void);
 static sqInt genExtendedSuperBytecode(void);
 static sqInt genExtJumpIfFalse(void);
@@ -1094,7 +1093,6 @@
 static sqInt genPushActiveContextBytecode(void);
 static sqInt genPushClosureCopyCopiedValuesBytecode(void);
 static sqInt genPushEnclosingObjectAt(sqInt level) NoDbgRegParms;
-static sqInt genPushImplicitReceiverBytecode(void);
 static sqInt genPushLiteralVariable(sqInt literalIndex) NoDbgRegParms;
 static sqInt genPushLiteral(sqInt literal) NoDbgRegParms;
 static sqInt genPushMaybeContextReceiverVariable(sqInt slotIndex) NoDbgRegParms;
@@ -1110,7 +1108,6 @@
 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;
 static sqInt genSendTrampolineFornumArgscalledargargargarg(void *aRoutine, sqInt numArgs, char *aString, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2, sqInt regOrConst3) NoDbgRegParms;
@@ -1170,8 +1167,8 @@
 static CogSimStackEntry ssTopDescriptor(void);
 static CogSimStackEntry * ssValue(sqInt n) NoDbgRegParms;
 static sqInt tryCollapseTempVectorInitializationOfSize(sqInt slots) NoDbgRegParms;
-static sqInt v3or4PushNilSize(sqInt aMethodObj) NoDbgRegParms;
-static sqInt v3or4NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aMethodObj) NoDbgRegParms;
+static sqInt v3PushNilSize(sqInt aMethodObj) NoDbgRegParms;
+static sqInt v3NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aMethodObj) NoDbgRegParms;
 static sqInt oopisGreaterThanOrEqualTo(sqInt anOop, sqInt otherOop) NoDbgRegParms;
 static sqInt oopisGreaterThan(sqInt anOop, sqInt otherOop) NoDbgRegParms;
 static sqInt oopisLessThan(sqInt anOop, sqInt otherOop) NoDbgRegParms;
@@ -1397,8 +1394,8 @@
 	{ genReturnNil, 0, needsFrameIfInBlock, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0 },
 	{ genReturnTopFromMethod, 0, needsFrameIfInBlock, -1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0 },
 	{ genReturnTopFromBlock, 0, needsFrameNever, -1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0 },
-	{ genDynamicSuperSendBytecode, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 0, 0, 0 },
-	{ genPushImplicitReceiverBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 1 },
+	{ unknownBytecode, 0, 0, 0, Nop, 1, 0, 0, 0, 0, 0, 0, 1, 0 },
+	{ unknownBytecode, 0, 0, 0, Nop, 1, 0, 0, 0, 0, 0, 0, 1, 0 },
 	{ extendedPushBytecode, 0, needsFrameNever, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0 },
 	{ extendedStoreBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0 },
 	{ extendedStoreAndPopBytecode, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0 },
@@ -18977,13 +18974,7 @@
 	return gJumpFPEqual(0);
 }
 
-static sqInt
-genDynamicSuperSendBytecode(void)
-{
-	return genSendDynamicSupernumArgs(getLiteral(byte2), byte1);
-}
 
-
 /*	Can use any of the first 32 literals for the selector and pass up to 7
 	arguments. 
  */
@@ -20466,7 +20457,7 @@
     sqInt initialIndexOfIRC;
     sqInt initialOpcodeIndex;
     sqInt initialStackPtr;
-    sqInt (* const pushNilSizeFunction)(sqInt) = v3or4PushNilSize;
+    sqInt (* const pushNilSizeFunction)(sqInt) = v3PushNilSize;
     sqInt result;
     sqInt savedNeedsFrame;
     sqInt savedNumArgs;
@@ -22558,18 +22549,6 @@
 }
 
 static sqInt
-genPushImplicitReceiverBytecode(void)
-{
-    sqInt result;
-
-	result = genGetImplicitReceiverForforPush(getLiteral(byte1), 1);
-	if (result != 0) {
-		return result;
-	}
-	return ssPushRegister(ReceiverResultReg);
-}
-
-static sqInt
 genPushLiteralVariable(sqInt literalIndex)
 {
     sqInt association;
@@ -22821,13 +22800,6 @@
 }
 
 static sqInt
-genSendDynamicSupernumArgs(sqInt selector, sqInt numArgs)
-{
-	marshallSendArguments(numArgs);
-	return genMarshalledSendDynamicSupernumArgs(selector, numArgs);
-}
-
-static sqInt
 genSendSupernumArgs(sqInt selector, sqInt numArgs)
 {
 	marshallSendArguments(numArgs);
@@ -24128,7 +24100,7 @@
     sqInt framelessStackDelta;
     sqInt nExts;
     sqInt numPushNils;
-    sqInt (* const numPushNilsFunction)(struct _BytecodeDescriptor *,sqInt,sqInt,sqInt) = v3or4NumPushNils;
+    sqInt (* const numPushNilsFunction)(struct _BytecodeDescriptor *,sqInt,sqInt,sqInt) = v3NumPushNils;
     sqInt pc;
     sqInt pushingNils;
 
@@ -24690,27 +24662,15 @@
 }
 
 static sqInt
-v3or4PushNilSize(sqInt aMethodObj)
+v3PushNilSize(sqInt aMethodObj)
 {
-	return (methodUsesAlternateBytecodeSet(aMethodObj)
-		? 3
-		: 1);
+	return 1;
 }
 
 static sqInt
-v3or4NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aMethodObj)
+v3NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aMethodObj)
 {
-    sqInt numNils;
-
-	if (((numNils = (((descriptor->generator)) == genPushConstantNilBytecode
-	? 1
-	: 0))) > 0) {
-		return numNils;
-	}
-	return ((((descriptor->generator)) == genExtPushPseudoVariableOrOuterBytecode)
-	 && ((assert((fetchByteofObject(pc, aMethodObj)) == 77),
-	(nExts == 1)
-		 && ((fetchByteofObject(pc - 1, aMethodObj)) == 2)))
+	return (((descriptor->generator)) == genPushConstantNilBytecode
 		? 1
 		: 0);
 }

Modified: branches/Cog/nsspursrc/vm/cogit.h
===================================================================
--- branches/Cog/nsspursrc/vm/cogit.h	2015-02-02 02:24:35 UTC (rev 3245)
+++ branches/Cog/nsspursrc/vm/cogit.h	2015-02-04 23:48:12 UTC (rev 3246)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1025 uuid: 1a29f456-a8e2-4312-a391-8e2cdb0430ee
+	CCodeGenerator VMMaker.oscog-eem.1039 uuid: 931d69b1-7be3-42dd-8833-1ba325d2b5f2
  */
 
 

Modified: branches/Cog/nsspursrc/vm/cointerp.c
===================================================================
--- branches/Cog/nsspursrc/vm/cointerp.c	2015-02-02 02:24:35 UTC (rev 3245)
+++ branches/Cog/nsspursrc/vm/cointerp.c	2015-02-04 23:48:12 UTC (rev 3246)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1035 uuid: 33a34378-0618-40c7-8fbb-c467fb40fc57
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1041 uuid: 07a9d555-3a71-4774-a5f2-04a2ee09a74e
    from
-	CoInterpreter VMMaker.oscog-eem.1035 uuid: 33a34378-0618-40c7-8fbb-c467fb40fc57
+	CoInterpreter VMMaker.oscog-eem.1041 uuid: 07a9d555-3a71-4774-a5f2-04a2ee09a74e
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1035 uuid: 33a34378-0618-40c7-8fbb-c467fb40fc57 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1041 uuid: 07a9d555-3a71-4774-a5f2-04a2ee09a74e " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -949,7 +949,7 @@
 static void expungeFromClassTable(sqInt aBehavior) NoDbgRegParms;
 sqInt falseObject(void);
 sqInt fetchByteofObject(sqInt byteIndex, sqInt objOop);
-static sqInt fetchClassOfNonImm(sqInt objOop) NoDbgRegParms;
+static sqInt fetchClassOfNonImm(sqInt objOop) NoDbgRegParms NeverInline;
 sqInt fetchClassOf(sqInt oop);
 static sqInt fetchClassTagOfNonImm(sqInt obj) NoDbgRegParms;
 sqInt fetchLong32ofObject(sqInt fieldIndex, sqInt oop);
@@ -1083,7 +1083,7 @@
 static void markAndTraceObjStackandContents(sqInt stackOrNil, sqInt markAndTraceContents) NoDbgRegParms;
 void markAndTrace(sqInt objOop);
 static sqInt markInactiveEphemerons(void);
-static void markObjects(sqInt objectsShouldBeUnmarked) NoDbgRegParms NeverInline;
+static void markObjects(sqInt objectsShouldBeUnmarkedAndUnmarkedClassesShouldBeExpunged) NoDbgRegParms NeverInline;
 static void markWeaklingsAndMarkAndFireEphemerons(void);
 sqInt maybeSplObj(sqInt index);
 static sqInt moveARunOfObjectsStartingAtupTo(usqInt startAddress, usqInt limit) NoDbgRegParms;
@@ -1366,7 +1366,6 @@
 EXPORT(void) primitiveEventProcessingControl(void);
 sqInt primitiveIndexOfMethodheader(sqInt theMethod, sqInt methodHeader);
 sqInt primitiveIndexOf(sqInt methodPointer);
-static sqInt primitiveObjectperformwithArgumentslookedUpIn(sqInt actualReceiver, sqInt selector, sqInt argumentArray, sqInt lookupClass) NoDbgRegParms;
 static void printActivationNameForSelectorstartClass(sqInt aSelector, sqInt startClass) NoDbgRegParms;
 static void printActivationNameForreceiverisBlockfirstTemporary(sqInt aMethod, sqInt anObject, sqInt isBlock, sqInt maybeMessage) NoDbgRegParms;
 void printAllStacks(void);
@@ -1526,10 +1525,10 @@
 #endif
 _iss char * stackPointer;
 _iss sqInt primFailCode;
-_iss sqInt nilObj;
 _iss char * framePointer;
 _iss usqInt method;
 _iss StackPage * stackPage;
+_iss sqInt nilObj;
 _iss sqInt specialObjectsOop;
 _iss sqInt bytecodeSetSelector;
 _iss sqInt argumentCount;
@@ -1538,7 +1537,6 @@
 _iss usqInt instructionPointer;
 _iss usqInt newMethod;
 _iss sqInt messageSelector;
-_iss sqInt hiddenRootsObj;
 _iss usqInt newSpaceLimit;
 _iss StackPage * pages;
 _iss char * stackBasePlus1;
@@ -1547,6 +1545,7 @@
 _iss usqInt newSpaceStart;
 _iss SpurSegmentInfo * segments;
 _iss sqInt trueObj;
+_iss sqInt hiddenRootsObj;
 _iss sqInt needGCFlag;
 _iss sqInt falseObj;
 _iss usqInt totalFreeOldSpace;
@@ -1557,11 +1556,11 @@
 _iss usqInt scavengeThreshold;
 _iss sqInt remapBufferCount;
 _iss sqInt * freeLists;
+_iss sqInt classTableFirstPage;
 _iss char * stackLimit;
 _iss sqInt rememberedSetSize;
 _iss sqInt tempOop;
 _iss sqInt * rememberedSet;
-_iss sqInt classTableFirstPage;
 _iss usqInt freeListsMask;
 _iss sqInt profileProcess;
 _iss sqInt profileSemaphore;
@@ -1725,9 +1724,9 @@
 #endif
 #endif
 static void (*primitiveFunctionPointer)();
+sqInt checkForLeaks;
 sqInt maxLiteralCountForCompile = MaxLiteralCountForCompile /* 60 */;
 jmp_buf reenterInterpreter; /* private export */;
-sqInt checkForLeaks;
 sqInt checkAllocFiller;
 sqInt breakSelectorLength = MinSmallInteger;
 sqInt inIOProcessEvents;
@@ -2326,7 +2325,7 @@
 /*20*/	0, 0, 0,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0,-1,-1,-1, 0, 0, 0,
 /*40*/	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
 /*60*/	0, 0, 1,-1,-1,-1,-1,-1, 0, 0,-1,-1, 0, 1, 1, 0, 0, 0, 0, 0,
-/*80*/	-1,-1,-1, 0, 1,-1, 1, 0, 1,-1,-1, 0, 0, 0, 0,-1,-1,-1, 0, 0,
+/*80*/	-1,-1,-1, 0,-1,-1, 1, 0, 1,-1,-1, 0, 0, 0, 0,-1,-1,-1, 0, 0,
 /*100*/	1, 2, 0, 3,-1, 1,-1,-1,-1,-1, 0, 0,-1,-1,-1, 1, 1,-1, 1, 0,
 /*120*/	-1, 1,-1,-1, 0,-1, 0, 0, 0,-1,-1,-1, 1, 0, 0,-1, 0,-1,-1,-1,
 /*140*/	-1, 1,-1, 1, 0, 0,-1,-1, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
@@ -2353,7 +2352,7 @@
 /*560*/	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0,-1,-1
 	};
 char expensiveAsserts = 0;
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1035";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1041";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -5103,7 +5102,7 @@
 
 				if (!((byteAt((localFP + FoxIFrameFlags) + 3)) != 0)) {
 					goto commonCallerReturn;
-					goto l250;
+					goto l227;
 				}
 				closure = longAt(localFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(localFP + FoxMethod)))) < (startOfMemory())
 	? ((mframeCogMethod(localFP))->cmNumArgs)
@@ -5156,10 +5155,10 @@
 						: (byteAt((localFP + FoxIFrameFlags) + 2)) != 0)) {
 						assert(isContext(frameContext(localFP)));
 						ourContext = longAt(localFP + FoxThisContext);
-						goto l254;
+						goto l231;
 					}
 					ourContext = marryFrameSP(localFP, localSP);
-				l254:	/* end ensureFrameIsMarried:SP: */;
+				l231:	/* end ensureFrameIsMarried:SP: */;
 					/* begin internalPush: */
 					longAtPointerput((localSP -= BytesPerOop), ourContext);
 					/* begin internalPush: */
@@ -5168,7 +5167,7 @@
 					GIV(argumentCount) = 1;
 					goto normalSend;
 					/* return self */
-					goto l250;
+					goto l227;
 				}
 				if (unwindContextOrNilOrZero != 0) {
 					/* begin internalAboutToReturn:through: */
@@ -5178,10 +5177,10 @@
 						: (byteAt((localFP + FoxIFrameFlags) + 2)) != 0)) {
 						assert(isContext(frameContext(localFP)));
 						ourContext1 = longAt(localFP + FoxThisContext);
-						goto l251;
+						goto l228;
 					}
 					ourContext1 = marryFrameSP(localFP, localSP);
-				l251:	/* end ensureFrameIsMarried:SP: */;
+				l228:	/* end ensureFrameIsMarried:SP: */;
 					/* begin internalPush: */
 					longAtPointerput((localSP -= BytesPerOop), ourContext1);
 					/* begin internalPush: */
@@ -5192,7 +5191,7 @@
 					GIV(argumentCount) = 2;
 					goto normalSend;
 					/* return self */
-					goto l250;
+					goto l227;
 				}
 				contextToReturnTo = null;
 				if (((longAt((home + BaseHeaderSize) + (SenderIndex << (shiftForWord())))) & 1)) {
@@ -5249,10 +5248,10 @@
 							: (byteAt((localFP + FoxIFrameFlags) + 2)) != 0)) {
 							assert(isContext(frameContext(localFP)));
 							ourContext2 = longAt(localFP + FoxThisContext);
-							goto l253;
+							goto l230;
 						}
 						ourContext2 = marryFrameSP(localFP, localSP);
-					l253:	/* end ensureFrameIsMarried:SP: */;
+					l230:	/* end ensureFrameIsMarried:SP: */;
 						/* begin internalPush: */
 						longAtPointerput((localSP -= BytesPerOop), ourContext2);
 						/* begin internalPush: */
@@ -5261,7 +5260,7 @@
 						GIV(argumentCount) = 1;
 						goto normalSend;
 						/* return self */
-						goto l250;
+						goto l227;
 					}
 				}
 				assert(pageListIsWellFormed());
@@ -5380,11 +5379,11 @@
 						GIV(framePointer) = localFP;
 						
 						ceEnterCogCodePopReceiverReg();
-						goto l252;
+						goto l229;
 					}
 					localIP = pointerForOop(longAt(localFP + FoxIFSavedIP));
 				}
-			l252:	/* end maybeReturnToMachineCodeFrame */;
+			l229:	/* end maybeReturnToMachineCodeFrame */;
 				/* begin setMethod: */
 				assert((((usqInt)(longAt(localFP + FoxMethod)))) >= (startOfMemory()));
 				GIV(method) = longAt(localFP + FoxMethod);
@@ -5398,7 +5397,7 @@
 
 				longAtPointerput(localSP, localReturnValue);
 			}
-		l250:	/* end case */;
+		l227:	/* end case */;
 			break;
 		case 121:
 			/* returnTrue */
@@ -5517,27 +5516,27 @@
 							fp = (thePage->headFP);
 							if (fp == theFP) {
 								frameAbove = 0;
-								goto l257;
+								goto l234;
 							}
 							while (((callerFP = frameCallerFP(fp))) != 0) {
 								if (callerFP == theFP) {
 									frameAbove = fp;
-									goto l257;
+									goto l234;
 								}
 								fp = callerFP;
 							}
 							error("did not find theFP in stack page");
 							frameAbove = 0;
-						l257:	/* end findFrameAbove:inPage: */;
+						l234:	/* end findFrameAbove:inPage: */;
 							/* begin newStackPage */
 							lruOrFree = ((mostRecentlyUsedPage())->nextPage);
 							if (isFree(lruOrFree)) {
 								newPage = lruOrFree;
-								goto l258;
+								goto l235;
 							}
 							divorceFramesIn(lruOrFree);
 							newPage = lruOrFree;
-						l258:	/* end newStackPage */;
+						l235:	/* end newStackPage */;
 							assert(newPage == GIV(stackPage));
 							moveFramesInthroughtoPage(thePage, frameAbove, newPage);
 							markStackPageMostRecentlyUsed(newPage);
@@ -5561,7 +5560,7 @@
 							longAtput((sp2 = GIV(stackPointer) - BytesPerWord), GIV(instructionPointer));
 							GIV(stackPointer) = sp2;
 							ceSendAborttonumArgs(longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (SelectorCannotReturn << (shiftForWord()))), contextToReturnFrom, 1);
-							goto l256;
+							goto l233;
 						}
 						GIV(instructionPointer) = 0;
 						thePage = makeBaseFrameFor(contextToReturnTo);
@@ -5599,7 +5598,8 @@
 							GIV(framePointer) = localFP;
 							
 							ceEnterCogCodePopReceiverReg();
-							goto l256;
+							null;
+							goto l233;
 						}

@@ Diff output truncated at 50000 characters. @@


More information about the Vm-dev mailing list