[Vm-dev] [commit][3124] CogVM source as per VMMaker.oscog-eem.922

commits at squeakvm.org commits at squeakvm.org
Tue Nov 4 22:36:24 UTC 2014


Revision: 3124
Author:   eliot
Date:     2014-11-04 14:36:20 -0800 (Tue, 04 Nov 2014)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.922
Ancestors: VMMaker.oscog-eem.921

Fix a transcription slip in the new implicitReceiverFor:mixin:implementing:.
Use followObjField: in findApplicationOfTargetMixin:startingAtBehavior:.
Fix the assert in addFreeSubTree: similarly to that in addToFreeTree:bytes:.

Modified Paths:
--------------
    branches/Cog/nscogsrc/vm/cointerp.c
    branches/Cog/nscogsrc/vm/cointerp.h
    branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
    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/cointerp.c
    branches/Cog/sistasrc/vm/cointerp.h
    branches/Cog/sistasrc/vm/gcc3x-cointerp.c
    branches/Cog/spursistasrc/vm/cointerp.c
    branches/Cog/spursistasrc/vm/cointerp.h
    branches/Cog/spursistasrc/vm/gcc3x-cointerp.c
    branches/Cog/spursrc/vm/cointerp.c
    branches/Cog/spursrc/vm/cointerp.h
    branches/Cog/spursrc/vm/gcc3x-cointerp.c
    branches/Cog/spurstacksrc/vm/gcc3x-interp.c
    branches/Cog/spurstacksrc/vm/interp.c
    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/cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.c	2014-11-04 05:35:18 UTC (rev 3123)
+++ branches/Cog/nscogsrc/vm/cointerp.c	2014-11-04 22:36:20 UTC (rev 3124)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e
    from
-	CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
+	CoInterpreter VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -853,7 +853,7 @@
 void printWronglySizedContexts(sqInt printContexts);
 static void restoreHeadersFromtofromandtofrom(sqInt firstIn, sqInt lastIn, sqInt hdrBaseIn, sqInt firstOut, sqInt lastOut, sqInt hdrBaseOut) NoDbgRegParms;
 static void runLeakCheckerForFullGC(sqInt fullGCFlag) NoDbgRegParms;
-static sqInt safeObjectAfter(sqInt oop) NoDbgRegParms;
+static usqInt safeObjectAfter(sqInt oop) NoDbgRegParms;
 static sqInt safePrintStringOf(sqInt oop) NoDbgRegParms;
 static sqInt shortentoIndexableSize(sqInt obj, sqInt nSlots) NoDbgRegParms;
 static sqInt sizeBitsOfSafe(sqInt oop) NoDbgRegParms;
@@ -2086,7 +2086,7 @@
 	/* 574 */ (void (*)(void))0,
 	/* 575 */ (void (*)(void))0,
  0 };
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.921";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.922";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -16789,7 +16789,9 @@
 			mixinApplication = longAt((mixinApplication + BaseHeaderSize) + (SuperclassIndex << ShiftForWord));
 		}
 		candidateMixinApplication = mixinApplication;
-		assert(!((candidateMixinApplication == (nilObject()))));
+		if (candidateMixinApplication == GIV(nilObj)) {
+			return methodReceiver;
+		}
 		dictionary = longAt((candidateMixinApplication + BaseHeaderSize) + (MethodDictionaryIndex << ShiftForWord));
 		/* begin lookupMethodInDictionary: */
 		/* begin numSlotsOf: */
@@ -36645,17 +36647,15 @@
     sqInt header1;
     sqInt header2;
     sqInt header3;
-    sqInt header4;
     usqInt lastWord;
     sqInt newFreeChunk;
     sqInt newOop;
-    sqInt next;
+    usqInt next;
     sqInt oop;
     sqInt realHeader;
     sqInt sz;
     sqInt sz1;
     sqInt sz2;
-    sqInt sz3;
     sqInt target;
     usqInt w;
 
@@ -36666,21 +36666,7 @@
 		/* begin objectAfterWhileForwarding: */
 		header2 = longAt(oop);
 		if ((header2 & MarkBit) == 0) {
-			/* begin objectAfter: */
-			if (!(asserta(oopisLessThan(oop, GIV(freeStart))))) {
-				error("no objects after the end of memory");
-			}
-			if (((longAt(oop)) & TypeMask) == HeaderTypeFree) {
-				sz2 = (longAt(oop)) & AllButTypeMask;
-			}
-			else {
-				/* begin sizeBitsOf: */
-				header3 = longAt(oop);
-				sz2 = ((header3 & TypeMask) == HeaderTypeSizeAndClass
-					? (longAt(oop - (BytesPerWord * 2))) & LongSizeMask
-					: header3 & SizeMask);
-			}
-			next = (oop + sz2) + (headerTypeBytes[(longAt(oop + sz2)) & TypeMask]);
+			next = ((sqInt) (objectAfter(oop)));
 			goto l1;
 		}
 		fwdBlock1 = (header2 & AllButMarkBitAndTypeMask) << 1;
@@ -36695,7 +36681,7 @@
 		else {
 			sz1 = realHeader & SizeMask;
 		}
-		next = (oop + sz1) + (headerTypeBytes[(longAt(oop + sz1)) & TypeMask]);
+		next = ((sqInt) ((oop + sz1) + (headerTypeBytes[(longAt(oop + sz1)) & TypeMask])));
 	l1:	/* end objectAfterWhileForwarding: */;
 		if (!(((longAt(oop)) & TypeMask) == HeaderTypeFree)) {
 
@@ -36749,18 +36735,18 @@
 	}
 	/* begin safeObjectAfter: */
 	if (((longAt(newFreeChunk)) & TypeMask) == HeaderTypeFree) {
-		sz3 = (longAt(newFreeChunk)) & AllButTypeMask;
+		sz2 = (longAt(newFreeChunk)) & AllButTypeMask;
 	}
 	else {
 		/* begin sizeBitsOf: */
-		header4 = longAt(newFreeChunk);
-		sz3 = ((header4 & TypeMask) == HeaderTypeSizeAndClass
+		header3 = longAt(newFreeChunk);
+		sz2 = ((header3 & TypeMask) == HeaderTypeSizeAndClass
 			? (longAt(newFreeChunk - (BytesPerWord * 2))) & LongSizeMask
-			: header4 & SizeMask);
+			: header3 & SizeMask);
 	}
