[Vm-dev] [commit][3105] CogVM source as per VMMaker.oscog-eem.903
commits at squeakvm.org
commits at squeakvm.org
Tue Oct 14 19:54:47 UTC 2014
Revision: 3105
Author: eliot
Date: 2014-10-14 12:54:42 -0700 (Tue, 14 Oct 2014)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.903
Rewrite implicit receiver lookup logic to follow and fix up forwarding pointers.
Fixes occasional failures to locate correct implicit receiver which manifest as
MNUs. And follow in enclosingObjectAt:withObject:withMixin:
Rename hiddenRootsObj: to setHiddenRootsObj: for clang.
Modified Paths:
--------------
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/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
Property Changed:
----------------
branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
Modified: branches/Cog/nsspursrc/vm/cointerp.c
===================================================================
--- branches/Cog/nsspursrc/vm/cointerp.c 2014-10-13 23:35:34 UTC (rev 3104)
+++ branches/Cog/nsspursrc/vm/cointerp.c 2014-10-14 19:54:42 UTC (rev 3105)
@@ -1,9 +1,9 @@
/* Automatically generated by
- CCodeGeneratorGlobalStructure VMMaker.oscog-eem.900 uuid: 3d11cf21-4f5f-406a-85ae-ccbc786612a0
+ CCodeGeneratorGlobalStructure VMMaker.oscog-eem.902 uuid: e97518bb-4f81-470b-9557-6beed90a223c
from
- CoInterpreter VMMaker.oscog-eem.900 uuid: 3d11cf21-4f5f-406a-85ae-ccbc786612a0
+ CoInterpreter VMMaker.oscog-eem.902 uuid: e97518bb-4f81-470b-9557-6beed90a223c
*/
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.900 uuid: 3d11cf21-4f5f-406a-85ae-ccbc786612a0 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.902 uuid: e97518bb-4f81-470b-9557-6beed90a223c " __DATE__ ;
char *__interpBuildInfo = __buildInfo;
@@ -861,7 +861,7 @@
static void addFreeSubTree(sqInt freeTree) NoDbgRegParms;
sqInt addGCRoot(sqInt *varLoc);
sqInt addressCouldBeObj(sqInt address);
-static sqInt addressCouldBeOop(sqInt address) NoDbgRegParms;
+sqInt addressCouldBeOop(sqInt address);
static sqInt addToFreeTreebytes(sqInt freeChunk, sqInt chunkBytes) NoDbgRegParms;
static sqInt allInstancesOf(sqInt aClass) NoDbgRegParms;
static sqInt allObjects(void);
@@ -969,6 +969,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;
@@ -1083,6 +1084,7 @@
static sqInt noCheckClassAtIndex(sqInt classIndex) NoDbgRegParms;
static sqInt noCheckPushonObjStack(sqInt objOop, sqInt objStack) NoDbgRegParms;
static sqInt noFixupFollowFieldofObject(sqInt fieldIndex, sqInt anObject) NoDbgRegParms;
+static sqInt noInlineFollowForwarded(sqInt objOop) NoDbgRegParms;
sqInt nonIndexablePointerFormat(void);
static sqInt noUnscannedEphemerons(void);
sqInt numBytesOf(sqInt objOop);
@@ -1243,6 +1245,7 @@
sqInt fetchIntegerofObject(sqInt fieldIndex, sqInt objectPointer);
static sqInt fetchStackPointerOf(sqInt aContext) NoDbgRegParms;
static sqInt findApplicationOfTargetMixinstartingAtBehavior(sqInt targetMixin, sqInt aBehavior) NoDbgRegParms;
+static sqInt findApplicationOfTargetMixinstartingAtNonMetaClass(sqInt targetMixin, sqInt aClass) NoDbgRegParms;
static sqInt findClassContainingMethodstartingAt(sqInt meth, sqInt classObj) NoDbgRegParms;
sqInt findClassOfMethodforReceiver(sqInt meth, sqInt rcvr);
static char * findFrameAboveinPage(char *theFP, StackPage *thePage) NoDbgRegParms;
@@ -1506,8 +1509,8 @@
_iss usqInt freeStart;
_iss sqInt argumentCount;
_iss usqInt instructionPointer;
+_iss sqInt messageSelector;
_iss usqInt newMethod;
-_iss sqInt messageSelector;
_iss usqInt newSpaceLimit;
_iss StackPage * pages;
_iss sqInt hiddenRootsObj;
@@ -1537,10 +1540,10 @@
_iss StackPage * mostRecentlyUsedPage;
_iss sqInt numStackPages;
_iss SpurNewSpaceSpace pastSpace;
-_iss sqInt classTableFirstPage;
_iss sqInt markStack;
_iss sqInt numClassTablePages;
_iss sqInt profileProcess;
+_iss sqInt classTableFirstPage;
_iss usqInt oldSpaceStart;
_iss SpurNewSpaceSpace futureSpace;
_iss sqInt longRunningPrimitiveCheckSemaphore;
@@ -2322,7 +2325,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.900";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.902";
sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
volatile int sendTrace;
@@ -15044,13 +15047,14 @@
/* frameless method; nothing to activate... */
-
- /* dont use and: so as to get Slang to inline cogit numRegArgs > 0 */
+ if ((numRegArgs()) > 0) {
- if (((cogMethod->cmNumArgs)) <= (numRegArgs())) {
- callRegisterArgCogMethodatreceiver(cogMethod, noCheckEntryOffset(), rcvr);
+ /* dont use and: so as to get Slang to inline cogit numRegArgs > 0 */
+
+ if (((cogMethod->cmNumArgs)) <= (numRegArgs())) {
+ callRegisterArgCogMethodatreceiver(cogMethod, noCheckEntryOffset(), rcvr);
+ }
}
-
/* begin push: */
object = (((sqInt)cogMethod)) + (noCheckEntryOffset());
longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
@@ -18031,13 +18035,14 @@
assertCStackWellAligned();
assert(isMachineCodeFrame(GIV(framePointer)));
assertValidExecutionPointersimbarline(longAt(GIV(stackPointer)), GIV(framePointer), GIV(stackPointer), 0, __LINE__);
-
- /* dont use and: so as to get Slang to inline cogit numRegArgs > 0 */
+ if ((numRegArgs()) > 0) {
- if (((cogMethod->cmNumArgs)) <= (numRegArgs())) {
- callRegisterArgCogMethodatreceiver(cogMethod, entryOffset(), rcvr);
+ /* dont use and: so as to get Slang to inline cogit numRegArgs > 0 */
+
+ if (((cogMethod->cmNumArgs)) <= (numRegArgs())) {
+ callRegisterArgCogMethodatreceiver(cogMethod, entryOffset(), rcvr);
+ }
}
-
/* begin push: */
object = (((sqInt)cogMethod)) + (entryOffset());
longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
@@ -18074,31 +18079,32 @@
object = (((sqInt)cogMethod)) + (entryOffset());
longAtput((sp1 = GIV(stackPointer) - BytesPerWord), object);
GIV(stackPointer) = sp1;
-
- /* dont use and: so as to get Slang to inline cogit numRegArgs > 0 */
+ if ((numRegArgs()) > 0) {
- if (((cogMethod->cmNumArgs)) <= (numRegArgs())) {
- /* begin push: */
- longAtput((sp = GIV(stackPointer) - BytesPerWord), cacheTag);
- GIV(stackPointer) = sp;
-
- switch ((cogMethod->cmNumArgs)) {
- case 0:
- ceCall0ArgsPIC();
- break;
- case 1:
- ceCall1ArgsPIC();
- break;
- case 2:
- ceCall2ArgsPIC();
- break;
- default:
- null;
+ /* dont use and: so as to get Slang to inline cogit numRegArgs > 0 */
+ if (((cogMethod->cmNumArgs)) <= (numRegArgs())) {
+ /* begin push: */
+ longAtput((sp = GIV(stackPointer) - BytesPerWord), cacheTag);
+ GIV(stackPointer) = sp;
+
+ switch ((cogMethod->cmNumArgs)) {
+ case 0:
+ ceCall0ArgsPIC();
+ break;
+ case 1:
+ ceCall1ArgsPIC();
+ break;
+ case 2:
+ ceCall2ArgsPIC();
+ break;
+ default:
+ null;
+
+ }
+ error("not reached");
}
- error("not reached");
}
-
/* begin push: */
longAtput((sp2 = GIV(stackPointer) - BytesPerWord), rcvr);
GIV(stackPointer) = sp2;
@@ -18128,13 +18134,14 @@
assertCStackWellAligned();
assert(isMachineCodeFrame(GIV(framePointer)));
assertValidExecutionPointersimbarline(longAt(GIV(stackPointer)), GIV(framePointer), GIV(stackPointer), 0, __LINE__);
-
- /* dont use and: so as to get Slang to inline cogit numRegArgs > 0 */
+ if ((numRegArgs()) > 0) {
- if (((cogMethod->cmNumArgs)) <= (numRegArgs())) {
- callRegisterArgCogMethodatreceiver(cogMethod, noCheckEntryOffset(), rcvr);
+ /* dont use and: so as to get Slang to inline cogit numRegArgs > 0 */
+
+ if (((cogMethod->cmNumArgs)) <= (numRegArgs())) {
+ callRegisterArgCogMethodatreceiver(cogMethod, noCheckEntryOffset(), rcvr);
+ }
}
-
/* begin push: */
object = (((sqInt)cogMethod)) + (noCheckEntryOffset());
longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
@@ -19024,9 +19031,7 @@
sqInt
implicitReceiverFormixinimplementing(sqInt rcvr, sqInt mixin, sqInt selector)
{ DECL_MAYBE_SQ_GLOBAL_STRUCT
- sqInt aClass;
- sqInt classIndex;
- sqInt classTablePage;
+ sqInt anObject;
sqInt dictionary;
sqInt dictionary1;
sqInt found;
@@ -19043,9 +19048,9 @@
sqInt mask1;
sqInt methodArray;
sqInt methodArray1;
+ sqInt mixin1;
sqInt mixinApplication;
sqInt mixinApplication1;
- sqInt mixinOrMixinApplication;
sqInt nextSelector;
sqInt nextSelector1;
usqInt numSlots;
@@ -19056,13 +19061,16 @@
sqInt objOop12;
sqInt objOop2;
sqInt objOop21;
+ sqInt objOop22;
sqInt objOop3;
sqInt objOop31;
+ sqInt objOop32;
sqInt objOop4;
- sqInt objOop41;
sqInt objOop5;
sqInt objOop6;
- sqInt tagBits;
+ sqInt objOop7;
+ sqInt objOop8;
+ sqInt objOop9;
sqInt targetMixin;
sqInt theMixin;
sqInt theMixin1;
@@ -19073,21 +19081,23 @@
/* begin sendBreakpoint:receiver: */
sendBreakpointreceiver(firstFixedFieldOfMaybeImmediate(selector), lengthOfMaybeImmediate(selector), null);
}
-
- /* messageSelector is an implicit parameter of lookupMethodInDictionary: */
-
- GIV(messageSelector) = selector;
+ assert(!((isOopForwarded(rcvr))));
+ assert(!((isForwarded(mixin))));
+ GIV(messageSelector) = (((selector & 3) == 0)
+ && (((longAt(selector)) & 0x3FFFFF) == 8)
+ ? noInlineFollowForwarded(selector)
+ : selector);
mixinApplication = findApplicationOfTargetMixinstartingAtBehavior(mixin, fetchClassOf(rcvr));
if (mixinApplication == GIV(nilObj)) {
return rcvr;
}
/* begin followObjField:ofObject: */
- objOop = longAt((mixinApplication + (BaseHeaderSize)) + (MethodDictionaryIndex << 2));
- assert(isNonImmediate(objOop));
- if (((longAt(objOop)) & (0x3FFFFF - 8)) == 0) {
- objOop = fixFollowedFieldofObjectwithInitialValue(MethodDictionaryIndex, mixinApplication, objOop);
+ objOop7 = longAt((mixinApplication + (BaseHeaderSize)) + (MethodDictionaryIndex << 2));
+ assert(isNonImmediate(objOop7));
+ if (((longAt(objOop7)) & (0x3FFFFF - 8)) == 0) {
+ objOop7 = fixFollowedFieldofObjectwithInitialValue(MethodDictionaryIndex, mixinApplication, objOop7);
}
- dictionary = objOop;
+ dictionary = objOop7;
/* begin lookupMethodInDictionary: */
/* begin numSlotsOf: */
flag("endianness");
@@ -19113,12 +19123,12 @@
}
if (nextSelector1 == GIV(messageSelector)) {
/* begin followObjField:ofObject: */
- objOop6 = longAt((dictionary + (BaseHeaderSize)) + (MethodArrayIndex << 2));
- assert(isNonImmediate(objOop6));
- if (((longAt(objOop6)) & (0x3FFFFF - 8)) == 0) {
- objOop6 = fixFollowedFieldofObjectwithInitialValue(MethodArrayIndex, dictionary, objOop6);
+ objOop9 = longAt((dictionary + (BaseHeaderSize)) + (MethodArrayIndex << 2));
+ assert(isNonImmediate(objOop9));
+ if (((longAt(objOop9)) & (0x3FFFFF - 8)) == 0) {
+ objOop9 = fixFollowedFieldofObjectwithInitialValue(MethodArrayIndex, dictionary, objOop9);
}
- methodArray1 = objOop6;
+ methodArray1 = objOop9;
/* begin followField:ofObject: */
objOop12 = longAt((methodArray1 + (BaseHeaderSize)) + (index1 << 2));
if (((objOop12 & 3) == 0)
@@ -19127,12 +19137,12 @@
}
GIV(newMethod) = ((sqInt) objOop12);
found = 1;
- goto l4;
+ goto l3;
}
index1 += 1;
}
found = 0;
- goto l4;
+ goto l3;
}
/* It is assumed that there are some nils in this dictionary, and search will
@@ -19144,14 +19154,13 @@
? (GIV(messageSelector) >> 1)
: ((usqInt) (((usqInt)GIV(messageSelector)))) >> 2)
: (/* begin hashBitsOf: */
- (objOop41 = GIV(messageSelector)),
- (hash1 = (longAt(objOop41 + 4)) & 0x3FFFFF),
+ (hash1 = (longAt(GIV(messageSelector) + 4)) & 0x3FFFFF),
(hash1 == 0
? ((hash1 = (newObjectHash()) & 0x3FFFFF),
/* begin setHashBitsOf:to: */
flag("endianness"),
assert(((hash1 >= 0) && (hash1 <= (identityHashHalfWordMask())))),
- longAtput(objOop41 + 4, ((((longAt(objOop41 + 4)) | 0x3FFFFF) - 0x3FFFFF)) + hash1))
+ longAtput(GIV(messageSelector) + 4, ((((longAt(GIV(messageSelector) + 4)) | 0x3FFFFF) - 0x3FFFFF)) + hash1))
: 0),
hash1))));
wrapAround1 = 0;
@@ -19159,7 +19168,7 @@
nextSelector1 = longAt((dictionary + (BaseHeaderSize)) + (index1 << 2));
if (nextSelector1 == GIV(nilObj)) {
found = 0;
- goto l4;
+ goto l3;
}
if (((nextSelector1 & 3) == 0)
&& (((longAt(nextSelector1)) & 0x3FFFFF) == 8)) {
@@ -19167,39 +19176,61 @@
}
if (nextSelector1 == GIV(messageSelector)) {
/* begin followObjField:ofObject: */
- objOop21 = longAt((dictionary + (BaseHeaderSize)) + (MethodArrayIndex << 2));
- assert(isNonImmediate(objOop21));
- if (((longAt(objOop21)) & (0x3FFFFF - 8)) == 0) {
- objOop21 = fixFollowedFieldofObjectwithInitialValue(MethodArrayIndex, dictionary, objOop21);
+ objOop22 = longAt((dictionary + (BaseHeaderSize)) + (MethodArrayIndex << 2));
+ assert(isNonImmediate(objOop22));
+ if (((longAt(objOop22)) & (0x3FFFFF - 8)) == 0) {
+ objOop22 = fixFollowedFieldofObjectwithInitialValue(MethodArrayIndex, dictionary, objOop22);
}
- methodArray1 = objOop21;
+ methodArray1 = objOop22;
/* begin followField:ofObject: */
- objOop31 = longAt((methodArray1 + (BaseHeaderSize)) + ((index1 - SelectorStart) << 2));
- if (((objOop31 & 3) == 0)
- && (((longAt(objOop31)) & 0x3FFFFF) == 8)) {
- objOop31 = fixFollowedFieldofObjectwithInitialValue(index1 - SelectorStart, methodArray1, objOop31);
+ objOop32 = longAt((methodArray1 + (BaseHeaderSize)) + ((index1 - SelectorStart) << 2));
+ if (((objOop32 & 3) == 0)
+ && (((longAt(objOop32)) & 0x3FFFFF) == 8)) {
+ objOop32 = fixFollowedFieldofObjectwithInitialValue(index1 - SelectorStart, methodArray1, objOop32);
}
- GIV(newMethod) = ((sqInt) objOop31);
+ GIV(newMethod) = ((sqInt) objOop32);
found = 1;
- goto l4;
+ goto l3;
}
index1 += 1;
if (index1 == length1) {
if (wrapAround1) {
found = 0;
- goto l4;
+ goto l3;
}
wrapAround1 = 1;
index1 = SelectorStart;
}
}
found = 0;
-l4: /* end lookupMethodInDictionary: */;
+l3: /* end lookupMethodInDictionary: */;
if (!found) {
- theMixin = longAt((mixinApplication + (BaseHeaderSize)) + (MixinIndex << 2));
+ /* begin followObjField:ofObject: */
+ objOop4 = longAt((mixinApplication + (BaseHeaderSize)) + (MixinIndex << 2));
+ assert(isNonImmediate(objOop4));
+ if (((longAt(objOop4)) & (0x3FFFFF - 8)) == 0) {
+ objOop4 = fixFollowedFieldofObjectwithInitialValue(MixinIndex, mixinApplication, objOop4);
+ }
+ theMixin = objOop4;
/* begin nextImplicitReceiverFor:withMixin: */
- implicitReceiver = longAt((mixinApplication + (BaseHeaderSize)) + (EnclosingObjectIndex << 2));
- targetMixin = longAt((theMixin + (BaseHeaderSize)) + (EnclosingMixinIndex << 2));
+ /* begin followObjField:ofObject: */
+ objOop5 = longAt((mixinApplication + (BaseHeaderSize)) + (EnclosingObjectIndex << 2));
+ assert(isNonImmediate(objOop5));
+ if (((longAt(objOop5)) & (0x3FFFFF - 8)) == 0) {
+ objOop5 = fixFollowedFieldofObjectwithInitialValue(EnclosingObjectIndex, mixinApplication, objOop5);
+ }
+ anObject = objOop5;
+ /* begin followObjField:ofObject: */
+ objOop6 = longAt((theMixin + (BaseHeaderSize)) + (EnclosingMixinIndex << 2));
+ assert(isNonImmediate(objOop6));
+ if (((longAt(objOop6)) & (0x3FFFFF - 8)) == 0) {
+ objOop6 = fixFollowedFieldofObjectwithInitialValue(EnclosingMixinIndex, theMixin, objOop6);
+ }
+ mixin1 = objOop6;
+ assert(!((isOopForwarded(anObject))));
+ assert(!((isForwarded(mixin1))));
+ implicitReceiver = anObject;
+ targetMixin = mixin1;
while (1) {
if (targetMixin == GIV(nilObj)) {
@@ -19208,53 +19239,18 @@
implicitReceiverOrNil = GIV(nilObj);
goto l1;
}
- /* begin findApplicationOfTargetMixin:startingAtNonMetaClass: */
- /* begin fetchClassOf: */
- if (((tagBits = implicitReceiver & 3)) != 0) {
- aClass = longAt((GIV(classTableFirstPage) + (BaseHeaderSize)) + (tagBits << 2));
- goto l2;
- }
- /* begin fetchClassOfNonImm: */
- classIndex = (longAt(implicitReceiver)) & 0x3FFFFF;
- if (classIndex <= 0x1F) {
- if (classIndex == 0x1F) {
- aClass = implicitReceiver;
- goto l2;
- }
- if (classIndex == 8) {
- aClass = GIV(nilObj);
- goto l2;
- }
- }
- assert(classIndex >= (arrayClassIndexPun()));
- /* begin classOrNilAtIndex: */
- assert((classIndex <= (tagMask()))
- || (classIndex >= (arrayClassIndexPun())));
- classTablePage = longAt((GIV(hiddenRootsObj) + (BaseHeaderSize)) + ((((usqInt) classIndex) >> 10) << 2));
- if (classTablePage == GIV(nilObj)) {
- aClass = GIV(nilObj);
- goto l2;
- }
- aClass = longAt((classTablePage + (BaseHeaderSize)) + ((classIndex & ((1 << 10) - 1)) << 2));
- l2: /* end fetchClassOf: */;
- mixinOrMixinApplication = aClass;
- while (!((mixinOrMixinApplication == GIV(nilObj))
- || ((mixinOrMixinApplication == targetMixin)
- || ((longAt((mixinOrMixinApplication + (BaseHeaderSize)) + (MixinIndex << 2))) == targetMixin)))) {
- mixinOrMixinApplication = longAt((mixinOrMixinApplication + (BaseHeaderSize)) + (SuperclassIndex << 2));
- }
- mixinApplication1 = mixinOrMixinApplication;
+ mixinApplication1 = findApplicationOfTargetMixinstartingAtNonMetaClass(targetMixin, fetchClassOf(implicitReceiver));
if (mixinApplication1 == GIV(nilObj)) {
implicitReceiverOrNil = GIV(nilObj);
goto l1;
}
/* begin followObjField:ofObject: */
- objOop1 = longAt((mixinApplication1 + (BaseHeaderSize)) + (MethodDictionaryIndex << 2));
- assert(isNonImmediate(objOop1));
- if (((longAt(objOop1)) & (0x3FFFFF - 8)) == 0) {
- objOop1 = fixFollowedFieldofObjectwithInitialValue(MethodDictionaryIndex, mixinApplication1, objOop1);
+ objOop = longAt((mixinApplication1 + (BaseHeaderSize)) + (MethodDictionaryIndex << 2));
+ assert(isNonImmediate(objOop));
+ if (((longAt(objOop)) & (0x3FFFFF - 8)) == 0) {
+ objOop = fixFollowedFieldofObjectwithInitialValue(MethodDictionaryIndex, mixinApplication1, objOop);
}
- dictionary1 = objOop1;
+ dictionary1 = objOop;
/* begin lookupMethodInDictionary: */
/* begin numSlotsOf: */
flag("endianness");
@@ -19280,12 +19276,12 @@
}
if (nextSelector == GIV(messageSelector)) {
/* begin followObjField:ofObject: */
- objOop5 = longAt((dictionary1 + (BaseHeaderSize)) + (MethodArrayIndex << 2));
- assert(isNonImmediate(objOop5));
- if (((longAt(objOop5)) & (0x3FFFFF - 8)) == 0) {
- objOop5 = fixFollowedFieldofObjectwithInitialValue(MethodArrayIndex, dictionary1, objOop5);
+ objOop8 = longAt((dictionary1 + (BaseHeaderSize)) + (MethodArrayIndex << 2));
+ assert(isNonImmediate(objOop8));
+ if (((longAt(objOop8)) & (0x3FFFFF - 8)) == 0) {
+ objOop8 = fixFollowedFieldofObjectwithInitialValue(MethodArrayIndex, dictionary1, objOop8);
}
- methodArray = objOop5;
+ methodArray = objOop8;
/* begin followField:ofObject: */
objOop11 = longAt((methodArray + (BaseHeaderSize)) + (index << 2));
if (((objOop11 & 3) == 0)
@@ -19294,12 +19290,12 @@
}
GIV(newMethod) = ((sqInt) objOop11);
found1 = 1;
- goto l3;
+ goto l2;
}
index += 1;
}
found1 = 0;
- goto l3;
+ goto l2;
}
/* It is assumed that there are some nils in this dictionary, and search will
@@ -19311,14 +19307,13 @@
? (GIV(messageSelector) >> 1)
: ((usqInt) (((usqInt)GIV(messageSelector)))) >> 2)
: (/* begin hashBitsOf: */
- (objOop4 = GIV(messageSelector)),
- (hash = (longAt(objOop4 + 4)) & 0x3FFFFF),
+ (hash = (longAt(GIV(messageSelector) + 4)) & 0x3FFFFF),
(hash == 0
? ((hash = (newObjectHash()) & 0x3FFFFF),
/* begin setHashBitsOf:to: */
flag("endianness"),
assert(((hash >= 0) && (hash <= (identityHashHalfWordMask())))),
- longAtput(objOop4 + 4, ((((longAt(objOop4 + 4)) | 0x3FFFFF) - 0x3FFFFF)) + hash))
+ longAtput(GIV(messageSelector) + 4, ((((longAt(GIV(messageSelector) + 4)) | 0x3FFFFF) - 0x3FFFFF)) + hash))
: 0),
hash))));
wrapAround = 0;
@@ -19326,7 +19321,7 @@
nextSelector = longAt((dictionary1 + (BaseHeaderSize)) + (index << 2));
if (nextSelector == GIV(nilObj)) {
found1 = 0;
- goto l3;
+ goto l2;
}
if (((nextSelector & 3) == 0)
&& (((longAt(nextSelector)) & 0x3FFFFF) == 8)) {
@@ -19334,42 +19329,60 @@
}
if (nextSelector == GIV(messageSelector)) {
/* begin followObjField:ofObject: */
- objOop2 = longAt((dictionary1 + (BaseHeaderSize)) + (MethodArrayIndex << 2));
- assert(isNonImmediate(objOop2));
- if (((longAt(objOop2)) & (0x3FFFFF - 8)) == 0) {
- objOop2 = fixFollowedFieldofObjectwithInitialValue(MethodArrayIndex, dictionary1, objOop2);
+ objOop21 = longAt((dictionary1 + (BaseHeaderSize)) + (MethodArrayIndex << 2));
+ assert(isNonImmediate(objOop21));
+ if (((longAt(objOop21)) & (0x3FFFFF - 8)) == 0) {
+ objOop21 = fixFollowedFieldofObjectwithInitialValue(MethodArrayIndex, dictionary1, objOop21);
}
- methodArray = objOop2;
+ 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);
found1 = 1;
- goto l3;
+ goto l2;
}
index += 1;
if (index == length) {
if (wrapAround) {
found1 = 0;
- goto l3;
+ goto l2;
}
wrapAround = 1;
index = SelectorStart;
}
}
found1 = 0;
- l3: /* end lookupMethodInDictionary: */;
+ l2: /* end lookupMethodInDictionary: */;
if (found1) break;
- implicitReceiver = longAt((mixinApplication1 + (BaseHeaderSize)) + (EnclosingObjectIndex << 2));
- theMixin1 = longAt((mixinApplication1 + (BaseHeaderSize)) + (MixinIndex << 2));
+ /* begin followObjField:ofObject: */
+ objOop1 = longAt((mixinApplication1 + (BaseHeaderSize)) + (EnclosingObjectIndex << 2));
+ assert(isNonImmediate(objOop1));
+ if (((longAt(objOop1)) & (0x3FFFFF - 8)) == 0) {
+ objOop1 = fixFollowedFieldofObjectwithInitialValue(EnclosingObjectIndex, mixinApplication1, objOop1);
+ }
+ implicitReceiver = objOop1;
+ /* begin followObjField:ofObject: */
+ objOop2 = longAt((mixinApplication1 + (BaseHeaderSize)) + (MixinIndex << 2));
+ assert(isNonImmediate(objOop2));
+ if (((longAt(objOop2)) & (0x3FFFFF - 8)) == 0) {
+ objOop2 = fixFollowedFieldofObjectwithInitialValue(MixinIndex, mixinApplication1, objOop2);
+ }
+ theMixin1 = objOop2;
if (theMixin1 == GIV(nilObj)) {
implicitReceiverOrNil = GIV(nilObj);
goto l1;
}
- targetMixin = longAt((theMixin1 + (BaseHeaderSize)) + (EnclosingMixinIndex << 2));
+ /* begin followObjField:ofObject: */
+ objOop3 = longAt((theMixin1 + (BaseHeaderSize)) + (EnclosingMixinIndex << 2));
+ assert(isNonImmediate(objOop3));
+ if (((longAt(objOop3)) & (0x3FFFFF - 8)) == 0) {
+ objOop3 = fixFollowedFieldofObjectwithInitialValue(EnclosingMixinIndex, theMixin1, objOop3);
+ }
+ targetMixin = objOop3;
}
implicitReceiverOrNil = implicitReceiver;
l1: /* end nextImplicitReceiverFor:withMixin: */;
@@ -40942,7 +40955,11 @@
&& (oopisGreaterThanOrEqualToandLessThan(address, ((futureSpace()).start), futureSurvivorStart()))))));
}
-static sqInt
+
+/* Answer if address appears to be that of either an immediate or an object.
+ For code disassembly and assertions. */
+
+sqInt
addressCouldBeOop(sqInt address)
{
return ((address & 3) != 0)
@@ -46346,6 +46363,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)
@@ -47245,7 +47280,7 @@
assert(GIV(falseObj) == (objectAfter(GIV(nilObj))));
assert(GIV(trueObj) == (objectAfter(GIV(falseObj))));
freeListObj = objectAfter(GIV(trueObj));
- /* begin hiddenRootsObj: */
+ /* begin setHiddenRootsObj: */
anOop = objectAfter(freeListObj);
GIV(hiddenRootsObj) = anOop;
assert(validClassTableRootPages());
@@ -47260,7 +47295,7 @@
}
}
GIV(classTableIndex) = 1 << 10;
-l1: /* end hiddenRootsObj: */;
+l1: /* end setHiddenRootsObj: */;
GIV(markStack) = swizzleObjStackAt(MarkStackRootIndex);
GIV(weaklingStack) = swizzleObjStackAt(WeaklingStackRootIndex);
GIV(ephemeronQueue) = swizzleObjStackAt(EphemeronQueueRootIndex);
@@ -49917,6 +49952,21 @@
return objOop;
}
+static sqInt
+noInlineFollowForwarded(sqInt objOop)
+{
+ sqInt referent;
+
+ /* begin followForwarded: */
+ assert(isUnambiguouslyForwarder(objOop));
+ referent = longAt((objOop + (BaseHeaderSize)) + (0 << 2));
+ while (((referent & 3) == 0)
+ && (((longAt(referent)) & 0x3FFFFF) == 8)) {
+ referent = longAt((referent + (BaseHeaderSize)) + (0 << 2));
+ }
+ return referent;
+}
+
sqInt
nonIndexablePointerFormat(void)
{
@@ -55148,14 +55198,9 @@
static sqInt
enclosingObjectAtwithObjectwithMixin(sqInt n, sqInt anObject, sqInt mixin)
{ DECL_MAYBE_SQ_GLOBAL_STRUCT
- sqInt aClass;
- sqInt classIndex;
- sqInt classTablePage;
sqInt count;
sqInt enclosingObject;
sqInt mixinApplication;
- sqInt mixinOrMixinApplication;
- sqInt tagBits;
sqInt targetMixin;
enclosingObject = anObject;
@@ -55167,42 +55212,7 @@
|| (enclosingObject == GIV(nilObj))) {
return GIV(nilObj);
}
- /* begin findApplicationOfTargetMixin:startingAtNonMetaClass: */
- /* begin fetchClassOf: */
- if (((tagBits = enclosingObject & 3)) != 0) {
- aClass = longAt((GIV(classTableFirstPage) + (BaseHeaderSize)) + (tagBits << 2));
- goto l1;
- }
- /* begin fetchClassOfNonImm: */
- classIndex = (longAt(enclosingObject)) & 0x3FFFFF;
- if (classIndex <= 0x1F) {
- if (classIndex == 0x1F) {
- aClass = enclosingObject;
- goto l1;
- }
- if (classIndex == 8) {
- aClass = GIV(nilObj);
- goto l1;
- }
- }
- assert(classIndex >= (arrayClassIndexPun()));
- /* begin classOrNilAtIndex: */
- assert((classIndex <= (tagMask()))
- || (classIndex >= (arrayClassIndexPun())));
- classTablePage = longAt((GIV(hiddenRootsObj) + (BaseHeaderSize)) + ((((usqInt) classIndex) >> 10) << 2));
- if (classTablePage == GIV(nilObj)) {
- aClass = GIV(nilObj);
- goto l1;
- }
- aClass = longAt((classTablePage + (BaseHeaderSize)) + ((classIndex & ((1 << 10) - 1)) << 2));
- l1: /* end fetchClassOf: */;
- mixinOrMixinApplication = aClass;
- while (!((mixinOrMixinApplication == GIV(nilObj))
- || ((mixinOrMixinApplication == targetMixin)
- || ((longAt((mixinOrMixinApplication + (BaseHeaderSize)) + (MixinIndex << 2))) == targetMixin)))) {
- mixinOrMixinApplication = longAt((mixinOrMixinApplication + (BaseHeaderSize)) + (SuperclassIndex << 2));
- }
- mixinApplication = mixinOrMixinApplication;
+ mixinApplication = findApplicationOfTargetMixinstartingAtNonMetaClass(targetMixin, fetchClassOf(enclosingObject));
if (mixinApplication == GIV(nilObj)) {
return GIV(nilObj);
}
@@ -56087,7 +56097,40 @@
return mixinOrMixinApplication;
}
+
+/* This is used to implement the innards of the pushImplicitReceiverBytecode,
+ used for outer sends in NS2/NS3. Find the MixinApplcation of which aClass
+ is a subclass that is an application of targetMixin. This is an
+ implementation derived from
+
+ <ContextPart> findApplicationOfTargetMixin: targetMixin
+ startingAtNonMetaClass: aClass
+ */
+
static sqInt
+findApplicationOfTargetMixinstartingAtNonMetaClass(sqInt targetMixin, sqInt aClass)
+{ DECL_MAYBE_SQ_GLOBAL_STRUCT
+ sqInt mixinOrMixinApplication;
+ sqInt objOop;
+
+ assert(!((isForwarded(targetMixin))));
+ assert(!((isForwarded(aClass))));
+ mixinOrMixinApplication = aClass;
+ while (!((mixinOrMixinApplication == GIV(nilObj))
+ || ((mixinOrMixinApplication == targetMixin)
+ || ((followObjFieldofObject(MixinIndex, mixinOrMixinApplication)) == targetMixin)))) {
+ /* begin followObjField:ofObject: */
+ objOop = longAt((mixinOrMixinApplication + (BaseHeaderSize)) + (SuperclassIndex << 2));
+ assert(isNonImmediate(objOop));
+ if (((longAt(objOop)) & (0x3FFFFF - 8)) == 0) {
+ objOop = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, mixinOrMixinApplication, objOop);
+ }
+ mixinOrMixinApplication = objOop;
+ }
+ return mixinOrMixinApplication;
+}
+
+static sqInt
findClassContainingMethodstartingAt(sqInt meth, sqInt classObj)
{ DECL_MAYBE_SQ_GLOBAL_STRUCT
sqInt classDict;
@@ -58101,7 +58144,6 @@
sqInt objOop2;
sqInt objOop3;
sqInt objOop4;
- sqInt objOop5;
sqInt wrapAround;
assert(addressCouldBeClassObj(class));
@@ -58150,12 +58192,12 @@
}
if (nextSelector == GIV(messageSelector)) {
/* begin followObjField:ofObject: */
- objOop5 = longAt((dictionary + (BaseHeaderSize)) + (MethodArrayIndex << 2));
- assert(isNonImmediate(objOop5));
- if (((longAt(objOop5)) & (0x3FFFFF - 8)) == 0) {
- objOop5 = fixFollowedFieldofObjectwithInitialValue(MethodArrayIndex, dictionary, objOop5);
+ objOop4 = longAt((dictionary + (BaseHeaderSize)) + (MethodArrayIndex << 2));
+ assert(isNonImmediate(objOop4));
+ if (((longAt(objOop4)) & (0x3FFFFF - 8)) == 0) {
+ objOop4 = fixFollowedFieldofObjectwithInitialValue(MethodArrayIndex, dictionary, objOop4);
}
- methodArray = objOop5;
+ methodArray = objOop4;
/* begin followField:ofObject: */
objOop11 = longAt((methodArray + (BaseHeaderSize)) + (index << 2));
if (((objOop11 & 3) == 0)
@@ -58181,14 +58223,13 @@
? (GIV(messageSelector) >> 1)
: ((usqInt) (((usqInt)GIV(messageSelector)))) >> 2)
: (/* begin hashBitsOf: */
- (objOop4 = GIV(messageSelector)),
- (hash = (longAt(objOop4 + 4)) & 0x3FFFFF),
+ (hash = (longAt(GIV(messageSelector) + 4)) & 0x3FFFFF),
(hash == 0
? ((hash = (newObjectHash()) & 0x3FFFFF),
/* begin setHashBitsOf:to: */
flag("endianness"),
assert(((hash >= 0) && (hash <= (identityHashHalfWordMask())))),
- longAtput(objOop4 + 4, ((((longAt(objOop4 + 4)) | 0x3FFFFF) - 0x3FFFFF)) + hash))
+ longAtput(GIV(messageSelector) + 4, ((((longAt(GIV(messageSelector) + 4)) | 0x3FFFFF) - 0x3FFFFF)) + hash))
: 0),
hash))));
wrapAround = 0;
@@ -58277,7 +58318,6 @@
sqInt objOop4;
sqInt objOop5;
sqInt objOop6;
- sqInt objOop7;
sqInt wrapAround1;
currentClass = class;
@@ -58352,14 +58392,13 @@
? (GIV(messageSelector) >> 1)
: ((usqInt) (((usqInt)GIV(messageSelector)))) >> 2)
: (/* begin hashBitsOf: */
- (objOop7 = GIV(messageSelector)),
- (hash = (longAt(objOop7 + 4)) & 0x3FFFFF),
+ (hash = (longAt(GIV(messageSelector) + 4)) & 0x3FFFFF),
(hash == 0
? ((hash = (newObjectHash()) & 0x3FFFFF),
/* begin setHashBitsOf:to: */
flag("endianness"),
assert(((hash >= 0) && (hash <= (identityHashHalfWordMask())))),
- longAtput(objOop7 + 4, ((((longAt(objOop7 + 4)) | 0x3FFFFF) - 0x3FFFFF)) + hash))
+ longAtput(GIV(messageSelector) + 4, ((((longAt(GIV(messageSelector) + 4)) | 0x3FFFFF) - 0x3FFFFF)) + hash))
: 0),
hash))));
wrapAround1 = 0;
Modified: branches/Cog/nsspursrc/vm/cointerp.h
===================================================================
--- branches/Cog/nsspursrc/vm/cointerp.h 2014-10-13 23:35:34 UTC (rev 3104)
+++ branches/Cog/nsspursrc/vm/cointerp.h 2014-10-14 19:54:42 UTC (rev 3105)
@@ -1,5 +1,5 @@
/* Automatically generated by
- CCodeGeneratorGlobalStructure VMMaker.oscog-eem.900 uuid: 3d11cf21-4f5f-406a-85ae-ccbc786612a0
+ CCodeGeneratorGlobalStructure VMMaker.oscog-eem.902 uuid: e97518bb-4f81-470b-9557-6beed90a223c
*/
@@ -140,6 +140,7 @@
sqInt remember(sqInt objOop);
sqInt addGCRoot(sqInt *varLoc);
sqInt addressCouldBeObj(sqInt address);
+sqInt addressCouldBeOop(sqInt address);
sqInt allocatePinnedSlots(sqInt nSlots);
sqInt arrayFormat(void);
sqInt becomewith(sqInt array1, sqInt array2);
Modified: branches/Cog/nsspursrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nsspursrc/vm/gcc3x-cointerp.c 2014-10-13 23:35:34 UTC (rev 3104)
+++ branches/Cog/nsspursrc/vm/gcc3x-cointerp.c 2014-10-14 19:54:42 UTC (rev 3105)
@@ -2,11 +2,11 @@
/* Automatically generated by
- CCodeGeneratorGlobalStructure VMMaker.oscog-eem.900 uuid: 3d11cf21-4f5f-406a-85ae-ccbc786612a0
+ CCodeGeneratorGlobalStructure VMMaker.oscog-eem.902 uuid: e97518bb-4f81-470b-9557-6beed90a223c
from
- CoInterpreter VMMaker.oscog-eem.900 uuid: 3d11cf21-4f5f-406a-85ae-ccbc786612a0
+ CoInterpreter VMMaker.oscog-eem.902 uuid: e97518bb-4f81-470b-9557-6beed90a223c
*/
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.900 uuid: 3d11cf21-4f5f-406a-85ae-ccbc786612a0 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.902 uuid: e97518bb-4f81-470b-9557-6beed90a223c " __DATE__ ;
char *__interpBuildInfo = __buildInfo;
@@ -864,7 +864,7 @@
static void addFreeSubTree(sqInt freeTree) NoDbgRegParms;
sqInt addGCRoot(sqInt *varLoc);
sqInt addressCouldBeObj(sqInt address);
-static sqInt addressCouldBeOop(sqInt address) NoDbgRegParms;
+sqInt addressCouldBeOop(sqInt address);
static sqInt addToFreeTreebytes(sqInt freeChunk, sqInt chunkBytes) NoDbgRegParms;
static sqInt allInstancesOf(sqInt aClass) NoDbgRegParms;
static sqInt allObjects(void);
@@ -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;
@@ -1086,6 +1087,7 @@
static sqInt noCheckClassAtIndex(sqInt classIndex) NoDbgRegParms;
static sqInt noCheckPushonObjStack(sqInt objOop, sqInt objStack) NoDbgRegParms;
static sqInt noFixupFollowFieldofObject(sqInt fieldIndex, sqInt anObject) NoDbgRegParms;
+static sqInt noInlineFollowForwarded(sqInt objOop) NoDbgRegParms;
sqInt nonIndexablePointerFormat(void);
static sqInt noUnscannedEphemerons(void);
sqInt numBytesOf(sqInt objOop);
@@ -1246,6 +1248,7 @@
sqInt fetchIntegerofObject(sqInt fieldIndex, sqInt objectPointer);
static sqInt fetchStackPointerOf(sqInt aContext) NoDbgRegParms;
static sqInt findApplicationOfTargetMixinstartingAtBehavior(sqInt targetMixin, sqInt aBehavior) NoDbgRegParms;
+static sqInt findApplicationOfTargetMixinstartingAtNonMetaClass(sqInt targetMixin, sqInt aClass) NoDbgRegParms;
static sqInt findClassContainingMethodstartingAt(sqInt meth, sqInt classObj) NoDbgRegParms;
sqInt findClassOfMethodforReceiver(sqInt meth, sqInt rcvr);
static char * findFrameAboveinPage(char *theFP, StackPage *thePage) NoDbgRegParms;
@@ -1509,8 +1512,8 @@
_iss usqInt freeStart;
_iss sqInt argumentCount;
_iss usqInt instructionPointer;
+_iss sqInt messageSelector;
_iss usqInt newMethod;
-_iss sqInt messageSelector;
_iss usqInt newSpaceLimit;
_iss StackPage * pages;
_iss sqInt hiddenRootsObj;
@@ -1540,10 +1543,10 @@
_iss StackPage * mostRecentlyUsedPage;
_iss sqInt numStackPages;
_iss SpurNewSpaceSpace pastSpace;
-_iss sqInt classTableFirstPage;
_iss sqInt markStack;
_iss sqInt numClassTablePages;
_iss sqInt profileProcess;
+_iss sqInt classTableFirstPage;
_iss usqInt oldSpaceStart;
_iss SpurNewSpaceSpace futureSpace;
_iss sqInt longRunningPrimitiveCheckSemaphore;
@@ -2325,7 +2328,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.900";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.902";
sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
volatile int sendTrace;
@@ -15053,13 +15056,14 @@
/* frameless method; nothing to activate... */
-
- /* dont use and: so as to get Slang to inline cogit numRegArgs > 0 */
+ if ((numRegArgs()) > 0) {
- if (((cogMethod->cmNumArgs)) <= (numRegArgs())) {
- callRegisterArgCogMethodatreceiver(cogMethod, noCheckEntryOffset(), rcvr);
+ /* dont use and: so as to get Slang to inline cogit numRegArgs > 0 */
+
+ if (((cogMethod->cmNumArgs)) <= (numRegArgs())) {
+ callRegisterArgCogMethodatreceiver(cogMethod, noCheckEntryOffset(), rcvr);
+ }
}
-
/* begin push: */
object = (((sqInt)cogMethod)) + (noCheckEntryOffset());
longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
@@ -18040,13 +18044,14 @@
assertCStackWellAligned();
assert(isMachineCodeFrame(GIV(framePointer)));
assertValidExecutionPointersimbarline(longAt(GIV(stackPointer)), GIV(framePointer), GIV(stackPointer), 0, __LINE__);
-
- /* dont use and: so as to get Slang to inline cogit numRegArgs > 0 */
+ if ((numRegArgs()) > 0) {
- if (((cogMethod->cmNumArgs)) <= (numRegArgs())) {
- callRegisterArgCogMethodatreceiver(cogMethod, entryOffset(), rcvr);
+ /* dont use and: so as to get Slang to inline cogit numRegArgs > 0 */
+
+ if (((cogMethod->cmNumArgs)) <= (numRegArgs())) {
+ callRegisterArgCogMethodatreceiver(cogMethod, entryOffset(), rcvr);
+ }
}
-
/* begin push: */
object = (((sqInt)cogMethod)) + (entryOffset());
longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
@@ -18083,31 +18088,32 @@
object = (((sqInt)cogMethod)) + (entryOffset());
longAtput((sp1 = GIV(stackPointer) - BytesPerWord), object);
GIV(stackPointer) = sp1;
-
- /* dont use and: so as to get Slang to inline cogit numRegArgs > 0 */
+ if ((numRegArgs()) > 0) {
- if (((cogMethod->cmNumArgs)) <= (numRegArgs())) {
- /* begin push: */
- longAtput((sp = GIV(stackPointer) - BytesPerWord), cacheTag);
- GIV(stackPointer) = sp;
-
- switch ((cogMethod->cmNumArgs)) {
- case 0:
- ceCall0ArgsPIC();
- break;
- case 1:
- ceCall1ArgsPIC();
- break;
- case 2:
- ceCall2ArgsPIC();
- break;
- default:
- null;
+ /* dont use and: so as to get Slang to inline cogit numRegArgs > 0 */
+ if (((cogMethod->cmNumArgs)) <= (numRegArgs())) {
+ /* begin push: */
+ longAtput((sp = GIV(stackPointer) - BytesPerWord), cacheTag);
+ GIV(stackPointer) = sp;
+
+ switch ((cogMethod->cmNumArgs)) {
+ case 0:
+ ceCall0ArgsPIC();
+ break;
+ case 1:
+ ceCall1ArgsPIC();
+ break;
+ case 2:
+ ceCall2ArgsPIC();
+ break;
+ default:
+ null;
+
+ }
+ error("not reached");
}
- error("not reached");
}
-
/* begin push: */
longAtput((sp2 = GIV(stackPointer) - BytesPerWord), rcvr);
GIV(stackPointer) = sp2;
@@ -18137,13 +18143,14 @@
assertCStackWellAligned();
assert(isMachineCodeFrame(GIV(framePointer)));
assertValidExecutionPointersimbarline(longAt(GIV(stackPointer)), GIV(framePointer), GIV(stackPointer), 0, __LINE__);
-
- /* dont use and: so as to get Slang to inline cogit numRegArgs > 0 */
+ if ((numRegArgs()) > 0) {
- if (((cogMethod->cmNumArgs)) <= (numRegArgs())) {
- callRegisterArgCogMethodatreceiver(cogMethod, noCheckEntryOffset(), rcvr);
+ /* dont use and: so as to get Slang to inline cogit numRegArgs > 0 */
+
+ if (((cogMethod->cmNumArgs)) <= (numRegArgs())) {
+ callRegisterArgCogMethodatreceiver(cogMethod, noCheckEntryOffset(), rcvr);
+ }
}
-
/* begin push: */
object = (((sqInt)cogMethod)) + (noCheckEntryOffset());
longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
@@ -19033,9 +19040,7 @@
sqInt
implicitReceiverFormixinimplementing(sqInt rcvr, sqInt mixin, sqInt selector)
{ DECL_MAYBE_SQ_GLOBAL_STRUCT
- sqInt aClass;
- sqInt classIndex;
- sqInt classTablePage;
+ sqInt anObject;
sqInt dictionary;
sqInt dictionary1;
sqInt found;
@@ -19052,9 +19057,9 @@
sqInt mask1;
sqInt methodArray;
sqInt methodArray1;
+ sqInt mixin1;
sqInt mixinApplication;
sqInt mixinApplication1;
- sqInt mixinOrMixinApplication;
sqInt nextSelector;
sqInt nextSelector1;
usqInt numSlots;
@@ -19065,13 +19070,16 @@
sqInt objOop12;
sqInt objOop2;
sqInt objOop21;
+ sqInt objOop22;
sqInt objOop3;
sqInt objOop31;
+ sqInt objOop32;
sqInt objOop4;
- sqInt objOop41;
sqInt objOop5;
sqInt objOop6;
- sqInt tagBits;
+ sqInt objOop7;
+ sqInt objOop8;
+ sqInt objOop9;
sqInt targetMixin;
sqInt theMixin;
sqInt theMixin1;
@@ -19082,21 +19090,23 @@
/* begin sendBreakpoint:receiver: */
sendBreakpointreceiver(firstFixedFieldOfMaybeImmediate(selector), lengthOfMaybeImmediate(selector), null);
}
-
- /* messageSelector is an implicit parameter of lookupMethodInDictionary: */
-
- GIV(messageSelector) = selector;
+ assert(!((isOopForwarded(rcvr))));
+ assert(!((isForwarded(mixin))));
+ GIV(messageSelector) = (((selector & 3) == 0)
+ && (((longAt(selector)) & 0x3FFFFF) == 8)
+ ? noInlineFollowForwarded(selector)
+ : selector);
mixinApplication = findApplicationOfTargetMixinstartingAtBehavior(mixin, fetchClassOf(rcvr));
if (mixinApplication == GIV(nilObj)) {
return rcvr;
}
/* begin followObjField:ofObject: */
- objOop = longAt((mixinApplication + (BaseHeaderSize)) + (MethodDictionaryIndex << 2));
- assert(isNonImmediate(objOop));
- if (((longAt(objOop)) & (0x3FFFFF - 8)) == 0) {
- objOop = fixFollowedFieldofObjectwithInitialValue(MethodDictionaryIndex, mixinApplication, objOop);
+ objOop7 = longAt((mixinApplication + (BaseHeaderSize)) + (MethodDictionaryIndex << 2));
+ assert(isNonImmediate(objOop7));
+ if (((longAt(objOop7)) & (0x3FFFFF - 8)) == 0) {
+ objOop7 = fixFollowedFieldofObjectwithInitialValue(MethodDictionaryIndex, mixinApplication, objOop7);
}
- dictionary = objOop;
+ dictionary = objOop7;
/* begin lookupMethodInDictionary: */
/* begin numSlotsOf: */
flag("endianness");
@@ -19122,12 +19132,12 @@
}
if (nextSelector1 == GIV(messageSelector)) {
/* begin followObjField:ofObject: */
- objOop6 = longAt((dictionary + (BaseHeaderSize)) + (MethodArrayIndex << 2));
- assert(isNonImmediate(objOop6));
- if (((longAt(objOop6)) & (0x3FFFFF - 8)) == 0) {
- objOop6 = fixFollowedFieldofObjectwithInitialValue(MethodArrayIndex, dictionary, objOop6);
+ objOop9 = longAt((dictionary + (BaseHeaderSize)) + (MethodArrayIndex << 2));
+ assert(isNonImmediate(objOop9));
+ if (((longAt(objOop9)) & (0x3FFFFF - 8)) == 0) {
+ objOop9 = fixFollowedFieldofObjectwithInitialValue(MethodArrayIndex, dictionary, objOop9);
}
- methodArray1 = objOop6;
+ methodArray1 = objOop9;
/* begin followField:ofObject: */
objOop12 = longAt((methodArray1 + (BaseHeaderSize)) + (index1 << 2));
if (((objOop12 & 3) == 0)
@@ -19136,12 +19146,12 @@
}
GIV(newMethod) = ((sqInt) objOop12);
found = 1;
- goto l4;
+ goto l3;
}
index1 += 1;
}
found = 0;
- goto l4;
+ goto l3;
}
/* It is assumed that there are some nils in this dictionary, and search will
@@ -19153,14 +19163,13 @@
? (GIV(messageSelector) >> 1)
: ((usqInt) (((usqInt)GIV(messageSelector)))) >> 2)
: (/* begin hashBitsOf: */
- (objOop41 = GIV(messageSelector)),
- (hash1 = (longAt(objOop41 + 4)) & 0x3FFFFF),
+ (hash1 = (longAt(GIV(messageSelector) + 4)) & 0x3FFFFF),
(hash1 == 0
? ((hash1 = (newObjectHash()) & 0x3FFFFF),
/* begin setHashBitsOf:to: */
flag("endianness"),
assert(((hash1 >= 0) && (hash1 <= (identityHashHalfWordMask())))),
- longAtput(objOop41 + 4, ((((longAt(objOop41 + 4)) | 0x3FFFFF) - 0x3FFFFF)) + hash1))
+ longAtput(GIV(messageSelector) + 4, ((((longAt(GIV(messageSelector) + 4)) | 0x3FFFFF) - 0x3FFFFF)) + hash1))
: 0),
hash1))));
wrapAround1 = 0;
@@ -19168,7 +19177,7 @@
nextSelector1 = longAt((dictionary + (BaseHeaderSize)) + (index1 << 2));
if (nextSelector1 == GIV(nilObj)) {
found = 0;
- goto l4;
+ goto l3;
}
if (((nextSelector1 & 3) == 0)
&& (((longAt(nextSelector1)) & 0x3FFFFF) == 8)) {
@@ -19176,39 +19185,61 @@
}
if (nextSelector1 == GIV(messageSelector)) {
/* begin followObjField:ofObject: */
- objOop21 = longAt((dictionary + (BaseHeaderSize)) + (MethodArrayIndex << 2));
- assert(isNonImmediate(objOop21));
- if (((longAt(objOop21)) & (0x3FFFFF - 8)) == 0) {
- objOop21 = fixFollowedFieldofObjectwithInitialValue(MethodArrayIndex, dictionary, objOop21);
+ objOop22 = longAt((dictionary + (BaseHeaderSize)) + (MethodArrayIndex << 2));
+ assert(isNonImmediate(objOop22));
+ if (((longAt(objOop22)) & (0x3FFFFF - 8)) == 0) {
+ objOop22 = fixFollowedFieldofObjectwithInitialValue(MethodArrayIndex, dictionary, objOop22);
}
- methodArray1 = objOop21;
+ methodArray1 = objOop22;
/* begin followField:ofObject: */
- objOop31 = longAt((methodArray1 + (BaseHeaderSize)) + ((index1 - SelectorStart) << 2));
- if (((objOop31 & 3) == 0)
- && (((longAt(objOop31)) & 0x3FFFFF) == 8)) {
- objOop31 = fixFollowedFieldofObjectwithInitialValue(index1 - SelectorStart, methodArray1, objOop31);
+ objOop32 = longAt((methodArray1 + (BaseHeaderSize)) + ((index1 - SelectorStart) << 2));
+ if (((objOop32 & 3) == 0)
+ && (((longAt(objOop32)) & 0x3FFFFF) == 8)) {
+ objOop32 = fixFollowedFieldofObjectwithInitialValue(index1 - SelectorStart, methodArray1, objOop32);
}
- GIV(newMethod) = ((sqInt) objOop31);
+ GIV(newMethod) = ((sqInt) objOop32);
found = 1;
- goto l4;
+ goto l3;
}
index1 += 1;
if (index1 == length1) {
if (wrapAround1) {
found = 0;
- goto l4;
+ goto l3;
}
wrapAround1 = 1;
index1 = SelectorStart;
}
}
found = 0;
-l4: /* end lookupMethodInDictionary: */;
+l3: /* end lookupMethodInDictionary: */;
if (!found) {
- theMixin = longAt((mixinApplication + (BaseHeaderSize)) + (MixinIndex << 2));
+ /* begin followObjField:ofObject: */
+ objOop4 = longAt((mixinApplication + (BaseHeaderSize)) + (MixinIndex << 2));
+ assert(isNonImmediate(objOop4));
+ if (((longAt(objOop4)) & (0x3FFFFF - 8)) == 0) {
+ objOop4 = fixFollowedFieldofObjectwithInitialValue(MixinIndex, mixinApplication, objOop4);
+ }
+ theMixin = objOop4;
/* begin nextImplicitReceiverFor:withMixin: */
- implicitReceiver = longAt((mixinApplication + (BaseHeaderSize)) + (EnclosingObjectIndex << 2));
- targetMixin = longAt((theMixin + (BaseHeaderSize)) + (EnclosingMixinIndex << 2));
+ /* begin followObjField:ofObject: */
+ objOop5 = longAt((mixinApplication + (BaseHeaderSize)) + (EnclosingObjectIndex << 2));
+ assert(isNonImmediate(objOop5));
+ if (((longAt(objOop5)) & (0x3FFFFF - 8)) == 0) {
+ objOop5 = fixFollowedFieldofObjectwithInitialValue(EnclosingObjectIndex, mixinApplication, objOop5);
+ }
+ anObject = objOop5;
+ /* begin followObjField:ofObject: */
+ objOop6 = longAt((theMixin + (BaseHeaderSize)) + (EnclosingMixinIndex << 2));
+ assert(isNonImmediate(objOop6));
+ if (((longAt(objOop6)) & (0x3FFFFF - 8)) == 0) {
+ objOop6 = fixFollowedFieldofObjectwithInitialValue(EnclosingMixinIndex, theMixin, objOop6);
+ }
+ mixin1 = objOop6;
+ assert(!((isOopForwarded(anObject))));
+ assert(!((isForwarded(mixin1))));
+ implicitReceiver = anObject;
+ targetMixin = mixin1;
while (1) {
if (targetMixin == GIV(nilObj)) {
@@ -19217,53 +19248,18 @@
implicitReceiverOrNil = GIV(nilObj);
goto l1;
}
- /* begin findApplicationOfTargetMixin:startingAtNonMetaClass: */
- /* begin fetchClassOf: */
- if (((tagBits = implicitReceiver & 3)) != 0) {
- aClass = longAt((GIV(classTableFirstPage) + (BaseHeaderSize)) + (tagBits << 2));
- goto l2;
- }
- /* begin fetchClassOfNonImm: */
- classIndex = (longAt(implicitReceiver)) & 0x3FFFFF;
- if (classIndex <= 0x1F) {
- if (classIndex == 0x1F) {
- aClass = implicitReceiver;
- goto l2;
- }
- if (classIndex == 8) {
- aClass = GIV(nilObj);
- goto l2;
- }
- }
- assert(classIndex >= (arrayClassIndexPun()));
- /* begin classOrNilAtIndex: */
- assert((classIndex <= (tagMask()))
- || (classIndex >= (arrayClassIndexPun())));
- classTablePage = longAt((GIV(hiddenRootsObj) + (BaseHeaderSize)) + ((((usqInt) classIndex) >> 10) << 2));
- if (classTablePage == GIV(nilObj)) {
- aClass = GIV(nilObj);
- goto l2;
- }
- aClass = longAt((classTablePage + (BaseHeaderSize)) + ((classIndex & ((1 << 10) - 1)) << 2));
- l2: /* end fetchClassOf: */;
- mixinOrMixinApplication = aClass;
- while (!((mixinOrMixinApplication == GIV(nilObj))
- || ((mixinOrMixinApplication == targetMixin)
- || ((longAt((mixinOrMixinApplication + (BaseHeaderSize)) + (MixinIndex << 2))) == targetMixin)))) {
- mixinOrMixinApplication = longAt((mixinOrMixinApplication + (BaseHeaderSize)) + (SuperclassIndex << 2));
- }
- mixinApplication1 = mixinOrMixinApplication;
+ mixinApplication1 = findApplicationOfTargetMixinstartingAtNonMetaClass(targetMixin, fetchClassOf(implicitReceiver));
if (mixinApplication1 == GIV(nilObj)) {
implicitReceiverOrNil = GIV(nilObj);
goto l1;
}
/* begin followObjField:ofObject: */
- objOop1 = longAt((mixinApplication1 + (BaseHeaderSize)) + (MethodDictionaryIndex << 2));
- assert(isNonImmediate(objOop1));
- if (((longAt(objOop1)) & (0x3FFFFF - 8)) == 0) {
- objOop1 = fixFollowedFieldofObjectwithInitialValue(MethodDictionaryIndex, mixinApplication1, objOop1);
+ objOop = longAt((mixinApplication1 + (BaseHeaderSize)) + (MethodDictionaryIndex << 2));
+ assert(isNonImmediate(objOop));
+ if (((longAt(objOop)) & (0x3FFFFF - 8)) == 0) {
+ objOop = fixFollowedFieldofObjectwithInitialValue(MethodDictionaryIndex, mixinApplication1, objOop);
}
- dictionary1 = objOop1;
+ dictionary1 = objOop;
/* begin lookupMethodInDictionary: */
/* begin numSlotsOf: */
flag("endianness");
@@ -19289,12 +19285,12 @@
}
if (nextSelector == GIV(messageSelector)) {
/* begin followObjField:ofObject: */
- objOop5 = longAt((dictionary1 + (BaseHeaderSize)) + (MethodArrayIndex << 2));
- assert(isNonImmediate(objOop5));
- if (((longAt(objOop5)) & (0x3FFFFF - 8)) == 0) {
- objOop5 = fixFollowedFieldofObjectwithInitialValue(MethodArrayIndex, dictionary1, objOop5);
+ objOop8 = longAt((dictionary1 + (BaseHeaderSize)) + (MethodArrayIndex << 2));
+ assert(isNonImmediate(objOop8));
+ if (((longAt(objOop8)) & (0x3FFFFF - 8)) == 0) {
@@ Diff output truncated at 50000 characters. @@
More information about the Vm-dev
mailing list