[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