-	next = ((((usqInt)(newFreeChunk + sz3))) >= GIV(freeStart)
+	next = ((((usqInt)(newFreeChunk + sz2))) >= GIV(freeStart)
 		? GIV(freeStart)
-		: (newFreeChunk + sz3) + (headerTypeBytes[(longAt(newFreeChunk + sz3)) & TypeMask]));
+		: (newFreeChunk + sz2) + (headerTypeBytes[(longAt(newFreeChunk + sz2)) & TypeMask]));
 	assert((next == GIV(freeStart))
 	 || (next == (oopFromChunk(GIV(compEnd)))));
 	if (next == GIV(freeStart)) {
@@ -38636,7 +38622,7 @@
 	given object or free chunk in memory. Return freeStart when
 	enumeration is complete. This is for assertion checking only. */
 
-static sqInt
+static usqInt
 safeObjectAfter(sqInt oop)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt header;

Modified: branches/Cog/nscogsrc/vm/cointerp.h
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.h	2014-11-04 05:35:18 UTC (rev 3123)
+++ branches/Cog/nscogsrc/vm/cointerp.h	2014-11-04 22:36:20 UTC (rev 3124)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e
  */
 
 

Modified: branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2014-11-04 05:35:18 UTC (rev 3123)
+++ branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2014-11-04 22:36:20 UTC (rev 3124)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e
    from
-	CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
+	CoInterpreter VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -856,7 +856,7 @@
 void printWronglySizedContexts(sqInt printContexts);
 static void restoreHeadersFromtofromandtofrom(sqInt firstIn, sqInt lastIn, sqInt hdrBaseIn, sqInt firstOut, sqInt lastOut, sqInt hdrBaseOut) NoDbgRegParms;
 static void runLeakCheckerForFullGC(sqInt fullGCFlag) NoDbgRegParms;
-static sqInt safeObjectAfter(sqInt oop) NoDbgRegParms;
+static usqInt safeObjectAfter(sqInt oop) NoDbgRegParms;
 static sqInt safePrintStringOf(sqInt oop) NoDbgRegParms;
 static sqInt shortentoIndexableSize(sqInt obj, sqInt nSlots) NoDbgRegParms;
 static sqInt sizeBitsOfSafe(sqInt oop) NoDbgRegParms;
@@ -2089,7 +2089,7 @@
 	/* 574 */ (void (*)(void))0,
 	/* 575 */ (void (*)(void))0,
  0 };
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.921";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.922";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -16798,7 +16798,9 @@
 			mixinApplication = longAt((mixinApplication + BaseHeaderSize) + (SuperclassIndex << ShiftForWord));
 		}
 		candidateMixinApplication = mixinApplication;
-		assert(!((candidateMixinApplication == (nilObject()))));
+		if (candidateMixinApplication == GIV(nilObj)) {
+			return methodReceiver;
+		}
 		dictionary = longAt((candidateMixinApplication + BaseHeaderSize) + (MethodDictionaryIndex << ShiftForWord));
 		/* begin lookupMethodInDictionary: */
 		/* begin numSlotsOf: */
@@ -36654,17 +36656,15 @@
     sqInt header1;
     sqInt header2;
     sqInt header3;
-    sqInt header4;
     usqInt lastWord;
     sqInt newFreeChunk;
     sqInt newOop;
-    sqInt next;
+    usqInt next;
     sqInt oop;
     sqInt realHeader;
     sqInt sz;
     sqInt sz1;
     sqInt sz2;
-    sqInt sz3;
     sqInt target;
     usqInt w;
 
@@ -36675,21 +36675,7 @@
 		/* begin objectAfterWhileForwarding: */
 		header2 = longAt(oop);
 		if ((header2 & MarkBit) == 0) {
-			/* begin objectAfter: */
-			if (!(asserta(oopisLessThan(oop, GIV(freeStart))))) {
-				error("no objects after the end of memory");
-			}
-			if (((longAt(oop)) & TypeMask) == HeaderTypeFree) {
-				sz2 = (longAt(oop)) & AllButTypeMask;
-			}
-			else {
-				/* begin sizeBitsOf: */
-				header3 = longAt(oop);
-				sz2 = ((header3 & TypeMask) == HeaderTypeSizeAndClass
-					? (longAt(oop - (BytesPerWord * 2))) & LongSizeMask
-					: header3 & SizeMask);
-			}
-			next = (oop + sz2) + (headerTypeBytes[(longAt(oop + sz2)) & TypeMask]);
+			next = ((sqInt) (objectAfter(oop)));
 			goto l1;
 		}
 		fwdBlock1 = (header2 & AllButMarkBitAndTypeMask) << 1;
@@ -36704,7 +36690,7 @@
 		else {
 			sz1 = realHeader & SizeMask;
 		}
-		next = (oop + sz1) + (headerTypeBytes[(longAt(oop + sz1)) & TypeMask]);
+		next = ((sqInt) ((oop + sz1) + (headerTypeBytes[(longAt(oop + sz1)) & TypeMask])));
 	l1:	/* end objectAfterWhileForwarding: */;
 		if (!(((longAt(oop)) & TypeMask) == HeaderTypeFree)) {
 
@@ -36758,18 +36744,18 @@
 	}
 	/* begin safeObjectAfter: */
 	if (((longAt(newFreeChunk)) & TypeMask) == HeaderTypeFree) {
-		sz3 = (longAt(newFreeChunk)) & AllButTypeMask;
+		sz2 = (longAt(newFreeChunk)) & AllButTypeMask;
 	}
 	else {
 		/* begin sizeBitsOf: */
-		header4 = longAt(newFreeChunk);
-		sz3 = ((header4 & TypeMask) == HeaderTypeSizeAndClass
+		header3 = longAt(newFreeChunk);
+		sz2 = ((header3 & TypeMask) == HeaderTypeSizeAndClass
 			? (longAt(newFreeChunk - (BytesPerWord * 2))) & LongSizeMask
-			: header4 & SizeMask);
+			: header3 & SizeMask);
 	}
-	next = ((((usqInt)(newFreeChunk + sz3))) >= GIV(freeStart)
+	next = ((((usqInt)(newFreeChunk + sz2))) >= GIV(freeStart)
 		? GIV(freeStart)
-		: (newFreeChunk + sz3) + (headerTypeBytes[(longAt(newFreeChunk + sz3)) & TypeMask]));
+		: (newFreeChunk + sz2) + (headerTypeBytes[(longAt(newFreeChunk + sz2)) & TypeMask]));
 	assert((next == GIV(freeStart))
 	 || (next == (oopFromChunk(GIV(compEnd)))));
 	if (next == GIV(freeStart)) {
@@ -38645,7 +38631,7 @@
 	given object or free chunk in memory. Return freeStart when
 	enumeration is complete. This is for assertion checking only. */
 
-static sqInt
+static usqInt
 safeObjectAfter(sqInt oop)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt header;

Modified: branches/Cog/nsspursrc/vm/cointerp.c
===================================================================
--- branches/Cog/nsspursrc/vm/cointerp.c	2014-11-04 05:35:18 UTC (rev 3123)
+++ branches/Cog/nsspursrc/vm/cointerp.c	2014-11-04 22:36:20 UTC (rev 3124)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e
    from
-	CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
+	CoInterpreter VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -972,6 +972,7 @@
 static sqInt followForwardedInObjStackatIndex(sqInt objStack, sqInt objStackRootIndex) NoDbgRegParms;
 sqInt followForwardedObjectFieldstoDepth(sqInt objOop, sqInt depth);
 sqInt followForwarded(sqInt objOop);
+static sqInt followObjFieldofObject(sqInt fieldIndex, sqInt anObject) NoDbgRegParms;
 sqInt formatMask(void);
 sqInt formatOfClass(sqInt classPointer);
 static sqInt formatOf(sqInt objOop) NoDbgRegParms;
@@ -2335,7 +2336,7 @@
 /*540*/	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
 /*560*/	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0,-1,-1
 	};
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.921";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.922";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -5709,6 +5710,7 @@
 				sqInt mixinApplication1;
 				sqInt newHash;
 				sqInt objOop;
