Revision: 3118 Author: eliot Date: 2014-10-30 17:33:06 -0700 (Thu, 30 Oct 2014) Log Message: ----------- CogVM source as per VMMaker.oscog-eem.915
Spur: Fix processWeakSurvivor: so that it answers whether a weak object refers to a young object. The old version only scanned weak fields, igoring refs to young objs from strong fields.
Move check for valid classes from findClassOfMethod: forReceiver: into findClassContainingMethod:startingAt:, hence making findClassOfMethod:forReceiver: et al more robust.
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-29 23:58:59 UTC (rev 3117) +++ branches/Cog/nsspursrc/vm/cointerp.c 2014-10-31 00:33:06 UTC (rev 3118) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 from - CoInterpreter VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 + CoInterpreter VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -966,7 +966,6 @@ sqInt firstShortFormat(void); sqInt fixedFieldsFieldWidth(void); sqInt fixedFieldsOfClassFormatMask(void); -static sqInt fixedFieldsOfClassFormat(sqInt classFormat) NoDbgRegParms; static sqInt fixedFieldsOfformatlength(sqInt objOop, sqInt fmt, sqInt wordLength) NoDbgRegParms; static sqInt fixFollowedFieldofObjectwithInitialValue(sqInt fieldIndex, sqInt anObject, sqInt initialValue) NoDbgRegParms NeverInline; static sqInt followFieldofObject(sqInt fieldIndex, sqInt anObject) NoDbgRegParms; @@ -1548,8 +1547,8 @@ _iss sqInt rememberedSetSize; _iss sqInt * rememberedSet; _iss usqInt freeListsMask; -_iss sqInt classTableFirstPage; _iss sqInt profileProcess; +_iss sqInt classTableFirstPage; _iss sqInt longRunningPrimitiveCheckSemaphore; _iss sqInt profileSemaphore; _iss SpurContiguousObjStack unscannedEphemerons; @@ -2338,7 +2337,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.914"; +const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.915"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace;
@@ -42649,9 +42648,14 @@ static sqInt processWeakSurvivor(sqInt weakObj) { DECL_MAYBE_SQ_GLOBAL_STRUCT + sqInt classFormat; + sqInt classIndex; + sqInt classPointer; + sqInt classTablePage; sqInt hasYoungReferents; sqInt i; sqInt iLimiT; + sqInt numStrongSlots; sqInt referent; sqInt referent1; sqInt weakObjShouldMourn; @@ -42660,7 +42664,41 @@ /* N.B. generateToByDoLimitExpression:negative:on: guards against (unsigned)0 - 1 going +ve */
weakObjShouldMourn = (hasYoungReferents = 0); - for (i = (fixedFieldsOfClassFormat(formatOfClass(fetchClassOfNonImm(weakObj)))), iLimiT = ((numSlotsOf(weakObj)) - 1); i <= iLimiT; i += 1) { + /* begin fixedFieldsOfClassFormat: */ + /* begin formatOfClass: */ + /* begin fetchClassOfNonImm: */ + classIndex = (longAt(weakObj)) & 0x3FFFFF; + if (classIndex <= 0x1F) { + if (classIndex == 0x1F) { + classPointer = weakObj; + goto l1; + } + if (classIndex == 8) { + classPointer = 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)) { + classPointer = GIV(nilObj); + goto l1; + } + classPointer = longAt((classTablePage + BaseHeaderSize) + ((classIndex & ((1 << 10) - 1)) << 2)); +l1: /* end fetchClassOfNonImm: */; + classFormat = ((longAt((classPointer + BaseHeaderSize) + (InstanceSpecificationIndex << 2))) >> 1); + numStrongSlots = classFormat & ((1 << 16) - 1); + for (i = 0; i < numStrongSlots; i += 1) { + referent = longAt((weakObj + BaseHeaderSize) + (i << 2)); + if (((referent & 3) == 0) + && (isYoungObject(referent))) { + hasYoungReferents = 1; + } + } + for (i = numStrongSlots, iLimiT = ((numSlotsOf(weakObj)) - 1); i <= iLimiT; i += 1) {
/* Referent could be forwarded due to scavenging or a become:, don't assume. */
@@ -48672,12 +48710,6 @@ }
static sqInt -fixedFieldsOfClassFormat(sqInt classFormat) -{ - return classFormat & ((1 << 16) - 1); -} - -static sqInt fixedFieldsOfformatlength(sqInt objOop, sqInt fmt, sqInt wordLength) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt class; @@ -65472,6 +65504,9 @@ } do { assert(!(isForwarded(currClass))); + if (!(addressCouldBeClassObj(currClass))) { + return GIV(nilObj); + } /* begin noFixupFollowField:ofObject: */ objOop1 = longAt((currClass + BaseHeaderSize) + (MethodDictionaryIndex << 2)); if (((objOop1 & 3) == 0) @@ -65539,59 +65574,21 @@ sqInt findClassOfMethodforReceiver(sqInt meth, sqInt rcvr) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt classIndex; - sqInt classTablePage; - sqInt mclass; sqInt rclass; - sqInt tagBits;
if ((((rcvr & 3) != 0) || (addressCouldBeObj(rcvr))) && (!(((rcvr & 3) == 0) && (((longAt(rcvr)) & 0x3FFFFF) == 8)))) { - /* begin fetchClassOf: */ - if (((tagBits = rcvr & 3)) != 0) { - rclass = longAt((GIV(classTableFirstPage) + BaseHeaderSize) + (tagBits << 2)); - goto l1; + rclass = findClassContainingMethodstartingAt(meth, fetchClassOf(rcvr)); + if (rclass != GIV(nilObj)) { + return rclass; } - /* begin fetchClassOfNonImm: */ - classIndex = (longAt(rcvr)) & 0x3FFFFF; - if (classIndex <= 0x1F) { - if (classIndex == 0x1F) { - rclass = rcvr; - goto l1; - } - if (classIndex == 8) { - rclass = 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)) { - rclass = GIV(nilObj); - goto l1; - } - rclass = longAt((classTablePage + BaseHeaderSize) + ((classIndex & ((1 << 10) - 1)) << 2)); - l1: /* end fetchClassOf: */; - if (addressCouldBeClassObj(rclass)) { - rclass = findClassContainingMethodstartingAt(meth, rclass); - if (rclass != GIV(nilObj)) { - return rclass; - } - } } if (!((addressCouldBeObj(meth)) && (((((usqInt) (longAt(meth))) >> 24) & 0x1F) >= 24))) { return GIV(nilObj); } - mclass = safeMethodClassOf(meth); - if (addressCouldBeClassObj(mclass)) { - return GIV(nilObj); - } return findClassContainingMethodstartingAt(meth, safeMethodClassOf(meth)); }
@@ -69075,14 +69072,10 @@ static void printActivationNameForreceiverisBlockfirstTemporary(sqInt aMethod, sqInt anObject, sqInt isBlock, sqInt maybeMessage) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt classIndex; sqInt classObj; - sqInt classTablePage; - sqInt mclass; sqInt methClass; sqInt methodSel; sqInt rclass; - sqInt tagBits;
if (isBlock) { print("[] in "); @@ -69092,52 +69085,17 @@ || (addressCouldBeObj(anObject))) && (!(((anObject & 3) == 0) && (((longAt(anObject)) & 0x3FFFFF) == 8)))) { - /* begin fetchClassOf: */ - if (((tagBits = anObject & 3)) != 0) { - rclass = longAt((GIV(classTableFirstPage) + BaseHeaderSize) + (tagBits << 2)); - goto l2; + rclass = findClassContainingMethodstartingAt(aMethod, fetchClassOf(anObject)); + if (rclass != GIV(nilObj)) { + methClass = rclass; + goto l1; } - /* begin fetchClassOfNonImm: */ - classIndex = (longAt(anObject)) & 0x3FFFFF; - if (classIndex <= 0x1F) { - if (classIndex == 0x1F) { - rclass = anObject; - goto l2; - } - if (classIndex == 8) { - rclass = 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)) { - rclass = GIV(nilObj); - goto l2; - } - rclass = longAt((classTablePage + BaseHeaderSize) + ((classIndex & ((1 << 10) - 1)) << 2)); - l2: /* end fetchClassOf: */; - if (addressCouldBeClassObj(rclass)) { - rclass = findClassContainingMethodstartingAt(aMethod, rclass); - if (rclass != GIV(nilObj)) { - methClass = rclass; - goto l1; - } - } } if (!((addressCouldBeObj(aMethod)) && (((((usqInt) (longAt(aMethod))) >> 24) & 0x1F) >= 24))) { methClass = GIV(nilObj); goto l1; } - mclass = safeMethodClassOf(aMethod); - if (addressCouldBeClassObj(mclass)) { - methClass = GIV(nilObj); - goto l1; - } methClass = findClassContainingMethodstartingAt(aMethod, safeMethodClassOf(aMethod)); l1: /* end findClassOfMethod:forReceiver: */; methodSel = findSelectorOfMethod(aMethod);
Modified: branches/Cog/nsspursrc/vm/cointerp.h =================================================================== --- branches/Cog/nsspursrc/vm/cointerp.h 2014-10-29 23:58:59 UTC (rev 3117) +++ branches/Cog/nsspursrc/vm/cointerp.h 2014-10-31 00:33:06 UTC (rev 3118) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 */
Modified: branches/Cog/nsspursrc/vm/gcc3x-cointerp.c =================================================================== --- branches/Cog/nsspursrc/vm/gcc3x-cointerp.c 2014-10-29 23:58:59 UTC (rev 3117) +++ branches/Cog/nsspursrc/vm/gcc3x-cointerp.c 2014-10-31 00:33:06 UTC (rev 3118) @@ -2,11 +2,11 @@
/* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 from - CoInterpreter VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 + CoInterpreter VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -969,7 +969,6 @@ sqInt firstShortFormat(void); sqInt fixedFieldsFieldWidth(void); sqInt fixedFieldsOfClassFormatMask(void); -static sqInt fixedFieldsOfClassFormat(sqInt classFormat) NoDbgRegParms; static sqInt fixedFieldsOfformatlength(sqInt objOop, sqInt fmt, sqInt wordLength) NoDbgRegParms; static sqInt fixFollowedFieldofObjectwithInitialValue(sqInt fieldIndex, sqInt anObject, sqInt initialValue) NoDbgRegParms NeverInline; static sqInt followFieldofObject(sqInt fieldIndex, sqInt anObject) NoDbgRegParms; @@ -1551,8 +1550,8 @@ _iss sqInt rememberedSetSize; _iss sqInt * rememberedSet; _iss usqInt freeListsMask; -_iss sqInt classTableFirstPage; _iss sqInt profileProcess; +_iss sqInt classTableFirstPage; _iss sqInt longRunningPrimitiveCheckSemaphore; _iss sqInt profileSemaphore; _iss SpurContiguousObjStack unscannedEphemerons; @@ -2341,7 +2340,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.914"; +const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.915"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace;
@@ -42658,9 +42657,14 @@ static sqInt processWeakSurvivor(sqInt weakObj) { DECL_MAYBE_SQ_GLOBAL_STRUCT + sqInt classFormat; + sqInt classIndex; + sqInt classPointer; + sqInt classTablePage; sqInt hasYoungReferents; sqInt i; sqInt iLimiT; + sqInt numStrongSlots; sqInt referent; sqInt referent1; sqInt weakObjShouldMourn; @@ -42669,7 +42673,41 @@ /* N.B. generateToByDoLimitExpression:negative:on: guards against (unsigned)0 - 1 going +ve */
weakObjShouldMourn = (hasYoungReferents = 0); - for (i = (fixedFieldsOfClassFormat(formatOfClass(fetchClassOfNonImm(weakObj)))), iLimiT = ((numSlotsOf(weakObj)) - 1); i <= iLimiT; i += 1) { + /* begin fixedFieldsOfClassFormat: */ + /* begin formatOfClass: */ + /* begin fetchClassOfNonImm: */ + classIndex = (longAt(weakObj)) & 0x3FFFFF; + if (classIndex <= 0x1F) { + if (classIndex == 0x1F) { + classPointer = weakObj; + goto l1; + } + if (classIndex == 8) { + classPointer = 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)) { + classPointer = GIV(nilObj); + goto l1; + } + classPointer = longAt((classTablePage + BaseHeaderSize) + ((classIndex & ((1 << 10) - 1)) << 2)); +l1: /* end fetchClassOfNonImm: */; + classFormat = ((longAt((classPointer + BaseHeaderSize) + (InstanceSpecificationIndex << 2))) >> 1); + numStrongSlots = classFormat & ((1 << 16) - 1); + for (i = 0; i < numStrongSlots; i += 1) { + referent = longAt((weakObj + BaseHeaderSize) + (i << 2)); + if (((referent & 3) == 0) + && (isYoungObject(referent))) { + hasYoungReferents = 1; + } + } + for (i = numStrongSlots, iLimiT = ((numSlotsOf(weakObj)) - 1); i <= iLimiT; i += 1) {
/* Referent could be forwarded due to scavenging or a become:, don't assume. */
@@ -48681,12 +48719,6 @@ }
static sqInt -fixedFieldsOfClassFormat(sqInt classFormat) -{ - return classFormat & ((1 << 16) - 1); -} - -static sqInt fixedFieldsOfformatlength(sqInt objOop, sqInt fmt, sqInt wordLength) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt class; @@ -65481,6 +65513,9 @@ } do { assert(!(isForwarded(currClass))); + if (!(addressCouldBeClassObj(currClass))) { + return GIV(nilObj); + } /* begin noFixupFollowField:ofObject: */ objOop1 = longAt((currClass + BaseHeaderSize) + (MethodDictionaryIndex << 2)); if (((objOop1 & 3) == 0) @@ -65548,59 +65583,21 @@ sqInt findClassOfMethodforReceiver(sqInt meth, sqInt rcvr) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt classIndex; - sqInt classTablePage; - sqInt mclass; sqInt rclass; - sqInt tagBits;
if ((((rcvr & 3) != 0) || (addressCouldBeObj(rcvr))) && (!(((rcvr & 3) == 0) && (((longAt(rcvr)) & 0x3FFFFF) == 8)))) { - /* begin fetchClassOf: */ - if (((tagBits = rcvr & 3)) != 0) { - rclass = longAt((GIV(classTableFirstPage) + BaseHeaderSize) + (tagBits << 2)); - goto l1; + rclass = findClassContainingMethodstartingAt(meth, fetchClassOf(rcvr)); + if (rclass != GIV(nilObj)) { + return rclass; } - /* begin fetchClassOfNonImm: */ - classIndex = (longAt(rcvr)) & 0x3FFFFF; - if (classIndex <= 0x1F) { - if (classIndex == 0x1F) { - rclass = rcvr; - goto l1; - } - if (classIndex == 8) { - rclass = 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)) { - rclass = GIV(nilObj); - goto l1; - } - rclass = longAt((classTablePage + BaseHeaderSize) + ((classIndex & ((1 << 10) - 1)) << 2)); - l1: /* end fetchClassOf: */; - if (addressCouldBeClassObj(rclass)) { - rclass = findClassContainingMethodstartingAt(meth, rclass); - if (rclass != GIV(nilObj)) { - return rclass; - } - } } if (!((addressCouldBeObj(meth)) && (((((usqInt) (longAt(meth))) >> 24) & 0x1F) >= 24))) { return GIV(nilObj); } - mclass = safeMethodClassOf(meth); - if (addressCouldBeClassObj(mclass)) { - return GIV(nilObj); - } return findClassContainingMethodstartingAt(meth, safeMethodClassOf(meth)); }
@@ -69084,14 +69081,10 @@ static void printActivationNameForreceiverisBlockfirstTemporary(sqInt aMethod, sqInt anObject, sqInt isBlock, sqInt maybeMessage) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt classIndex; sqInt classObj; - sqInt classTablePage; - sqInt mclass; sqInt methClass; sqInt methodSel; sqInt rclass; - sqInt tagBits;
if (isBlock) { print("[] in "); @@ -69101,52 +69094,17 @@ || (addressCouldBeObj(anObject))) && (!(((anObject & 3) == 0) && (((longAt(anObject)) & 0x3FFFFF) == 8)))) { - /* begin fetchClassOf: */ - if (((tagBits = anObject & 3)) != 0) { - rclass = longAt((GIV(classTableFirstPage) + BaseHeaderSize) + (tagBits << 2)); - goto l2; + rclass = findClassContainingMethodstartingAt(aMethod, fetchClassOf(anObject)); + if (rclass != GIV(nilObj)) { + methClass = rclass; + goto l1; } - /* begin fetchClassOfNonImm: */ - classIndex = (longAt(anObject)) & 0x3FFFFF; - if (classIndex <= 0x1F) { - if (classIndex == 0x1F) { - rclass = anObject; - goto l2; - } - if (classIndex == 8) { - rclass = 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)) { - rclass = GIV(nilObj); - goto l2; - } - rclass = longAt((classTablePage + BaseHeaderSize) + ((classIndex & ((1 << 10) - 1)) << 2)); - l2: /* end fetchClassOf: */; - if (addressCouldBeClassObj(rclass)) { - rclass = findClassContainingMethodstartingAt(aMethod, rclass); - if (rclass != GIV(nilObj)) { - methClass = rclass; - goto l1; - } - } } if (!((addressCouldBeObj(aMethod)) && (((((usqInt) (longAt(aMethod))) >> 24) & 0x1F) >= 24))) { methClass = GIV(nilObj); goto l1; } - mclass = safeMethodClassOf(aMethod); - if (addressCouldBeClassObj(mclass)) { - methClass = GIV(nilObj); - goto l1; - } methClass = findClassContainingMethodstartingAt(aMethod, safeMethodClassOf(aMethod)); l1: /* end findClassOfMethod:forReceiver: */; methodSel = findSelectorOfMethod(aMethod);
Modified: branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c =================================================================== --- branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c 2014-10-29 23:58:59 UTC (rev 3117) +++ branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c 2014-10-31 00:33:06 UTC (rev 3118) @@ -2,11 +2,11 @@
/* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 from - StackInterpreter VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 + StackInterpreter VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -716,7 +716,6 @@ sqInt firstShortFormat(void); sqInt fixedFieldsFieldWidth(void); sqInt fixedFieldsOfClassFormatMask(void); -static sqInt fixedFieldsOfClassFormat(sqInt classFormat) NoDbgRegParms; static sqInt fixedFieldsOfformatlength(sqInt objOop, sqInt fmt, sqInt wordLength) NoDbgRegParms; static sqInt fixFollowedFieldofObjectwithInitialValue(sqInt fieldIndex, sqInt anObject, sqInt initialValue) NoDbgRegParms NeverInline; static sqInt followFieldofObject(sqInt fieldIndex, sqInt anObject) NoDbgRegParms; @@ -1347,8 +1346,8 @@ _iss sqInt bytesPerPage; _iss usqInt freeListsMask; _iss sqInt profileProcess; -_iss sqInt classTableFirstPage; _iss SpurContiguousObjStack unscannedEphemerons; +_iss sqInt classTableFirstPage; _iss usqInt firstFreeChunk; _iss sqInt profileMethod; _iss StackPage * mostRecentlyUsedPage; @@ -2086,7 +2085,7 @@ 0 }; char * breakSelector; sqInt breakSelectorLength = -1; -const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.914"; +const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.915"; volatile int sendTrace; sqInt suppressHeartbeatFlag;
@@ -28707,9 +28706,14 @@ static sqInt processWeakSurvivor(sqInt weakObj) { DECL_MAYBE_SQ_GLOBAL_STRUCT + sqInt classFormat; + sqInt classIndex; + sqInt classPointer; + sqInt classTablePage; sqInt hasYoungReferents; sqInt i; sqInt iLimiT; + sqInt numStrongSlots; sqInt referent; sqInt referent1; sqInt weakObjShouldMourn; @@ -28718,7 +28722,41 @@ /* N.B. generateToByDoLimitExpression:negative:on: guards against (unsigned)0 - 1 going +ve */
weakObjShouldMourn = (hasYoungReferents = 0); - for (i = (fixedFieldsOfClassFormat(formatOfClass(fetchClassOfNonImm(weakObj)))), iLimiT = ((numSlotsOf(weakObj)) - 1); i <= iLimiT; i += 1) { + /* begin fixedFieldsOfClassFormat: */ + /* begin formatOfClass: */ + /* begin fetchClassOfNonImm: */ + classIndex = (longAt(weakObj)) & 0x3FFFFF; + if (classIndex <= 0x1F) { + if (classIndex == 0x1F) { + classPointer = weakObj; + goto l1; + } + if (classIndex == 8) { + classPointer = 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)) { + classPointer = GIV(nilObj); + goto l1; + } + classPointer = longAt((classTablePage + BaseHeaderSize) + ((classIndex & ((1 << 10) - 1)) << 2)); +l1: /* end fetchClassOfNonImm: */; + classFormat = ((longAt((classPointer + BaseHeaderSize) + (InstanceSpecificationIndex << 2))) >> 1); + numStrongSlots = classFormat & ((1 << 16) - 1); + for (i = 0; i < numStrongSlots; i += 1) { + referent = longAt((weakObj + BaseHeaderSize) + (i << 2)); + if (((referent & 3) == 0) + && (isYoungObject(referent))) { + hasYoungReferents = 1; + } + } + for (i = numStrongSlots, iLimiT = ((numSlotsOf(weakObj)) - 1); i <= iLimiT; i += 1) {
/* Referent could be forwarded due to scavenging or a become:, don't assume. */
@@ -34747,12 +34785,6 @@ }
static sqInt -fixedFieldsOfClassFormat(sqInt classFormat) -{ - return classFormat & ((1 << 16) - 1); -} - -static sqInt fixedFieldsOfformatlength(sqInt objOop, sqInt fmt, sqInt wordLength) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt class; @@ -51624,6 +51656,9 @@ } do { assert(!(isForwarded(currClass))); + if (!(addressCouldBeClassObj(currClass))) { + return GIV(nilObj); + } /* begin noFixupFollowField:ofObject: */ objOop1 = longAt((currClass + BaseHeaderSize) + (MethodDictionaryIndex << 2)); if (((objOop1 & 3) == 0) @@ -51691,59 +51726,21 @@ sqInt findClassOfMethodforReceiver(sqInt meth, sqInt rcvr) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt classIndex; - sqInt classTablePage; - sqInt mclass; sqInt rclass; - sqInt tagBits;
if ((((rcvr & 3) != 0) || (addressCouldBeObj(rcvr))) && (!(((rcvr & 3) == 0) && (((longAt(rcvr)) & 0x3FFFFF) == 8)))) { - /* begin fetchClassOf: */ - if (((tagBits = rcvr & 3)) != 0) { - rclass = longAt((GIV(classTableFirstPage) + BaseHeaderSize) + (tagBits << 2)); - goto l1; + rclass = findClassContainingMethodstartingAt(meth, fetchClassOf(rcvr)); + if (rclass != GIV(nilObj)) { + return rclass; } - /* begin fetchClassOfNonImm: */ - classIndex = (longAt(rcvr)) & 0x3FFFFF; - if (classIndex <= 0x1F) { - if (classIndex == 0x1F) { - rclass = rcvr; - goto l1; - } - if (classIndex == 8) { - rclass = 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)) { - rclass = GIV(nilObj); - goto l1; - } - rclass = longAt((classTablePage + BaseHeaderSize) + ((classIndex & ((1 << 10) - 1)) << 2)); - l1: /* end fetchClassOf: */; - if (addressCouldBeClassObj(rclass)) { - rclass = findClassContainingMethodstartingAt(meth, rclass); - if (rclass != GIV(nilObj)) { - return rclass; - } - } } if (!((addressCouldBeObj(meth)) && (((((usqInt) (longAt(meth))) >> 24) & 0x1F) >= 24))) { return GIV(nilObj); } - mclass = safeMethodClassOf(meth); - if (addressCouldBeClassObj(mclass)) { - return GIV(nilObj); - } return findClassContainingMethodstartingAt(meth, safeMethodClassOf(meth)); }
@@ -57452,14 +57449,10 @@ static void printActivationNameForreceiverisBlockfirstTemporary(sqInt aMethod, sqInt anObject, sqInt isBlock, sqInt maybeMessage) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt classIndex; sqInt classObj; - sqInt classTablePage; - sqInt mclass; sqInt methClass; sqInt methodSel; sqInt rclass; - sqInt tagBits;
if (isBlock) { print("[] in "); @@ -57469,52 +57462,17 @@ || (addressCouldBeObj(anObject))) && (!(((anObject & 3) == 0) && (((longAt(anObject)) & 0x3FFFFF) == 8)))) { - /* begin fetchClassOf: */ - if (((tagBits = anObject & 3)) != 0) { - rclass = longAt((GIV(classTableFirstPage) + BaseHeaderSize) + (tagBits << 2)); - goto l2; + rclass = findClassContainingMethodstartingAt(aMethod, fetchClassOf(anObject)); + if (rclass != GIV(nilObj)) { + methClass = rclass; + goto l1; } - /* begin fetchClassOfNonImm: */ - classIndex = (longAt(anObject)) & 0x3FFFFF; - if (classIndex <= 0x1F) { - if (classIndex == 0x1F) { - rclass = anObject; - goto l2; - } - if (classIndex == 8) { - rclass = 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)) { - rclass = GIV(nilObj); - goto l2; - } - rclass = longAt((classTablePage + BaseHeaderSize) + ((classIndex & ((1 << 10) - 1)) << 2)); - l2: /* end fetchClassOf: */; - if (addressCouldBeClassObj(rclass)) { - rclass = findClassContainingMethodstartingAt(aMethod, rclass); - if (rclass != GIV(nilObj)) { - methClass = rclass; - goto l1; - } - } } if (!((addressCouldBeObj(aMethod)) && (((((usqInt) (longAt(aMethod))) >> 24) & 0x1F) >= 24))) { methClass = GIV(nilObj); goto l1; } - mclass = safeMethodClassOf(aMethod); - if (addressCouldBeClassObj(mclass)) { - methClass = GIV(nilObj); - goto l1; - } methClass = findClassContainingMethodstartingAt(aMethod, safeMethodClassOf(aMethod)); l1: /* end findClassOfMethod:forReceiver: */; methodSel = findSelectorOfMethod(aMethod);
Modified: branches/Cog/nsspurstacksrc/vm/interp.c =================================================================== --- branches/Cog/nsspurstacksrc/vm/interp.c 2014-10-29 23:58:59 UTC (rev 3117) +++ branches/Cog/nsspurstacksrc/vm/interp.c 2014-10-31 00:33:06 UTC (rev 3118) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 from - StackInterpreter VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 + StackInterpreter VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -713,7 +713,6 @@ sqInt firstShortFormat(void); sqInt fixedFieldsFieldWidth(void); sqInt fixedFieldsOfClassFormatMask(void); -static sqInt fixedFieldsOfClassFormat(sqInt classFormat) NoDbgRegParms; static sqInt fixedFieldsOfformatlength(sqInt objOop, sqInt fmt, sqInt wordLength) NoDbgRegParms; static sqInt fixFollowedFieldofObjectwithInitialValue(sqInt fieldIndex, sqInt anObject, sqInt initialValue) NoDbgRegParms NeverInline; static sqInt followFieldofObject(sqInt fieldIndex, sqInt anObject) NoDbgRegParms; @@ -1344,8 +1343,8 @@ _iss sqInt bytesPerPage; _iss usqInt freeListsMask; _iss sqInt profileProcess; -_iss sqInt classTableFirstPage; _iss SpurContiguousObjStack unscannedEphemerons; +_iss sqInt classTableFirstPage; _iss usqInt firstFreeChunk; _iss sqInt profileMethod; _iss StackPage * mostRecentlyUsedPage; @@ -2083,7 +2082,7 @@ 0 }; char * breakSelector; sqInt breakSelectorLength = -1; -const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.914"; +const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.915"; volatile int sendTrace; sqInt suppressHeartbeatFlag;
@@ -28698,9 +28697,14 @@ static sqInt processWeakSurvivor(sqInt weakObj) { DECL_MAYBE_SQ_GLOBAL_STRUCT + sqInt classFormat; + sqInt classIndex; + sqInt classPointer; + sqInt classTablePage; sqInt hasYoungReferents; sqInt i; sqInt iLimiT; + sqInt numStrongSlots; sqInt referent; sqInt referent1; sqInt weakObjShouldMourn; @@ -28709,7 +28713,41 @@ /* N.B. generateToByDoLimitExpression:negative:on: guards against (unsigned)0 - 1 going +ve */
weakObjShouldMourn = (hasYoungReferents = 0); - for (i = (fixedFieldsOfClassFormat(formatOfClass(fetchClassOfNonImm(weakObj)))), iLimiT = ((numSlotsOf(weakObj)) - 1); i <= iLimiT; i += 1) { + /* begin fixedFieldsOfClassFormat: */ + /* begin formatOfClass: */ + /* begin fetchClassOfNonImm: */ + classIndex = (longAt(weakObj)) & 0x3FFFFF; + if (classIndex <= 0x1F) { + if (classIndex == 0x1F) { + classPointer = weakObj; + goto l1; + } + if (classIndex == 8) { + classPointer = 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)) { + classPointer = GIV(nilObj); + goto l1; + } + classPointer = longAt((classTablePage + BaseHeaderSize) + ((classIndex & ((1 << 10) - 1)) << 2)); +l1: /* end fetchClassOfNonImm: */; + classFormat = ((longAt((classPointer + BaseHeaderSize) + (InstanceSpecificationIndex << 2))) >> 1); + numStrongSlots = classFormat & ((1 << 16) - 1); + for (i = 0; i < numStrongSlots; i += 1) { + referent = longAt((weakObj + BaseHeaderSize) + (i << 2)); + if (((referent & 3) == 0) + && (isYoungObject(referent))) { + hasYoungReferents = 1; + } + } + for (i = numStrongSlots, iLimiT = ((numSlotsOf(weakObj)) - 1); i <= iLimiT; i += 1) {
/* Referent could be forwarded due to scavenging or a become:, don't assume. */
@@ -34738,12 +34776,6 @@ }
static sqInt -fixedFieldsOfClassFormat(sqInt classFormat) -{ - return classFormat & ((1 << 16) - 1); -} - -static sqInt fixedFieldsOfformatlength(sqInt objOop, sqInt fmt, sqInt wordLength) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt class; @@ -51615,6 +51647,9 @@ } do { assert(!(isForwarded(currClass))); + if (!(addressCouldBeClassObj(currClass))) { + return GIV(nilObj); + } /* begin noFixupFollowField:ofObject: */ objOop1 = longAt((currClass + BaseHeaderSize) + (MethodDictionaryIndex << 2)); if (((objOop1 & 3) == 0) @@ -51682,59 +51717,21 @@ sqInt findClassOfMethodforReceiver(sqInt meth, sqInt rcvr) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt classIndex; - sqInt classTablePage; - sqInt mclass; sqInt rclass; - sqInt tagBits;
if ((((rcvr & 3) != 0) || (addressCouldBeObj(rcvr))) && (!(((rcvr & 3) == 0) && (((longAt(rcvr)) & 0x3FFFFF) == 8)))) { - /* begin fetchClassOf: */ - if (((tagBits = rcvr & 3)) != 0) { - rclass = longAt((GIV(classTableFirstPage) + BaseHeaderSize) + (tagBits << 2)); - goto l1; + rclass = findClassContainingMethodstartingAt(meth, fetchClassOf(rcvr)); + if (rclass != GIV(nilObj)) { + return rclass; } - /* begin fetchClassOfNonImm: */ - classIndex = (longAt(rcvr)) & 0x3FFFFF; - if (classIndex <= 0x1F) { - if (classIndex == 0x1F) { - rclass = rcvr; - goto l1; - } - if (classIndex == 8) { - rclass = 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)) { - rclass = GIV(nilObj); - goto l1; - } - rclass = longAt((classTablePage + BaseHeaderSize) + ((classIndex & ((1 << 10) - 1)) << 2)); - l1: /* end fetchClassOf: */; - if (addressCouldBeClassObj(rclass)) { - rclass = findClassContainingMethodstartingAt(meth, rclass); - if (rclass != GIV(nilObj)) { - return rclass; - } - } } if (!((addressCouldBeObj(meth)) && (((((usqInt) (longAt(meth))) >> 24) & 0x1F) >= 24))) { return GIV(nilObj); } - mclass = safeMethodClassOf(meth); - if (addressCouldBeClassObj(mclass)) { - return GIV(nilObj); - } return findClassContainingMethodstartingAt(meth, safeMethodClassOf(meth)); }
@@ -57443,14 +57440,10 @@ static void printActivationNameForreceiverisBlockfirstTemporary(sqInt aMethod, sqInt anObject, sqInt isBlock, sqInt maybeMessage) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt classIndex; sqInt classObj; - sqInt classTablePage; - sqInt mclass; sqInt methClass; sqInt methodSel; sqInt rclass; - sqInt tagBits;
if (isBlock) { print("[] in "); @@ -57460,52 +57453,17 @@ || (addressCouldBeObj(anObject))) && (!(((anObject & 3) == 0) && (((longAt(anObject)) & 0x3FFFFF) == 8)))) { - /* begin fetchClassOf: */ - if (((tagBits = anObject & 3)) != 0) { - rclass = longAt((GIV(classTableFirstPage) + BaseHeaderSize) + (tagBits << 2)); - goto l2; + rclass = findClassContainingMethodstartingAt(aMethod, fetchClassOf(anObject)); + if (rclass != GIV(nilObj)) { + methClass = rclass; + goto l1; } - /* begin fetchClassOfNonImm: */ - classIndex = (longAt(anObject)) & 0x3FFFFF; - if (classIndex <= 0x1F) { - if (classIndex == 0x1F) { - rclass = anObject; - goto l2; - } - if (classIndex == 8) { - rclass = 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)) { - rclass = GIV(nilObj); - goto l2; - } - rclass = longAt((classTablePage + BaseHeaderSize) + ((classIndex & ((1 << 10) - 1)) << 2)); - l2: /* end fetchClassOf: */; - if (addressCouldBeClassObj(rclass)) { - rclass = findClassContainingMethodstartingAt(aMethod, rclass); - if (rclass != GIV(nilObj)) { - methClass = rclass; - goto l1; - } - } } if (!((addressCouldBeObj(aMethod)) && (((((usqInt) (longAt(aMethod))) >> 24) & 0x1F) >= 24))) { methClass = GIV(nilObj); goto l1; } - mclass = safeMethodClassOf(aMethod); - if (addressCouldBeClassObj(mclass)) { - methClass = GIV(nilObj); - goto l1; - } methClass = findClassContainingMethodstartingAt(aMethod, safeMethodClassOf(aMethod)); l1: /* end findClassOfMethod:forReceiver: */; methodSel = findSelectorOfMethod(aMethod);
Property changes on: branches/Cog/platforms/Cross/vm/sqSCCSVersion.h ___________________________________________________________________ Modified: checkindate - Wed Oct 29 16:57:58 PDT 2014 + Thu Oct 30 17:32:32 PDT 2014
Modified: branches/Cog/spursistasrc/vm/cointerp.c =================================================================== --- branches/Cog/spursistasrc/vm/cointerp.c 2014-10-29 23:58:59 UTC (rev 3117) +++ branches/Cog/spursistasrc/vm/cointerp.c 2014-10-31 00:33:06 UTC (rev 3118) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 from - CoInterpreter VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 + CoInterpreter VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -965,7 +965,6 @@ sqInt firstShortFormat(void); sqInt fixedFieldsFieldWidth(void); sqInt fixedFieldsOfClassFormatMask(void); -static sqInt fixedFieldsOfClassFormat(sqInt classFormat) NoDbgRegParms; static sqInt fixedFieldsOfClass(sqInt objOop) NoDbgRegParms; static sqInt fixedFieldsOfformatlength(sqInt objOop, sqInt fmt, sqInt wordLength) NoDbgRegParms; static sqInt fixFollowedFieldofObjectwithInitialValue(sqInt fieldIndex, sqInt anObject, sqInt initialValue) NoDbgRegParms NeverInline; @@ -1542,8 +1541,8 @@ _iss sqInt * freeLists; _iss sqInt rememberedSetSize; _iss sqInt * rememberedSet; -_iss sqInt classTableFirstPage; _iss usqInt freeListsMask; +_iss sqInt classTableFirstPage; _iss sqInt profileProcess; _iss sqInt longRunningPrimitiveCheckSemaphore; _iss sqInt profileSemaphore; @@ -2333,7 +2332,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 = "Croquet Closure Cog VM [CoInterpreterPrimitives VMMaker.oscog-eem.914]"; +const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreterPrimitives VMMaker.oscog-eem.915]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace;
@@ -42958,9 +42957,14 @@ static sqInt processWeakSurvivor(sqInt weakObj) { DECL_MAYBE_SQ_GLOBAL_STRUCT + sqInt classFormat; + sqInt classIndex; + sqInt classPointer; + sqInt classTablePage; sqInt hasYoungReferents; sqInt i; sqInt iLimiT; + sqInt numStrongSlots; sqInt referent; sqInt referent1; sqInt weakObjShouldMourn; @@ -42969,7 +42973,41 @@ /* N.B. generateToByDoLimitExpression:negative:on: guards against (unsigned)0 - 1 going +ve */
weakObjShouldMourn = (hasYoungReferents = 0); - for (i = (fixedFieldsOfClassFormat(formatOfClass(fetchClassOfNonImm(weakObj)))), iLimiT = ((numSlotsOf(weakObj)) - 1); i <= iLimiT; i += 1) { + /* begin fixedFieldsOfClassFormat: */ + /* begin formatOfClass: */ + /* begin fetchClassOfNonImm: */ + classIndex = (longAt(weakObj)) & 0x3FFFFF; + if (classIndex <= 0x1F) { + if (classIndex == 0x1F) { + classPointer = weakObj; + goto l1; + } + if (classIndex == 8) { + classPointer = 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)) { + classPointer = GIV(nilObj); + goto l1; + } + classPointer = longAt((classTablePage + BaseHeaderSize) + ((classIndex & ((1 << 10) - 1)) << 2)); +l1: /* end fetchClassOfNonImm: */; + classFormat = ((longAt((classPointer + BaseHeaderSize) + (InstanceSpecificationIndex << 2))) >> 1); + numStrongSlots = classFormat & ((1 << 16) - 1); + for (i = 0; i < numStrongSlots; i += 1) { + referent = longAt((weakObj + BaseHeaderSize) + (i << 2)); + if (((referent & 3) == 0) + && (isYoungObject(referent))) { + hasYoungReferents = 1; + } + } + for (i = numStrongSlots, iLimiT = ((numSlotsOf(weakObj)) - 1); i <= iLimiT; i += 1) {
/* Referent could be forwarded due to scavenging or a become:, don't assume. */
@@ -48981,12 +49019,6 @@ }
static sqInt -fixedFieldsOfClassFormat(sqInt classFormat) -{ - return classFormat & ((1 << 16) - 1); -} - -static sqInt fixedFieldsOfClass(sqInt objOop) { return (((longAt((objOop + BaseHeaderSize) + (InstanceSpecificationIndex << 2))) >> 1)) & ((1 << 16) - 1); @@ -65650,6 +65682,9 @@ } do { assert(!(isForwarded(currClass))); + if (!(addressCouldBeClassObj(currClass))) { + return GIV(nilObj); + } /* begin noFixupFollowField:ofObject: */ objOop1 = longAt((currClass + BaseHeaderSize) + (MethodDictionaryIndex << 2)); if (((objOop1 & 3) == 0) @@ -65717,59 +65752,21 @@ sqInt findClassOfMethodforReceiver(sqInt meth, sqInt rcvr) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt classIndex; - sqInt classTablePage; - sqInt mclass; sqInt rclass; - sqInt tagBits;
if ((((rcvr & 3) != 0) || (addressCouldBeObj(rcvr))) && (!(((rcvr & 3) == 0) && (((longAt(rcvr)) & 0x3FFFFF) == 8)))) { - /* begin fetchClassOf: */ - if (((tagBits = rcvr & 3)) != 0) { - rclass = longAt((GIV(classTableFirstPage) + BaseHeaderSize) + (tagBits << 2)); - goto l1; + rclass = findClassContainingMethodstartingAt(meth, fetchClassOf(rcvr)); + if (rclass != GIV(nilObj)) { + return rclass; } - /* begin fetchClassOfNonImm: */ - classIndex = (longAt(rcvr)) & 0x3FFFFF; - if (classIndex <= 0x1F) { - if (classIndex == 0x1F) { - rclass = rcvr; - goto l1; - } - if (classIndex == 8) { - rclass = 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)) { - rclass = GIV(nilObj); - goto l1; - } - rclass = longAt((classTablePage + BaseHeaderSize) + ((classIndex & ((1 << 10) - 1)) << 2)); - l1: /* end fetchClassOf: */; - if (addressCouldBeClassObj(rclass)) { - rclass = findClassContainingMethodstartingAt(meth, rclass); - if (rclass != GIV(nilObj)) { - return rclass; - } - } } if (!((addressCouldBeObj(meth)) && (((((usqInt) (longAt(meth))) >> 24) & 0x1F) >= 24))) { return GIV(nilObj); } - mclass = safeMethodClassOf(meth); - if (addressCouldBeClassObj(mclass)) { - return GIV(nilObj); - } return findClassContainingMethodstartingAt(meth, safeMethodClassOf(meth)); }
@@ -69257,14 +69254,10 @@ static void printActivationNameForreceiverisBlockfirstTemporary(sqInt aMethod, sqInt anObject, sqInt isBlock, sqInt maybeMessage) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt classIndex; sqInt classObj; - sqInt classTablePage; - sqInt mclass; sqInt methClass; sqInt methodSel; sqInt rclass; - sqInt tagBits;
if (isBlock) { print("[] in "); @@ -69274,52 +69267,17 @@ || (addressCouldBeObj(anObject))) && (!(((anObject & 3) == 0) && (((longAt(anObject)) & 0x3FFFFF) == 8)))) { - /* begin fetchClassOf: */ - if (((tagBits = anObject & 3)) != 0) { - rclass = longAt((GIV(classTableFirstPage) + BaseHeaderSize) + (tagBits << 2)); - goto l2; + rclass = findClassContainingMethodstartingAt(aMethod, fetchClassOf(anObject)); + if (rclass != GIV(nilObj)) { + methClass = rclass; + goto l1; } - /* begin fetchClassOfNonImm: */ - classIndex = (longAt(anObject)) & 0x3FFFFF; - if (classIndex <= 0x1F) { - if (classIndex == 0x1F) { - rclass = anObject; - goto l2; - } - if (classIndex == 8) { - rclass = 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)) { - rclass = GIV(nilObj); - goto l2; - } - rclass = longAt((classTablePage + BaseHeaderSize) + ((classIndex & ((1 << 10) - 1)) << 2)); - l2: /* end fetchClassOf: */; - if (addressCouldBeClassObj(rclass)) { - rclass = findClassContainingMethodstartingAt(aMethod, rclass); - if (rclass != GIV(nilObj)) { - methClass = rclass; - goto l1; - } - } } if (!((addressCouldBeObj(aMethod)) && (((((usqInt) (longAt(aMethod))) >> 24) & 0x1F) >= 24))) { methClass = GIV(nilObj); goto l1; } - mclass = safeMethodClassOf(aMethod); - if (addressCouldBeClassObj(mclass)) { - methClass = GIV(nilObj); - goto l1; - } methClass = findClassContainingMethodstartingAt(aMethod, safeMethodClassOf(aMethod)); l1: /* end findClassOfMethod:forReceiver: */; methodSel = findSelectorOfMethod(aMethod);
Modified: branches/Cog/spursistasrc/vm/cointerp.h =================================================================== --- branches/Cog/spursistasrc/vm/cointerp.h 2014-10-29 23:58:59 UTC (rev 3117) +++ branches/Cog/spursistasrc/vm/cointerp.h 2014-10-31 00:33:06 UTC (rev 3118) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 */
Modified: branches/Cog/spursistasrc/vm/gcc3x-cointerp.c =================================================================== --- branches/Cog/spursistasrc/vm/gcc3x-cointerp.c 2014-10-29 23:58:59 UTC (rev 3117) +++ branches/Cog/spursistasrc/vm/gcc3x-cointerp.c 2014-10-31 00:33:06 UTC (rev 3118) @@ -2,11 +2,11 @@
/* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 from - CoInterpreter VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 + CoInterpreter VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -968,7 +968,6 @@ sqInt firstShortFormat(void); sqInt fixedFieldsFieldWidth(void); sqInt fixedFieldsOfClassFormatMask(void); -static sqInt fixedFieldsOfClassFormat(sqInt classFormat) NoDbgRegParms; static sqInt fixedFieldsOfClass(sqInt objOop) NoDbgRegParms; static sqInt fixedFieldsOfformatlength(sqInt objOop, sqInt fmt, sqInt wordLength) NoDbgRegParms; static sqInt fixFollowedFieldofObjectwithInitialValue(sqInt fieldIndex, sqInt anObject, sqInt initialValue) NoDbgRegParms NeverInline; @@ -1545,8 +1544,8 @@ _iss sqInt * freeLists; _iss sqInt rememberedSetSize; _iss sqInt * rememberedSet; -_iss sqInt classTableFirstPage; _iss usqInt freeListsMask; +_iss sqInt classTableFirstPage; _iss sqInt profileProcess; _iss sqInt longRunningPrimitiveCheckSemaphore; _iss sqInt profileSemaphore; @@ -2336,7 +2335,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 = "Croquet Closure Cog VM [CoInterpreterPrimitives VMMaker.oscog-eem.914]"; +const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreterPrimitives VMMaker.oscog-eem.915]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace;
@@ -42967,9 +42966,14 @@ static sqInt processWeakSurvivor(sqInt weakObj) { DECL_MAYBE_SQ_GLOBAL_STRUCT + sqInt classFormat; + sqInt classIndex; + sqInt classPointer; + sqInt classTablePage; sqInt hasYoungReferents; sqInt i; sqInt iLimiT; + sqInt numStrongSlots; sqInt referent; sqInt referent1; sqInt weakObjShouldMourn; @@ -42978,7 +42982,41 @@ /* N.B. generateToByDoLimitExpression:negative:on: guards against (unsigned)0 - 1 going +ve */
weakObjShouldMourn = (hasYoungReferents = 0); - for (i = (fixedFieldsOfClassFormat(formatOfClass(fetchClassOfNonImm(weakObj)))), iLimiT = ((numSlotsOf(weakObj)) - 1); i <= iLimiT; i += 1) { + /* begin fixedFieldsOfClassFormat: */ + /* begin formatOfClass: */ + /* begin fetchClassOfNonImm: */ + classIndex = (longAt(weakObj)) & 0x3FFFFF; + if (classIndex <= 0x1F) { + if (classIndex == 0x1F) { + classPointer = weakObj; + goto l1; + } + if (classIndex == 8) { + classPointer = 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)) { + classPointer = GIV(nilObj); + goto l1; + } + classPointer = longAt((classTablePage + BaseHeaderSize) + ((classIndex & ((1 << 10) - 1)) << 2)); +l1: /* end fetchClassOfNonImm: */; + classFormat = ((longAt((classPointer + BaseHeaderSize) + (InstanceSpecificationIndex << 2))) >> 1); + numStrongSlots = classFormat & ((1 << 16) - 1); + for (i = 0; i < numStrongSlots; i += 1) { + referent = longAt((weakObj + BaseHeaderSize) + (i << 2)); + if (((referent & 3) == 0) + && (isYoungObject(referent))) { + hasYoungReferents = 1; + } + } + for (i = numStrongSlots, iLimiT = ((numSlotsOf(weakObj)) - 1); i <= iLimiT; i += 1) {
/* Referent could be forwarded due to scavenging or a become:, don't assume. */
@@ -48990,12 +49028,6 @@ }
static sqInt -fixedFieldsOfClassFormat(sqInt classFormat) -{ - return classFormat & ((1 << 16) - 1); -} - -static sqInt fixedFieldsOfClass(sqInt objOop) { return (((longAt((objOop + BaseHeaderSize) + (InstanceSpecificationIndex << 2))) >> 1)) & ((1 << 16) - 1); @@ -65659,6 +65691,9 @@ } do { assert(!(isForwarded(currClass))); + if (!(addressCouldBeClassObj(currClass))) { + return GIV(nilObj); + } /* begin noFixupFollowField:ofObject: */ objOop1 = longAt((currClass + BaseHeaderSize) + (MethodDictionaryIndex << 2)); if (((objOop1 & 3) == 0) @@ -65726,59 +65761,21 @@ sqInt findClassOfMethodforReceiver(sqInt meth, sqInt rcvr) { DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ Diff output truncated at 50000 characters. @@
vm-dev@lists.squeakfoundation.org