+				sqInt objOop1;
 				sqInt rcvr;
 				sqInt tagBits;
 
@@ -5753,8 +5755,14 @@
 				mixinApplication1 = aBehavior;
 				while (!((mixinApplication1 == GIV(nilObj))
 				 || ((mixinApplication1 == mClassMixin)
-				 || (((mixin = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << 2)))) == mClassMixin)))) {
-					mixinApplication1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+				 || (((mixin = followObjFieldofObject(MixinIndex, mixinApplication1))) == mClassMixin)))) {
+					/* begin followObjField:ofObject: */
+					objOop1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+					assert(isNonImmediate(objOop1));
+					if (((longAt(objOop1)) & (0x3FFFFF - 8)) == 0) {
+						objOop1 = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinApplication1, objOop1);
+					}
+					mixinApplication1 = objOop1;
 				}
 				mixinApplication = mixinApplication1;
 				/* begin classTagForClass: */
@@ -14615,6 +14623,7 @@
 				sqInt mixinApplication1;
 				sqInt newHash;
 				sqInt objOop;
+				sqInt objOop1;
 				sqInt oop;
 				sqInt tagBits;
 
@@ -14671,8 +14680,14 @@
 				mixinApplication1 = aBehavior;
 				while (!((mixinApplication1 == GIV(nilObj))
 				 || ((mixinApplication1 == mClassMixin)
-				 || (((mixin = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << 2)))) == mClassMixin)))) {
-					mixinApplication1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+				 || (((mixin = followObjFieldofObject(MixinIndex, mixinApplication1))) == mClassMixin)))) {
+					/* begin followObjField:ofObject: */
+					objOop1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+					assert(isNonImmediate(objOop1));
+					if (((longAt(objOop1)) & (0x3FFFFF - 8)) == 0) {
+						objOop1 = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinApplication1, objOop1);
+					}
+					mixinApplication1 = objOop1;
 				}
 				mixinApplication = mixinApplication1;
 				/* begin classTagForClass: */
@@ -16334,6 +16349,7 @@
     CogMethod *newCogMethod;
     sqInt newHash;
     sqInt objOop;
+    sqInt objOop1;
     sqInt tagBits;
     sqInt top;
     sqInt top1;
@@ -16379,19 +16395,25 @@
 	mixinApplication1 = aBehavior;
 	while (!((mixinApplication1 == GIV(nilObj))
 	 || ((mixinApplication1 == mClassMixin)
-	 || (((mixin = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << 2)))) == mClassMixin)))) {
-		mixinApplication1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+	 || (((mixin = followObjFieldofObject(MixinIndex, mixinApplication1))) == mClassMixin)))) {
+		/* begin followObjField:ofObject: */
+		objOop = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+		assert(isNonImmediate(objOop));
+		if (((longAt(objOop)) & (0x3FFFFF - 8)) == 0) {
+			objOop = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinApplication1, objOop);
+		}
+		mixinApplication1 = objOop;
 	}
 	mixinApplication = mixinApplication1;
 	assert((lengthOf(mixinApplication)) > (InstanceSpecificationIndex + 1));
 	/* begin classTagForClass: */
 	/* begin followField:ofObject: */
-	objOop = longAt((mixinApplication + BaseHeaderSize) + (SuperclassIndex << 2));
-	if (((objOop & 3) == 0)
-	 && (((longAt(objOop)) & 0x3FFFFF) == 8)) {
-		objOop = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinApplication, objOop);
+	objOop1 = longAt((mixinApplication + BaseHeaderSize) + (SuperclassIndex << 2));
+	if (((objOop1 & 3) == 0)
+	 && (((longAt(objOop1)) & 0x3FFFFF) == 8)) {
+		objOop1 = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinApplication, objOop1);
 	}
-	classObj = objOop;
+	classObj = objOop1;
 	assert(addressCouldBeClassObj(classObj));
 	/* begin ensureBehaviorHash: */
 	assert(addressCouldBeClassObj(classObj));
@@ -19175,6 +19197,7 @@
     sqInt objOop2;
     sqInt objOop21;
     sqInt objOop3;
+    sqInt objOop31;
     sqInt objOop4;
     sqInt objOop5;
     sqInt tagBits;
@@ -19225,18 +19248,26 @@
 		mixinApplication = aBehavior;
 		while (!((mixinApplication == GIV(nilObj))
 		 || ((mixinApplication == candidateMixin)
-		 || (((mixin = longAt((mixinApplication + BaseHeaderSize) + (MixinIndex << 2)))) == candidateMixin)))) {
-			mixinApplication = longAt((mixinApplication + BaseHeaderSize) + (SuperclassIndex << 2));
+		 || (((mixin = followObjFieldofObject(MixinIndex, mixinApplication))) == candidateMixin)))) {
+			/* begin followObjField:ofObject: */
+			objOop = longAt((mixinApplication + BaseHeaderSize) + (SuperclassIndex << 2));
+			assert(isNonImmediate(objOop));
+			if (((longAt(objOop)) & (0x3FFFFF - 8)) == 0) {
+				objOop = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinApplication, objOop);
+			}
+			mixinApplication = objOop;
 		}
 		candidateMixinApplication = mixinApplication;
-		assert(!((candidateMixinApplication == (nilObject()))));
+		if (candidateMixinApplication == GIV(nilObj)) {
+			return methodReceiver;
+		}
 		/* begin followObjField:ofObject: */
-		objOop = longAt((candidateMixinApplication + BaseHeaderSize) + (MethodDictionaryIndex << 2));
-		assert(isNonImmediate(objOop));
-		if (((longAt(objOop)) & (0x3FFFFF - 8)) == 0) {
-			objOop = fixFollowedFieldofObjectwithInitialValue(MethodDictionaryIndex, candidateMixinApplication, objOop);
+		objOop1 = longAt((candidateMixinApplication + BaseHeaderSize) + (MethodDictionaryIndex << 2));
+		assert(isNonImmediate(objOop1));
+		if (((longAt(objOop1)) & (0x3FFFFF - 8)) == 0) {
+			objOop1 = fixFollowedFieldofObjectwithInitialValue(MethodDictionaryIndex, candidateMixinApplication, objOop1);
 		}
-		dictionary = objOop;
+		dictionary = objOop1;
 		/* begin lookupMethodInDictionary: */
 		/* begin numSlotsOf: */
 		flag("endianness");
@@ -19323,12 +19354,12 @@
 				}
 				methodArray = objOop21;
 				/* begin followField:ofObject: */
-				objOop3 = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << 2));
-				if (((objOop3 & 3) == 0)
-				 && (((longAt(objOop3)) & 0x3FFFFF) == 8)) {
-					objOop3 = fixFollowedFieldofObjectwithInitialValue(index - SelectorStart, methodArray, objOop3);
+				objOop31 = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << 2));
+				if (((objOop31 & 3) == 0)
+				 && (((longAt(objOop31)) & 0x3FFFFF) == 8)) {
+					objOop31 = fixFollowedFieldofObjectwithInitialValue(index - SelectorStart, methodArray, objOop31);
 				}
-				GIV(newMethod) = ((sqInt) objOop3);
+				GIV(newMethod) = ((sqInt) objOop31);
 				found = 1;
 				goto l2;
 			}
@@ -19348,20 +19379,20 @@
 			return candidateReceiver;
 		}
 		/* begin followObjField:ofObject: */
-		objOop1 = longAt((candidateMixin + BaseHeaderSize) + (EnclosingMixinIndex << 2));
-		assert(isNonImmediate(objOop1));
-		if (((longAt(objOop1)) & (0x3FFFFF - 8)) == 0) {
-			objOop1 = fixFollowedFieldofObjectwithInitialValue(EnclosingMixinIndex, candidateMixin, objOop1);
+		objOop2 = longAt((candidateMixin + BaseHeaderSize) + (EnclosingMixinIndex << 2));
+		assert(isNonImmediate(objOop2));
+		if (((longAt(objOop2)) & (0x3FFFFF - 8)) == 0) {
+			objOop2 = fixFollowedFieldofObjectwithInitialValue(EnclosingMixinIndex, candidateMixin, objOop2);
 		}
-		candidateMixin = objOop1;
+		candidateMixin = objOop2;
 		if (candidateMixin == GIV(nilObj)) break;
 		/* begin followObjField:ofObject: */
-		objOop2 = longAt((candidateMixinApplication + BaseHeaderSize) + (EnclosingObjectIndex << 2));
-		assert(isNonImmediate(objOop2));
-		if (((longAt(objOop2)) & (0x3FFFFF - 8)) == 0) {
-			objOop2 = fixFollowedFieldofObjectwithInitialValue(EnclosingObjectIndex, candidateMixinApplication, objOop2);
+		objOop3 = longAt((candidateMixinApplication + BaseHeaderSize) + (EnclosingObjectIndex << 2));
+		assert(isNonImmediate(objOop3));
+		if (((longAt(objOop3)) & (0x3FFFFF - 8)) == 0) {
+			objOop3 = fixFollowedFieldofObjectwithInitialValue(EnclosingObjectIndex, candidateMixinApplication, objOop3);
 		}
-		candidateReceiver = objOop2;
+		candidateReceiver = objOop3;
 	}
 	return methodReceiver;
 }
@@ -43518,9 +43549,13 @@
 	treeNode = GIV(freeLists)[0];
 	assert(treeNode != 0);
 	while(1) {
+
+		/* check for overlap; could write this as self oop: (self objectAfter: freeChunk) isLessThanOrEqualTo: child...
+		   but that relies on headers being correct, etc.  So keep it clumsy... */
+
 		bytesInNode = bytesInObject(treeNode);
-		assert((oopisLessThanOrEqualTo(freeTree + bytesInArg, treeNode))
-		 || (oopisGreaterThanOrEqualTo(freeTree, treeNode + bytesInNode)));
+		assert((oopisLessThanOrEqualTo((freeTree + bytesInArg) - BaseHeaderSize, treeNode))
+		 || (oopisGreaterThanOrEqualTo(freeTree, (treeNode + bytesInNode) - BaseHeaderSize)));
 		assert(bytesInNode >= ((numFreeLists()) * (allocationUnit())));
 		assert(bytesInArg != bytesInNode);
 		if (bytesInNode > bytesInArg) {
@@ -49218,6 +49253,24 @@
 }
 
 
+/*	Make sure the obj at fieldIndex in anObject is not forwarded (follow the
+	forwarder there-in if so). Answer the (possibly followed) obj at
+	fieldIndex.  */
+
+static sqInt
+followObjFieldofObject(sqInt fieldIndex, sqInt anObject)
+{
+    sqInt objOop;
+
+	objOop = longAt((anObject + BaseHeaderSize) + (fieldIndex << 2));
+	assert(isNonImmediate(objOop));
+	if (((longAt(objOop)) & (0x3FFFFF - 8)) == 0) {
+		objOop = fixFollowedFieldofObjectwithInitialValue(fieldIndex, anObject, objOop);
+	}
+	return objOop;
+}
+
+
 /*	0 = 0 sized objects (UndefinedObject True False et al)
 	1 = non-indexable objects with inst vars (Point et al)
 	2 = indexable objects with no inst vars (Array et al)
@@ -64931,6 +64984,7 @@
     sqInt mixinApplication1;
     sqInt objOop;
     sqInt objOop1;
+    sqInt objOop2;
     sqInt tagBits;
     sqInt targetMixin;
 
@@ -64972,8 +65026,14 @@
 		mixinApplication1 = aBehavior;
 		while (!((mixinApplication1 == GIV(nilObj))
 		 || ((mixinApplication1 == targetMixin)
-		 || (((mixin = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << 2)))) == targetMixin)))) {
-			mixinApplication1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+		 || (((mixin = followObjFieldofObject(MixinIndex, mixinApplication1))) == targetMixin)))) {
+			/* begin followObjField:ofObject: */
+			objOop2 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+			assert(isNonImmediate(objOop2));
+			if (((longAt(objOop2)) & (0x3FFFFF - 8)) == 0) {
+				objOop2 = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinApplication1, objOop2);
+			}
+			mixinApplication1 = objOop2;
 		}
 		mixinApplication = mixinApplication1;
 		assert(!((mixinApplication == (nilObject()))));

Modified: branches/Cog/nsspursrc/vm/cointerp.h
===================================================================
--- branches/Cog/nsspursrc/vm/cointerp.h	2014-11-04 05:35:18 UTC (rev 3123)
+++ branches/Cog/nsspursrc/vm/cointerp.h	2014-11-04 22:36:20 UTC (rev 3124)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e
  */
 
 

Modified: branches/Cog/nsspursrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nsspursrc/vm/gcc3x-cointerp.c	2014-11-04 05:35:18 UTC (rev 3123)
+++ branches/Cog/nsspursrc/vm/gcc3x-cointerp.c	2014-11-04 22:36:20 UTC (rev 3124)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e
    from
-	CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
+	CoInterpreter VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -975,6 +975,7 @@
 static sqInt followForwardedInObjStackatIndex(sqInt objStack, sqInt objStackRootIndex) NoDbgRegParms;
 sqInt followForwardedObjectFieldstoDepth(sqInt objOop, sqInt depth);
 sqInt followForwarded(sqInt objOop);
+static sqInt followObjFieldofObject(sqInt fieldIndex, sqInt anObject) NoDbgRegParms;
 sqInt formatMask(void);
 sqInt formatOfClass(sqInt classPointer);
 static sqInt formatOf(sqInt objOop) NoDbgRegParms;
@@ -2338,7 +2339,7 @@
 /*540*/	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
 /*560*/	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0,-1,-1
 	};
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.921";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.922";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -5718,6 +5719,7 @@
 				sqInt mixinApplication1;
 				sqInt newHash;
 				sqInt objOop;
+				sqInt objOop1;
 				sqInt rcvr;
 				sqInt tagBits;
 
@@ -5762,8 +5764,14 @@
 				mixinApplication1 = aBehavior;
 				while (!((mixinApplication1 == GIV(nilObj))
 				 || ((mixinApplication1 == mClassMixin)
-				 || (((mixin = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << 2)))) == mClassMixin)))) {
-					mixinApplication1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+				 || (((mixin = followObjFieldofObject(MixinIndex, mixinApplication1))) == mClassMixin)))) {
+					/* begin followObjField:ofObject: */
+					objOop1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+					assert(isNonImmediate(objOop1));
+					if (((longAt(objOop1)) & (0x3FFFFF - 8)) == 0) {
+						objOop1 = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinApplication1, objOop1);
+					}
+					mixinApplication1 = objOop1;
 				}
 				mixinApplication = mixinApplication1;
 				/* begin classTagForClass: */
@@ -14624,6 +14632,7 @@
 				sqInt mixinApplication1;
 				sqInt newHash;
 				sqInt objOop;
+				sqInt objOop1;
 				sqInt oop;
 				sqInt tagBits;
 
@@ -14680,8 +14689,14 @@
 				mixinApplication1 = aBehavior;
 				while (!((mixinApplication1 == GIV(nilObj))
 				 || ((mixinApplication1 == mClassMixin)
-				 || (((mixin = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << 2)))) == mClassMixin)))) {
-					mixinApplication1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+				 || (((mixin = followObjFieldofObject(MixinIndex, mixinApplication1))) == mClassMixin)))) {
+					/* begin followObjField:ofObject: */
+					objOop1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+					assert(isNonImmediate(objOop1));
+					if (((longAt(objOop1)) & (0x3FFFFF - 8)) == 0) {
+						objOop1 = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinApplication1, objOop1);
+					}
+					mixinApplication1 = objOop1;
 				}
 				mixinApplication = mixinApplication1;
 				/* begin classTagForClass: */
@@ -16343,6 +16358,7 @@
     CogMethod *newCogMethod;
     sqInt newHash;
     sqInt objOop;
+    sqInt objOop1;
     sqInt tagBits;
     sqInt top;
     sqInt top1;
@@ -16388,19 +16404,25 @@
 	mixinApplication1 = aBehavior;
 	while (!((mixinApplication1 == GIV(nilObj))
 	 || ((mixinApplication1 == mClassMixin)
-	 || (((mixin = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << 2)))) == mClassMixin)))) {
-		mixinApplication1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+	 || (((mixin = followObjFieldofObject(MixinIndex, mixinApplication1))) == mClassMixin)))) {
+		/* begin followObjField:ofObject: */
+		objOop = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+		assert(isNonImmediate(objOop));
+		if (((longAt(objOop)) & (0x3FFFFF - 8)) == 0) {
+			objOop = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinApplication1, objOop);
+		}
+		mixinApplication1 = objOop;
 	}
 	mixinApplication = mixinApplication1;
 	assert((lengthOf(mixinApplication)) > (InstanceSpecificationIndex + 1));
 	/* begin classTagForClass: */
 	/* begin followField:ofObject: */
-	objOop = longAt((mixinApplication + BaseHeaderSize) + (SuperclassIndex << 2));
-	if (((objOop & 3) == 0)
-	 && (((longAt(objOop)) & 0x3FFFFF) == 8)) {
-		objOop = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinApplication, objOop);
+	objOop1 = longAt((mixinApplication + BaseHeaderSize) + (SuperclassIndex << 2));
+	if (((objOop1 & 3) == 0)
+	 && (((longAt(objOop1)) & 0x3FFFFF) == 8)) {
+		objOop1 = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinApplication, objOop1);
 	}
-	classObj = objOop;
+	classObj = objOop1;
 	assert(addressCouldBeClassObj(classObj));
 	/* begin ensureBehaviorHash: */
 	assert(addressCouldBeClassObj(classObj));
@@ -19184,6 +19206,7 @@
     sqInt objOop2;
     sqInt objOop21;
     sqInt objOop3;
+    sqInt objOop31;
     sqInt objOop4;
     sqInt objOop5;
     sqInt tagBits;
@@ -19234,18 +19257,26 @@
 		mixinApplication = aBehavior;
 		while (!((mixinApplication == GIV(nilObj))
 		 || ((mixinApplication == candidateMixin)
-		 || (((mixin = longAt((mixinApplication + BaseHeaderSize) + (MixinIndex << 2)))) == candidateMixin)))) {
-			mixinApplication = longAt((mixinApplication + BaseHeaderSize) + (SuperclassIndex << 2));
+		 || (((mixin = followObjFieldofObject(MixinIndex, mixinApplication))) == candidateMixin)))) {
+			/* begin followObjField:ofObject: */
+			objOop = longAt((mixinApplication + BaseHeaderSize) + (SuperclassIndex << 2));
+			assert(isNonImmediate(objOop));
+			if (((longAt(objOop)) & (0x3FFFFF - 8)) == 0) {
+				objOop = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinApplication, objOop);
+			}
+			mixinApplication = objOop;
 		}
 		candidateMixinApplication = mixinApplication;
-		assert(!((candidateMixinApplication == (nilObject()))));
+		if (candidateMixinApplication == GIV(nilObj)) {
+			return methodReceiver;
+		}
 		/* begin followObjField:ofObject: */
-		objOop = longAt((candidateMixinApplication + BaseHeaderSize) + (MethodDictionaryIndex << 2));
-		assert(isNonImmediate(objOop));
-		if (((longAt(objOop)) & (0x3FFFFF - 8)) == 0) {
-			objOop = fixFollowedFieldofObjectwithInitialValue(MethodDictionaryIndex, candidateMixinApplication, objOop);
+		objOop1 = longAt((candidateMixinApplication + BaseHeaderSize) + (MethodDictionaryIndex << 2));
+		assert(isNonImmediate(objOop1));
+		if (((longAt(objOop1)) & (0x3FFFFF - 8)) == 0) {
+			objOop1 = fixFollowedFieldofObjectwithInitialValue(MethodDictionaryIndex, candidateMixinApplication, objOop1);
 		}
-		dictionary = objOop;
+		dictionary = objOop1;
 		/* begin lookupMethodInDictionary: */
 		/* begin numSlotsOf: */
 		flag("endianness");
@@ -19332,12 +19363,12 @@
 				}
 				methodArray = objOop21;
 				/* begin followField:ofObject: */
-				objOop3 = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << 2));
-				if (((objOop3 & 3) == 0)
-				 && (((longAt(objOop3)) & 0x3FFFFF) == 8)) {
-					objOop3 = fixFollowedFieldofObjectwithInitialValue(index - SelectorStart, methodArray, objOop3);
+				objOop31 = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << 2));
+				if (((objOop31 & 3) == 0)
+				 && (((longAt(objOop31)) & 0x3FFFFF) == 8)) {
+					objOop31 = fixFollowedFieldofObjectwithInitialValue(index - SelectorStart, methodArray, objOop31);
 				}
-				GIV(newMethod) = ((sqInt) objOop3);
+				GIV(newMethod) = ((sqInt) objOop31);
 				found = 1;
 				goto l2;
 			}
@@ -19357,20 +19388,20 @@
 			return candidateReceiver;
 		}
 		/* begin followObjField:ofObject: */
-		objOop1 = longAt((candidateMixin + BaseHeaderSize) + (EnclosingMixinIndex << 2));
-		assert(isNonImmediate(objOop1));
-		if (((longAt(objOop1)) & (0x3FFFFF - 8)) == 0) {
-			objOop1 = fixFollowedFieldofObjectwithInitialValue(EnclosingMixinIndex, candidateMixin, objOop1);
+		objOop2 = longAt((candidateMixin + BaseHeaderSize) + (EnclosingMixinIndex << 2));
+		assert(isNonImmediate(objOop2));
+		if (((longAt(objOop2)) & (0x3FFFFF - 8)) == 0) {
+			objOop2 = fixFollowedFieldofObjectwithInitialValue(EnclosingMixinIndex, candidateMixin, objOop2);
 		}
-		candidateMixin = objOop1;
+		candidateMixin = objOop2;
 		if (candidateMixin == GIV(nilObj)) break;
 		/* begin followObjField:ofObject: */
-		objOop2 = longAt((candidateMixinApplication + BaseHeaderSize) + (EnclosingObjectIndex << 2));
-		assert(isNonImmediate(objOop2));
-		if (((longAt(objOop2)) & (0x3FFFFF - 8)) == 0) {
-			objOop2 = fixFollowedFieldofObjectwithInitialValue(EnclosingObjectIndex, candidateMixinApplication, objOop2);
+		objOop3 = longAt((candidateMixinApplication + BaseHeaderSize) + (EnclosingObjectIndex << 2));
+		assert(isNonImmediate(objOop3));
+		if (((longAt(objOop3)) & (0x3FFFFF - 8)) == 0) {
+			objOop3 = fixFollowedFieldofObjectwithInitialValue(EnclosingObjectIndex, candidateMixinApplication, objOop3);
 		}
-		candidateReceiver = objOop2;
+		candidateReceiver = objOop3;
 	}
 	return methodReceiver;
 }
@@ -43527,9 +43558,13 @@
 	treeNode = GIV(freeLists)[0];
 	assert(treeNode != 0);
 	while(1) {
+
+		/* check for overlap; could write this as self oop: (self objectAfter: freeChunk) isLessThanOrEqualTo: child...
+		   but that relies on headers being correct, etc.  So keep it clumsy... */
+
 		bytesInNode = bytesInObject(treeNode);
-		assert((oopisLessThanOrEqualTo(freeTree + bytesInArg, treeNode))
-		 || (oopisGreaterThanOrEqualTo(freeTree, treeNode + bytesInNode)));
+		assert((oopisLessThanOrEqualTo((freeTree + bytesInArg) - BaseHeaderSize, treeNode))
+		 || (oopisGreaterThanOrEqualTo(freeTree, (treeNode + bytesInNode) - BaseHeaderSize)));
 		assert(bytesInNode >= ((numFreeLists()) * (allocationUnit())));
 		assert(bytesInArg != bytesInNode);
 		if (bytesInNode > bytesInArg) {
@@ -49227,6 +49262,24 @@
 }
 
 
+/*	Make sure the obj at fieldIndex in anObject is not forwarded (follow the
+	forwarder there-in if so). Answer the (possibly followed) obj at
+	fieldIndex.  */
+
+static sqInt
+followObjFieldofObject(sqInt fieldIndex, sqInt anObject)
+{
+    sqInt objOop;
+
+	objOop = longAt((anObject + BaseHeaderSize) + (fieldIndex << 2));
+	assert(isNonImmediate(objOop));
+	if (((longAt(objOop)) & (0x3FFFFF - 8)) == 0) {
+		objOop = fixFollowedFieldofObjectwithInitialValue(fieldIndex, anObject, objOop);
+	}
+	return objOop;
+}
+
+
 /*	0 = 0 sized objects (UndefinedObject True False et al)
 	1 = non-indexable objects with inst vars (Point et al)
 	2 = indexable objects with no inst vars (Array et al)
@@ -64940,6 +64993,7 @@
     sqInt mixinApplication1;
     sqInt objOop;
     sqInt objOop1;
+    sqInt objOop2;
     sqInt tagBits;
     sqInt targetMixin;
 
@@ -64981,8 +65035,14 @@
 		mixinApplication1 = aBehavior;
 		while (!((mixinApplication1 == GIV(nilObj))
 		 || ((mixinApplication1 == targetMixin)
-		 || (((mixin = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << 2)))) == targetMixin)))) {
-			mixinApplication1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+		 || (((mixin = followObjFieldofObject(MixinIndex, mixinApplication1))) == targetMixin)))) {
+			/* begin followObjField:ofObject: */
+			objOop2 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+			assert(isNonImmediate(objOop2));
+			if (((longAt(objOop2)) & (0x3FFFFF - 8)) == 0) {
+				objOop2 = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinApplication1, objOop2);
+			}
+			mixinApplication1 = objOop2;
 		}
 		mixinApplication = mixinApplication1;
 		assert(!((mixinApplication == (nilObject()))));

Modified: branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c
===================================================================
--- branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c	2014-11-04 05:35:18 UTC (rev 3123)
+++ branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c	2014-11-04 22:36:20 UTC (rev 3124)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e
    from
-	StackInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
+	StackInterpreter VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e
  */
-static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945 " __DATE__ ;
+static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -722,6 +722,7 @@
 static sqInt followForwardedInObjStackatIndex(sqInt objStack, sqInt objStackRootIndex) NoDbgRegParms;
 sqInt followForwardedObjectFieldstoDepth(sqInt objOop, sqInt depth);
 sqInt followForwarded(sqInt objOop);
+static sqInt followObjFieldofObject(sqInt fieldIndex, sqInt anObject) NoDbgRegParms;
 sqInt formatMask(void);
 sqInt formatOfClass(sqInt classPointer);
 static sqInt formatOf(sqInt objOop) NoDbgRegParms;
@@ -2084,7 +2085,7 @@
  0 };
 char * breakSelector;
 sqInt breakSelectorLength = -1;
-const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.921";
+const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.922";
 volatile int sendTrace;
 sqInt suppressHeartbeatFlag;
 
@@ -5306,6 +5307,7 @@
 				sqInt mixinApplication1;
 				sqInt newHash;
 				sqInt objOop;
+				sqInt objOop1;
 				sqInt rcvr;
 				sqInt tagBits;
 
@@ -5350,8 +5352,14 @@
 				mixinApplication1 = aBehavior;
 				while (!((mixinApplication1 == GIV(nilObj))
 				 || ((mixinApplication1 == mClassMixin)
-				 || (((mixin = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << 2)))) == mClassMixin)))) {
-					mixinApplication1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+				 || (((mixin = followObjFieldofObject(MixinIndex, mixinApplication1))) == mClassMixin)))) {
+					/* begin followObjField:ofObject: */
+					objOop1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+					assert(isNonImmediate(objOop1));
+					if (((longAt(objOop1)) & (0x3FFFFF - 8)) == 0) {
+						objOop1 = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinApplication1, objOop1);
+					}
+					mixinApplication1 = objOop1;
 				}
 				mixinApplication = mixinApplication1;
 				/* begin classTagForClass: */
@@ -13898,6 +13906,7 @@
 				sqInt mixinApplication1;
 				sqInt newHash;
 				sqInt objOop;
+				sqInt objOop1;
 				sqInt oop;
 				sqInt tagBits;
 
@@ -13954,8 +13963,14 @@
 				mixinApplication1 = aBehavior;
 				while (!((mixinApplication1 == GIV(nilObj))
 				 || ((mixinApplication1 == mClassMixin)
-				 || (((mixin = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << 2)))) == mClassMixin)))) {
-					mixinApplication1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+				 || (((mixin = followObjFieldofObject(MixinIndex, mixinApplication1))) == mClassMixin)))) {
+					/* begin followObjField:ofObject: */
+					objOop1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+					assert(isNonImmediate(objOop1));
+					if (((longAt(objOop1)) & (0x3FFFFF - 8)) == 0) {
+						objOop1 = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinApplication1, objOop1);
+					}
+					mixinApplication1 = objOop1;
 				}
 				mixinApplication = mixinApplication1;
 				/* begin classTagForClass: */
@@ -29681,9 +29696,13 @@
 	treeNode = GIV(freeLists)[0];
 	assert(treeNode != 0);
 	while(1) {
+
+		/* check for overlap; could write this as self oop: (self objectAfter: freeChunk) isLessThanOrEqualTo: child...
+		   but that relies on headers being correct, etc.  So keep it clumsy... */
+
 		bytesInNode = bytesInObject(treeNode);
-		assert((oopisLessThanOrEqualTo(freeTree + bytesInArg, treeNode))
-		 || (oopisGreaterThanOrEqualTo(freeTree, treeNode + bytesInNode)));
+		assert((oopisLessThanOrEqualTo((freeTree + bytesInArg) - BaseHeaderSize, treeNode))
+		 || (oopisGreaterThanOrEqualTo(freeTree, (treeNode + bytesInNode) - BaseHeaderSize)));
 		assert(bytesInNode >= ((numFreeLists()) * (allocationUnit())));
 		assert(bytesInArg != bytesInNode);
 		if (bytesInNode > bytesInArg) {
@@ -35404,6 +35423,24 @@
 }
 
 
+/*	Make sure the obj at fieldIndex in anObject is not forwarded (follow the
+	forwarder there-in if so). Answer the (possibly followed) obj at
+	fieldIndex.  */
+
+static sqInt
+followObjFieldofObject(sqInt fieldIndex, sqInt anObject)
+{
+    sqInt objOop;
+
+	objOop = longAt((anObject + BaseHeaderSize) + (fieldIndex << 2));
+	assert(isNonImmediate(objOop));
+	if (((longAt(objOop)) & (0x3FFFFF - 8)) == 0) {
+		objOop = fixFollowedFieldofObjectwithInitialValue(fieldIndex, anObject, objOop);
+	}
+	return objOop;
+}
+
+
 /*	0 = 0 sized objects (UndefinedObject True False et al)
 	1 = non-indexable objects with inst vars (Point et al)
 	2 = indexable objects with no inst vars (Array et al)
@@ -51337,6 +51374,7 @@
     sqInt mixinApplication1;
     sqInt objOop;
     sqInt objOop1;
+    sqInt objOop2;
     sqInt tagBits;
     sqInt targetMixin;
 
@@ -51378,8 +51416,14 @@
 		mixinApplication1 = aBehavior;
 		while (!((mixinApplication1 == GIV(nilObj))
 		 || ((mixinApplication1 == targetMixin)
-		 || (((mixin = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << 2)))) == targetMixin)))) {
-			mixinApplication1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+		 || (((mixin = followObjFieldofObject(MixinIndex, mixinApplication1))) == targetMixin)))) {
+			/* begin followObjField:ofObject: */
+			objOop2 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+			assert(isNonImmediate(objOop2));
+			if (((longAt(objOop2)) & (0x3FFFFF - 8)) == 0) {
+				objOop2 = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinApplication1, objOop2);
+			}
+			mixinApplication1 = objOop2;
 		}
 		mixinApplication = mixinApplication1;
 		assert(!((mixinApplication == (nilObject()))));
@@ -53580,6 +53624,7 @@
     sqInt objOop2;
     sqInt objOop21;
     sqInt objOop3;
+    sqInt objOop31;
     sqInt objOop4;
     sqInt objOop5;
     sqInt tagBits;
@@ -53626,18 +53671,26 @@
 		mixinApplication = aBehavior;
 		while (!((mixinApplication == GIV(nilObj))
 		 || ((mixinApplication == candidateMixin)
-		 || (((mixin = longAt((mixinApplication + BaseHeaderSize) + (MixinIndex << 2)))) == candidateMixin)))) {
-			mixinApplication = longAt((mixinApplication + BaseHeaderSize) + (SuperclassIndex << 2));
+		 || (((mixin = followObjFieldofObject(MixinIndex, mixinApplication))) == candidateMixin)))) {
+			/* begin followObjField:ofObject: */
+			objOop = longAt((mixinApplication + BaseHeaderSize) + (SuperclassIndex << 2));
+			assert(isNonImmediate(objOop));
+			if (((longAt(objOop)) & (0x3FFFFF - 8)) == 0) {
+				objOop = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinApplication, objOop);
+			}
+			mixinApplication = objOop;
 		}
 		candidateMixinApplication = mixinApplication;
-		assert(!((candidateMixinApplication == (nilObject()))));
+		if (candidateMixinApplication == GIV(nilObj)) {
+			return methodReceiver;
+		}
 		/* begin followObjField:ofObject: */
-		objOop = longAt((candidateMixinApplication + BaseHeaderSize) + (MethodDictionaryIndex << 2));
-		assert(isNonImmediate(objOop));
-		if (((longAt(objOop)) & (0x3FFFFF - 8)) == 0) {
-			objOop = fixFollowedFieldofObjectwithInitialValue(MethodDictionaryIndex, candidateMixinApplication, objOop);
+		objOop1 = longAt((candidateMixinApplication + BaseHeaderSize) + (MethodDictionaryIndex << 2));
+		assert(isNonImmediate(objOop1));
+		if (((longAt(objOop1)) & (0x3FFFFF - 8)) == 0) {
+			objOop1 = fixFollowedFieldofObjectwithInitialValue(MethodDictionaryIndex, candidateMixinApplication, objOop1);
 		}
-		dictionary = objOop;
+		dictionary = objOop1;
 		/* begin lookupMethodInDictionary: */
 		/* begin numSlotsOf: */
 		flag("endianness");
@@ -53724,12 +53777,12 @@
 				}
 				methodArray = objOop21;
 				/* begin followField:ofObject: */
-				objOop3 = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << 2));
-				if (((objOop3 & 3) == 0)
-				 && (((longAt(objOop3)) & 0x3FFFFF) == 8)) {
-					objOop3 = fixFollowedFieldofObjectwithInitialValue(index - SelectorStart, methodArray, objOop3);
+				objOop31 = longAt((methodArray + BaseHeaderSize) + ((index - SelectorStart) << 2));
+				if (((objOop31 & 3) == 0)
+				 && (((longAt(objOop31)) & 0x3FFFFF) == 8)) {
+					objOop31 = fixFollowedFieldofObjectwithInitialValue(index - SelectorStart, methodArray, objOop31);
 				}
-				GIV(newMethod) = ((sqInt) objOop3);
+				GIV(newMethod) = ((sqInt) objOop31);
 				found = 1;
 				goto l2;
 			}
@@ -53749,20 +53802,20 @@
 			return candidateReceiver;
 		}
 		/* begin followObjField:ofObject: */
-		objOop1 = longAt((candidateMixin + BaseHeaderSize) + (EnclosingMixinIndex << 2));
-		assert(isNonImmediate(objOop1));
-		if (((longAt(objOop1)) & (0x3FFFFF - 8)) == 0) {
-			objOop1 = fixFollowedFieldofObjectwithInitialValue(EnclosingMixinIndex, candidateMixin, objOop1);
+		objOop2 = longAt((candidateMixin + BaseHeaderSize) + (EnclosingMixinIndex << 2));
+		assert(isNonImmediate(objOop2));
+		if (((longAt(objOop2)) & (0x3FFFFF - 8)) == 0) {
+			objOop2 = fixFollowedFieldofObjectwithInitialValue(EnclosingMixinIndex, candidateMixin, objOop2);
 		}
-		candidateMixin = objOop1;
+		candidateMixin = objOop2;
 		if (candidateMixin == GIV(nilObj)) break;
 		/* begin followObjField:ofObject: */
-		objOop2 = longAt((candidateMixinApplication + BaseHeaderSize) + (EnclosingObjectIndex << 2));
-		assert(isNonImmediate(objOop2));
-		if (((longAt(objOop2)) & (0x3FFFFF - 8)) == 0) {
-			objOop2 = fixFollowedFieldofObjectwithInitialValue(EnclosingObjectIndex, candidateMixinApplication, objOop2);
+		objOop3 = longAt((candidateMixinApplication + BaseHeaderSize) + (EnclosingObjectIndex << 2));
+		assert(isNonImmediate(objOop3));
+		if (((longAt(objOop3)) & (0x3FFFFF - 8)) == 0) {
+			objOop3 = fixFollowedFieldofObjectwithInitialValue(EnclosingObjectIndex, candidateMixinApplication, objOop3);
 		}
-		candidateReceiver = objOop2;
+		candidateReceiver = objOop3;
 	}
 	return methodReceiver;
 }

Modified: branches/Cog/nsspurstacksrc/vm/interp.c
===================================================================
--- branches/Cog/nsspurstacksrc/vm/interp.c	2014-11-04 05:35:18 UTC (rev 3123)
+++ branches/Cog/nsspurstacksrc/vm/interp.c	2014-11-04 22:36:20 UTC (rev 3124)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e
    from
-	StackInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945
+	StackInterpreter VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e
  */
-static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.921 uuid: ab06d6ee-a8c8-47db-80cc-7530c9a4b945 " __DATE__ ;
+static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.922 uuid: 52f1b50e-005d-4035-ad57-953a3790260e " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -719,6 +719,7 @@
 static sqInt followForwardedInObjStackatIndex(sqInt objStack, sqInt objStackRootIndex) NoDbgRegParms;
 sqInt followForwardedObjectFieldstoDepth(sqInt objOop, sqInt depth);
 sqInt followForwarded(sqInt objOop);
+static sqInt followObjFieldofObject(sqInt fieldIndex, sqInt anObject) NoDbgRegParms;
 sqInt formatMask(void);
 sqInt formatOfClass(sqInt classPointer);
 static sqInt formatOf(sqInt objOop) NoDbgRegParms;
@@ -2081,7 +2082,7 @@
  0 };
 char * breakSelector;
 sqInt breakSelectorLength = -1;
-const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.921";
+const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.922";
 volatile int sendTrace;
 sqInt suppressHeartbeatFlag;
 
@@ -5297,6 +5298,7 @@
 				sqInt mixinApplication1;
 				sqInt newHash;
 				sqInt objOop;
+				sqInt objOop1;
 				sqInt rcvr;
 				sqInt tagBits;
 
@@ -5341,8 +5343,14 @@
 				mixinApplication1 = aBehavior;
 				while (!((mixinApplication1 == GIV(nilObj))
 				 || ((mixinApplication1 == mClassMixin)
-				 || (((mixin = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << 2)))) == mClassMixin)))) {
-					mixinApplication1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+				 || (((mixin = followObjFieldofObject(MixinIndex, mixinApplication1))) == mClassMixin)))) {
+					/* begin followObjField:ofObject: */
+					objOop1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+					assert(isNonImmediate(objOop1));
+					if (((longAt(objOop1)) & (0x3FFFFF - 8)) == 0) {
+						objOop1 = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinApplication1, objOop1);
+					}
+					mixinApplication1 = objOop1;
 				}
 				mixinApplication = mixinApplication1;
 				/* begin classTagForClass: */
@@ -13889,6 +13897,7 @@
 				sqInt mixinApplication1;
 				sqInt newHash;
 				sqInt objOop;
+				sqInt objOop1;
 				sqInt oop;
 				sqInt tagBits;
 
@@ -13945,8 +13954,14 @@
 				mixinApplication1 = aBehavior;
 				while (!((mixinApplication1 == GIV(nilObj))
 				 || ((mixinApplication1 == mClassMixin)
-				 || (((mixin = longAt((mixinApplication1 + BaseHeaderSize) + (MixinIndex << 2)))) == mClassMixin)))) {
-					mixinApplication1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+				 || (((mixin = followObjFieldofObject(MixinIndex, mixinApplication1))) == mClassMixin)))) {
+					/* begin followObjField:ofObject: */
+					objOop1 = longAt((mixinApplication1 + BaseHeaderSize) + (SuperclassIndex << 2));
+					assert(isNonImmediate(objOop1));

@@ Diff output truncated at 50000 characters. @@


More information about the Vm-dev mailing list