Revision: 3120 Author: eliot Date: 2014-10-31 12:13:28 -0700 (Fri, 31 Oct 2014) Log Message: ----------- CogVM source as per VMMaker.oscog-eem.916
Spur: Reimplement deriving the accessorDepth and retrying primitives on primitive failure machinery. Always take the primitive index from newMethod (setting newMethod to a SmallInteger for primitiveDoPrimitiveWithArgs.
Have the Cogit always set primitiveFunctionPointer and newMethod for the retry.
Add isNonInteger(Non)Immediate: and use it in several of the integer conversion routines that were missing code to exclude Character immediates, with fatal consequences.
With these changes the Pharo 4 test suite runs without crashing on the latest Pharo Spur boot image.
Modified Paths: -------------- branches/Cog/nscogsrc/vm/cogit.c branches/Cog/nscogsrc/vm/cogit.h branches/Cog/nscogsrc/vm/cointerp.c branches/Cog/nscogsrc/vm/cointerp.h branches/Cog/nscogsrc/vm/gcc3x-cointerp.c branches/Cog/nsspursrc/vm/cogit.c branches/Cog/nsspursrc/vm/cogit.h branches/Cog/nsspursrc/vm/cointerp.c branches/Cog/nsspursrc/vm/cointerp.h branches/Cog/nsspursrc/vm/gcc3x-cointerp.c branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c branches/Cog/nsspurstacksrc/vm/interp.c branches/Cog/sistasrc/vm/cogit.c branches/Cog/sistasrc/vm/cogit.h branches/Cog/sistasrc/vm/cointerp.c branches/Cog/sistasrc/vm/cointerp.h branches/Cog/sistasrc/vm/gcc3x-cointerp.c branches/Cog/spursistasrc/vm/cogit.c branches/Cog/spursistasrc/vm/cogit.h branches/Cog/spursistasrc/vm/cointerp.c branches/Cog/spursistasrc/vm/cointerp.h branches/Cog/spursistasrc/vm/gcc3x-cointerp.c branches/Cog/spursrc/vm/cogit.c branches/Cog/spursrc/vm/cogit.h branches/Cog/spursrc/vm/cointerp.c branches/Cog/spursrc/vm/cointerp.h branches/Cog/spursrc/vm/gcc3x-cointerp.c branches/Cog/spurstacksrc/vm/gcc3x-interp.c branches/Cog/spurstacksrc/vm/interp.c branches/Cog/src/vm/cogit.c branches/Cog/src/vm/cogit.h branches/Cog/src/vm/cointerp.c branches/Cog/src/vm/cointerp.h branches/Cog/src/vm/cointerpmt.c branches/Cog/src/vm/cointerpmt.h branches/Cog/src/vm/gcc3x-cointerp.c branches/Cog/src/vm/gcc3x-cointerpmt.c branches/Cog/stacksrc/vm/gcc3x-interp.c branches/Cog/stacksrc/vm/interp.c
Property Changed: ---------------- branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
Modified: branches/Cog/nscogsrc/vm/cogit.c =================================================================== --- branches/Cog/nscogsrc/vm/cogit.c 2014-10-31 19:11:22 UTC (rev 3119) +++ branches/Cog/nscogsrc/vm/cogit.c 2014-10-31 19:13:28 UTC (rev 3120) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.911 uuid: 39c7bff8-ff88-43a5-88bc-cbbdb206cbcd + CCodeGenerator VMMaker.oscog-eem.916 uuid: 79925bdf-769f-446f-8532-f04f0e2f11ae from - StackToRegisterMappingCogit VMMaker.oscog-eem.911 uuid: 39c7bff8-ff88-43a5-88bc-cbbdb206cbcd + StackToRegisterMappingCogit VMMaker.oscog-eem.916 uuid: 79925bdf-769f-446f-8532-f04f0e2f11ae */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.911 uuid: 39c7bff8-ff88-43a5-88bc-cbbdb206cbcd " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.916 uuid: 79925bdf-769f-446f-8532-f04f0e2f11ae " __DATE__ ; char *__cogitBuildInfo = __buildInfo;
Modified: branches/Cog/nscogsrc/vm/cogit.h =================================================================== --- branches/Cog/nscogsrc/vm/cogit.h 2014-10-31 19:11:22 UTC (rev 3119) +++ branches/Cog/nscogsrc/vm/cogit.h 2014-10-31 19:13:28 UTC (rev 3120) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.911 uuid: 39c7bff8-ff88-43a5-88bc-cbbdb206cbcd + CCodeGenerator VMMaker.oscog-eem.916 uuid: 79925bdf-769f-446f-8532-f04f0e2f11ae */
Modified: branches/Cog/nscogsrc/vm/cointerp.c =================================================================== --- branches/Cog/nscogsrc/vm/cointerp.c 2014-10-31 19:11:22 UTC (rev 3119) +++ branches/Cog/nscogsrc/vm/cointerp.c 2014-10-31 19:13:28 UTC (rev 3120) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.916 uuid: 79925bdf-769f-446f-8532-f04f0e2f11ae from - CoInterpreter VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 + CoInterpreter VMMaker.oscog-eem.916 uuid: 79925bdf-769f-446f-8532-f04f0e2f11ae */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.916 uuid: 79925bdf-769f-446f-8532-f04f0e2f11ae " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -275,7 +275,6 @@ #define NilObject 0 #define OldBecameNewFlag 4 #define PrimCallCollectsProfileSamples 8 -#define PrimCallDoNotJIT 32 #define PrimCallMayCallBack 4 #define PrimCallNeedsNewMethod 1 #define PrimCallNeedsPrimitiveFunction 2 @@ -1338,32 +1337,33 @@ _iss char * stackBasePlus1; _iss sqInt trueObj; _iss sqInt falseObj; -_iss sqInt remapBufferCount; _iss sqInt bytesPerPage; _iss sqInt traceLogIndex; +_iss sqInt remapBufferCount; _iss usqInt reserveStart; _iss char * stackLimit; _iss sqInt rootTableCount; _iss usqInt memoryLimit; -_iss usqInt endOfMemory; _iss usqInt scavengeThreshold; +_iss usqInt endOfMemory; _iss unsigned char primTraceLogIndex; _iss StackPage * mostRecentlyUsedPage; _iss sqInt numStackPages; +_iss sqInt tempOop; _iss sqInt needGCFlag; _iss sqInt profileProcess; +_iss sqLong nextProfileTick; _iss sqInt jmpDepth; _iss sqInt longRunningPrimitiveCheckSemaphore; -_iss sqLong nextProfileTick; _iss sqInt profileSemaphore; _iss sqInt profileMethod; _iss usqInt fwdTableNext; -_iss sqInt tempOop; _iss sqInt longRunningPrimitiveCheckMethod; _iss usqInt compStart; _iss sqInt extraRootCount; _iss sqInt classNameIndex; _iss sqInt statGrowMemory; +_iss sqInt tempOop2; _iss sqInt weakRootCount; _iss sqInt growHeadroom; _iss sqInt lastMethodCacheProbeWrite; @@ -2087,7 +2087,7 @@ /* 574 */ (void (*)(void))0, /* 575 */ (void (*)(void))0, 0 }; -const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.914"; +const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.916"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace;
@@ -5351,6 +5351,7 @@ primTraceLogIndex(GIV(primTraceLogIndex) + 1); } assert(!(isOopForwarded(stackValue(GIV(argumentCount))))); + assert((remapBufferCount()) == 0); nArgs = GIV(argumentCount); savedStackPointer = GIV(stackPointer); savedFramePointer = GIV(framePointer); @@ -5358,8 +5359,8 @@ /* begin initPrimCall */ GIV(primFailCode) = 0; dispatchFunctionPointer(primitiveFunctionPointer); - assert((remapBufferCount()) == 0); - + /* begin maybeRetryFailureDueToForwarding */ + ; /* begin maybeFailForLastObjectOverwrite */ if (checkAllocFiller) { if (((freeStart()) < GIV(scavengeThreshold)) @@ -16984,6 +16985,7 @@ primTraceLogIndex(GIV(primTraceLogIndex) + 1); } assert(!(isOopForwarded(stackValue(GIV(argumentCount))))); + assert((remapBufferCount()) == 0); nArgs = GIV(argumentCount); savedStackPointer = GIV(stackPointer); savedFramePointer = GIV(framePointer); @@ -16991,8 +16993,8 @@ /* begin initPrimCall */ GIV(primFailCode) = 0; dispatchFunctionPointer(primitiveFunctionPointer); - assert((remapBufferCount()) == 0); - + /* begin maybeRetryFailureDueToForwarding */ + ; /* begin maybeFailForLastObjectOverwrite */ if (checkAllocFiller) { if (((freeStart()) < GIV(scavengeThreshold)) @@ -18295,30 +18297,25 @@ primitivePropertyFlags(sqInt primIndex) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt baseFlags; - void (*functionPointer)(void); + sqInt baseFlags1;
- /* begin functionPointerFor:inClass: */ - functionPointer = ((void (*)(void)) ((primIndex > MaxPrimitiveIndex - ? 0 - : primitiveTable[primIndex]))); - - baseFlags = (GIV(profileSemaphore) != GIV(nilObj) + /* begin primitivePropertyFlagsForV3: */ + baseFlags1 = (GIV(profileSemaphore) != GIV(nilObj) ? PrimCallNeedsNewMethod + PrimCallCollectsProfileSamples : 0); - if (GIV(longRunningPrimitiveCheckSemaphore) != null) { - baseFlags = baseFlags | PrimCallNeedsNewMethod; + if (!(GIV(longRunningPrimitiveCheckSemaphore) == null)) { + baseFlags1 = baseFlags1 | PrimCallNeedsNewMethod; } - if ((functionPointer == primitiveExternalCall) - || (functionPointer == primitiveCalloutToFFI)) { + null; + if ((primIndex == 117) + || (primIndex == 120)) {
/* For callbacks */
- baseFlags = baseFlags | ((PrimCallNeedsNewMethod + PrimCallNeedsPrimitiveFunction) + PrimCallMayCallBack); - if (checkAllocFiller) { - baseFlags = baseFlags | CheckAllocationFillerAfterPrimCall; - } + baseFlags1 = baseFlags1 | ((PrimCallNeedsNewMethod + PrimCallNeedsPrimitiveFunction) + PrimCallMayCallBack); } - return baseFlags; + return baseFlags1; + }
void * @@ -20161,6 +20158,7 @@ primTraceLogIndex(GIV(primTraceLogIndex) + 1); } assert(!(isOopForwarded(stackValue(GIV(argumentCount))))); + assert((remapBufferCount()) == 0); nArgs = GIV(argumentCount); savedStackPointer = GIV(stackPointer); savedFramePointer = GIV(framePointer); @@ -20168,8 +20166,8 @@ /* begin initPrimCall */ GIV(primFailCode) = 0; dispatchFunctionPointer(primitiveFunctionPointer); - assert((remapBufferCount()) == 0); - + /* begin maybeRetryFailureDueToForwarding */ + ; /* begin maybeFailForLastObjectOverwrite */ if (checkAllocFiller) { if (((freeStart()) < GIV(scavengeThreshold)) @@ -22823,6 +22821,7 @@ if (ok) { return 1; } + /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; @@ -22909,6 +22908,7 @@ } return ((usqLong) smallIntValue); } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((oop & 1))); ccIndex1 = (((usqInt) (longAt(oop))) >> (compactClassFieldLSB())) & 0x1F; @@ -22999,9 +22999,7 @@ } return value; } - else { - ; - } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((oop & 1))); ccIndex = (((usqInt) (longAt(oop))) >> (compactClassFieldLSB())) & 0x1F; @@ -23050,6 +23048,7 @@ } return (oop >> 1); } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((oop & 1))); ccIndex = (((usqInt) (longAt(oop))) >> (compactClassFieldLSB())) & 0x1F; @@ -23104,6 +23103,7 @@ } return value; } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((oop & 1))); ccIndex = (((usqInt) (longAt(oop))) >> (compactClassFieldLSB())) & 0x1F; @@ -30037,6 +30037,7 @@ size = value; goto l1; } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((oop1 & 1))); ccIndex = (((usqInt) (longAt(oop1))) >> (compactClassFieldLSB())) & 0x1F; @@ -33834,6 +33835,7 @@ if ((oop & 1)) { return (oop >> 1); } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((oop & 1))); ccIndex1 = (((usqInt) (longAt(oop))) >> (compactClassFieldLSB())) & 0x1F; @@ -33920,6 +33922,7 @@ if ((oop & 1)) { return ((sqLong) ((oop >> 1))); } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((oop & 1))); ccIndex1 = (((usqInt) (longAt(oop))) >> (compactClassFieldLSB())) & 0x1F; @@ -34025,6 +34028,7 @@ if ((oop & 1)) { return (oop >> 1); } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((oop & 1))); ccIndex1 = (((usqInt) (longAt(oop))) >> (compactClassFieldLSB())) & 0x1F; @@ -43718,6 +43722,11 @@ ok = 0; } } + if (!(GIV(tempOop2) == 0)) { + if (!(checkOopIntegritynamed(GIV(tempOop2), "tempOop2"))) { + ok = 0; + } + } for (i = 1; i <= GIV(jmpDepth); i += 1) { if (!(checkOopIntegritynamedindex(GIV(suspendedCallbacks)[i], "suspendedCallbacks", i))) { ok = 0; @@ -45417,6 +45426,9 @@
do { assert(!(isForwarded(currClass))); + if (!(addressCouldBeClassObj(currClass))) { + return GIV(nilObj); + } classDict = longAt((currClass + BaseHeaderSize) + (MethodDictionaryIndex << ShiftForWord)); assert(!(isForwarded(classDict))); /* begin numSlotsOf: */ @@ -45445,7 +45457,6 @@ findClassOfMethodforReceiver(sqInt meth, sqInt rcvr) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt ccIndex; - sqInt mclass; sqInt rclass;
if ((((rcvr & 1)) @@ -45454,16 +45465,13 @@ && (((((usqInt)rcvr)) < GIV(freeStart)) && (((longAt(rcvr)) & TypeMask) != HeaderTypeGC))))) && (!0)) { - rclass = ((rcvr & 1) + rclass = findClassContainingMethodstartingAt(meth, ((rcvr & 1) ? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << ShiftForWord)) : (((ccIndex = (((usqInt) (longAt(rcvr))) >> (compactClassFieldLSB())) & 0x1F)) == 0 ? (longAt(rcvr - BaseHeaderSize)) & AllButTypeMask - : longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord)))); - if (addressCouldBeClassObj(rclass)) { - rclass = findClassContainingMethodstartingAt(meth, rclass); - if (rclass != GIV(nilObj)) { - return rclass; - } + : longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord))))); + if (rclass != GIV(nilObj)) { + return rclass; } } if (!((((meth & 3) == 0) @@ -45473,10 +45481,6 @@ && (((((usqInt) (longAt(meth))) >> (instFormatFieldLSB())) & 15) >= 12))) { return GIV(nilObj); } - mclass = safeMethodClassOf(meth); - if (addressCouldBeClassObj(mclass)) { - return GIV(nilObj); - } return findClassContainingMethodstartingAt(meth, safeMethodClassOf(meth)); }
@@ -47370,6 +47374,12 @@ && (((longAt(GIV(tempOop))) & MarkBit) != 0)))) { GIV(tempOop) = remapObj(GIV(tempOop)); } + if ((GIV(tempOop2) != 0) + && (((GIV(tempOop2) & 1) == 0) + && (((GIV(tempOop2) & 1) == 0) + && (((longAt(GIV(tempOop2))) & MarkBit) != 0)))) { + GIV(tempOop2) = remapObj(GIV(tempOop2)); + } }
@@ -47435,6 +47445,9 @@ if (!(GIV(tempOop) == 0)) { markAndTrace(GIV(tempOop)); } + if (!(GIV(tempOop2) == 0)) { + markAndTrace(GIV(tempOop2)); + } for (i = 1, iLimiT = (remapBufferCount()); i <= iLimiT; i += 1) { oop = GIV(remapBuffer)[i]; if (!((oop & 1))) { @@ -48511,7 +48524,6 @@ sqInt ccIndex1; sqInt ccIndex2; sqInt classObj; - sqInt mclass; sqInt methClass; sqInt methodSel; sqInt rclass; @@ -48526,17 +48538,14 @@ && (((((usqInt)anObject)) < GIV(freeStart)) && (((longAt(anObject)) & TypeMask) != HeaderTypeGC))))) && (!0)) { - rclass = ((anObject & 1) + rclass = findClassContainingMethodstartingAt(aMethod, ((anObject & 1) ? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << ShiftForWord)) : (((ccIndex2 = (((usqInt) (longAt(anObject))) >> (compactClassFieldLSB())) & 0x1F)) == 0 ? (longAt(anObject - BaseHeaderSize)) & AllButTypeMask - : longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex2 - 1) << ShiftForWord)))); - if (addressCouldBeClassObj(rclass)) { - rclass = findClassContainingMethodstartingAt(aMethod, rclass); - if (rclass != GIV(nilObj)) { - methClass = rclass; - goto l1; - } + : longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex2 - 1) << ShiftForWord))))); + if (rclass != GIV(nilObj)) { + methClass = rclass; + goto l1; } } if (!((((aMethod & 3) == 0) @@ -48547,11 +48556,6 @@ 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); @@ -51594,6 +51598,7 @@ } return value; } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((integerPointer & 1))); ccIndex = (((usqInt) (longAt(integerPointer))) >> (compactClassFieldLSB())) & 0x1F; @@ -51640,6 +51645,7 @@ if ((integerPointer & 1)) { return (integerPointer >> 1); } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((integerPointer & 1))); ccIndex1 = (((usqInt) (longAt(integerPointer))) >> (compactClassFieldLSB())) & 0x1F; @@ -53421,7 +53427,6 @@ sqInt argumentArray; sqInt arraySize; sqInt ccIndex; - sqInt ctxtRcvr; sqInt firstBytecode; sqInt fmt; sqInt fmt1; @@ -53437,14 +53442,10 @@ sqInt methodHeader; sqInt moduleLength; sqInt moduleName; - sqInt oop; - sqInt oop1; - sqInt oop2; - sqInt oop3; - sqInt oop4; - sqInt oop5; - sqInt oop6; - sqInt oop7; + sqInt object; + sqInt object1; + sqInt object2; + sqInt object3; sqInt primBits; sqInt primRcvr; char *sp; @@ -53461,6 +53462,10 @@ sqInt sz2; sqInt top; sqInt top1; + sqInt valuePointer; + sqInt valuePointer1; + sqInt valuePointer2; + sqInt valuePointer3;
argumentArray = longAt(GIV(stackPointer)); methodArg = longAt(GIV(stackPointer) + (2 * BytesPerWord)); @@ -53608,40 +53613,25 @@ (GIV(primFailCode) = -1); return; } - /* begin pushRemappableOop: */ - oop = (argumentArray = popStack()); - assert(addressCouldBeOop(oop)); - GIV(remapBuffer)[(GIV(remapBufferCount) += 1)] = oop; - if (!(GIV(remapBufferCount) <= RemapBufferSize)) { - error("remapBuffer overflow"); - } - /* begin pushRemappableOop: */ - oop1 = (primRcvr = popStack()); - assert(addressCouldBeOop(oop1)); - GIV(remapBuffer)[(GIV(remapBufferCount) += 1)] = oop1; - if (!(GIV(remapBufferCount) <= RemapBufferSize)) { - error("remapBuffer overflow"); - } - /* begin pushRemappableOop: */ + GIV(tempOop) = eeInstantiateClassIndexformatnumSlots(ClassArrayCompactIndex, 2, 4); + /* begin storePointerUnchecked:ofObject:withValue: */ + valuePointer = (argumentArray = popStack()); + longAtput((GIV(tempOop) + BaseHeaderSize) + (0 << ShiftForWord), valuePointer); + /* begin storePointerUnchecked:ofObject:withValue: */ + valuePointer1 = (primRcvr = popStack()); + longAtput((GIV(tempOop) + BaseHeaderSize) + (1 << ShiftForWord), valuePointer1); + /* begin storePointerUnchecked:ofObject:withValue: */ /* begin popStack */ top = longAt(GIV(stackPointer)); GIV(stackPointer) += BytesPerWord; - oop2 = top; - assert(addressCouldBeOop(oop2)); - GIV(remapBuffer)[(GIV(remapBufferCount) += 1)] = oop2; - if (!(GIV(remapBufferCount) <= RemapBufferSize)) { - error("remapBuffer overflow"); - } - /* begin pushRemappableOop: */ + valuePointer2 = top; + longAtput((GIV(tempOop) + BaseHeaderSize) + (2 << ShiftForWord), valuePointer2); + /* begin storePointerUnchecked:ofObject:withValue: */ /* begin popStack */ top1 = longAt(GIV(stackPointer)); GIV(stackPointer) += BytesPerWord; - oop3 = top1; - assert(addressCouldBeOop(oop3)); - GIV(remapBuffer)[(GIV(remapBufferCount) += 1)] = oop3; - if (!(GIV(remapBufferCount) <= RemapBufferSize)) { - error("remapBuffer overflow"); - } + valuePointer3 = top1; + longAtput((GIV(tempOop) + BaseHeaderSize) + (3 << ShiftForWord), valuePointer3); /* begin push: */ longAtput((sp5 = GIV(stackPointer) - BytesPerWord), primRcvr); GIV(stackPointer) = sp5; @@ -53652,6 +53642,7 @@ GIV(stackPointer) = sp; } /* begin callExternalPrimitive: */ + ; dispatchFunctionPointer(addr); /* begin maybeFailForLastObjectOverwrite */ if (checkAllocFiller) { @@ -53660,22 +53651,7 @@ GIV(primFailCode) = PrimErrWritePastObject; } } - /* begin popRemappableOop */ - oop4 = GIV(remapBuffer)[GIV(remapBufferCount)]; - GIV(remapBufferCount) -= 1; - ctxtRcvr = oop4; - /* begin popRemappableOop */ - oop5 = GIV(remapBuffer)[GIV(remapBufferCount)]; - GIV(remapBufferCount) -= 1; - methodArg = oop5; - /* begin popRemappableOop */ - oop6 = GIV(remapBuffer)[GIV(remapBufferCount)]; - GIV(remapBufferCount) -= 1; - primRcvr = oop6; - /* begin popRemappableOop */ - oop7 = GIV(remapBuffer)[GIV(remapBufferCount)]; - GIV(remapBufferCount) -= 1; - argumentArray = oop7; + if (GIV(primFailCode)) {
/* If primitive failed, then restore state for failure code */ @@ -53684,16 +53660,20 @@ GIV(stackPointer) += (arraySize + 1) * BytesPerWord; null; /* begin push: */ - longAtput((sp1 = GIV(stackPointer) - BytesPerWord), ctxtRcvr); + object = longAt((GIV(tempOop) + BaseHeaderSize) + (3 << ShiftForWord)); + longAtput((sp1 = GIV(stackPointer) - BytesPerWord), object); GIV(stackPointer) = sp1; /* begin push: */ - longAtput((sp2 = GIV(stackPointer) - BytesPerWord), methodArg); + object1 = longAt((GIV(tempOop) + BaseHeaderSize) + (2 << ShiftForWord)); + longAtput((sp2 = GIV(stackPointer) - BytesPerWord), object1); GIV(stackPointer) = sp2; /* begin push: */ - longAtput((sp3 = GIV(stackPointer) - BytesPerWord), primRcvr); + object2 = longAt((GIV(tempOop) + BaseHeaderSize) + (1 << ShiftForWord)); + longAtput((sp3 = GIV(stackPointer) - BytesPerWord), object2); GIV(stackPointer) = sp3; /* begin push: */ - longAtput((sp4 = GIV(stackPointer) - BytesPerWord), argumentArray); + object3 = longAt((GIV(tempOop) + BaseHeaderSize) + (0 << ShiftForWord)); + longAtput((sp4 = GIV(stackPointer) - BytesPerWord), object3); GIV(stackPointer) = sp4;
/* Hack. A nil prim error code (primErrorCode = 1) is interpreted by the image @@ -53716,9 +53696,12 @@ sqInt index; sqInt integerPointer; sqInt nArgs; + sqInt nArgs1; sqInt primIdx; char *savedFramePointer; + char *savedFramePointer1; char *savedStackPointer; + char *savedStackPointer1; char *sp; char *sp1; char *sp2; @@ -53778,6 +53761,7 @@ ? 0 : primitiveTable[primIdx]))); if (primitiveFunctionPointer == 0) { + primitiveFunctionPointer = primitiveDoPrimitiveWithArgs; /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; @@ -53811,15 +53795,16 @@ primTraceLogIndex(GIV(primTraceLogIndex) + 1); } assert(!(isOopForwarded(stackValue(GIV(argumentCount))))); - nArgs = GIV(argumentCount); - savedStackPointer = GIV(stackPointer); - savedFramePointer = GIV(framePointer); + assert((remapBufferCount()) == 0); + nArgs1 = GIV(argumentCount); + savedStackPointer1 = GIV(stackPointer); + savedFramePointer1 = GIV(framePointer);
/* begin initPrimCall */ GIV(primFailCode) = 0; dispatchFunctionPointer(primitiveFunctionPointer); - assert((remapBufferCount()) == 0); - + /* begin maybeRetryFailureDueToForwarding */ + ; /* begin maybeFailForLastObjectOverwrite */ if (checkAllocFiller) { if (((freeStart()) < GIV(scavengeThreshold)) @@ -53829,14 +53814,14 @@ } if (FailImbalancedPrimitives && ((!GIV(primFailCode)) - && ((GIV(framePointer) == savedFramePointer) + && ((GIV(framePointer) == savedFramePointer1) && (!((((usqInt)(longAt(GIV(framePointer) + FoxMethod)))) < (startOfMemory())))))) {
/* Don't fail if primitive has done something radical, e.g. perform: */
- if (GIV(stackPointer) != (savedStackPointer + (nArgs * BytesPerWord))) { + if (GIV(stackPointer) != (savedStackPointer1 + (nArgs1 * BytesPerWord))) { flag("Would be nice to make this a message send of e.g. unbalancedPrimitive to the current process or context"); - GIV(stackPointer) = savedStackPointer; + GIV(stackPointer) = savedStackPointer1; failUnbalancedPrimitive(); } } @@ -53844,6 +53829,7 @@ checkProfileTick(GIV(newMethod)); } !GIV(primFailCode); + if (GIV(primFailCode)) {
/* If primitive failed, then restore state for failure code */ @@ -53859,6 +53845,7 @@ /* begin push: */ longAtput((sp2 = GIV(stackPointer) - BytesPerWord), GIV(tempOop)); GIV(stackPointer) = sp2; + primitiveFunctionPointer = primitiveDoPrimitiveWithArgs; GIV(argumentCount) = 2; } GIV(tempOop) = 0; @@ -54104,6 +54091,7 @@ if (addr != 0) { rewriteMethodCacheEntryForExternalPrimitiveToFunction(addr); /* begin callExternalPrimitive: */ + ; dispatchFunctionPointer(addr); /* begin maybeFailForLastObjectOverwrite */ if (checkAllocFiller) { @@ -54112,6 +54100,8 @@ GIV(primFailCode) = PrimErrWritePastObject; } } + /* begin maybeRetryFailureDueToForwarding */ + ; return; } (GIV(primFailCode) = PrimErrNamedInternal); @@ -54196,6 +54186,7 @@ if (index >= 0) { rewriteMethodCacheEntryForExternalPrimitiveToFunction(addr); /* begin callExternalPrimitive: */ + ; dispatchFunctionPointer(addr); /* begin maybeFailForLastObjectOverwrite */ if (checkAllocFiller) { @@ -54204,6 +54195,8 @@ GIV(primFailCode) = PrimErrWritePastObject; } } + /* begin maybeRetryFailureDueToForwarding */ + ; } else {
Modified: branches/Cog/nscogsrc/vm/cointerp.h =================================================================== --- branches/Cog/nscogsrc/vm/cointerp.h 2014-10-31 19:11:22 UTC (rev 3119) +++ branches/Cog/nscogsrc/vm/cointerp.h 2014-10-31 19:13:28 UTC (rev 3120) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.916 uuid: 79925bdf-769f-446f-8532-f04f0e2f11ae */
Modified: branches/Cog/nscogsrc/vm/gcc3x-cointerp.c =================================================================== --- branches/Cog/nscogsrc/vm/gcc3x-cointerp.c 2014-10-31 19:11:22 UTC (rev 3119) +++ branches/Cog/nscogsrc/vm/gcc3x-cointerp.c 2014-10-31 19:13:28 UTC (rev 3120) @@ -2,11 +2,11 @@
/* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.916 uuid: 79925bdf-769f-446f-8532-f04f0e2f11ae from - CoInterpreter VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 + CoInterpreter VMMaker.oscog-eem.916 uuid: 79925bdf-769f-446f-8532-f04f0e2f11ae */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.914 uuid: bda96e1c-f22e-4b32-9ee1-620740e1fec5 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.916 uuid: 79925bdf-769f-446f-8532-f04f0e2f11ae " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -278,7 +278,6 @@ #define NilObject 0 #define OldBecameNewFlag 4 #define PrimCallCollectsProfileSamples 8 -#define PrimCallDoNotJIT 32 #define PrimCallMayCallBack 4 #define PrimCallNeedsNewMethod 1 #define PrimCallNeedsPrimitiveFunction 2 @@ -1341,32 +1340,33 @@ _iss char * stackBasePlus1; _iss sqInt trueObj; _iss sqInt falseObj; -_iss sqInt remapBufferCount; _iss sqInt bytesPerPage; _iss sqInt traceLogIndex; +_iss sqInt remapBufferCount; _iss usqInt reserveStart; _iss char * stackLimit; _iss sqInt rootTableCount; _iss usqInt memoryLimit; -_iss usqInt endOfMemory; _iss usqInt scavengeThreshold; +_iss usqInt endOfMemory; _iss unsigned char primTraceLogIndex; _iss StackPage * mostRecentlyUsedPage; _iss sqInt numStackPages; +_iss sqInt tempOop; _iss sqInt needGCFlag; _iss sqInt profileProcess; +_iss sqLong nextProfileTick; _iss sqInt jmpDepth; _iss sqInt longRunningPrimitiveCheckSemaphore; -_iss sqLong nextProfileTick; _iss sqInt profileSemaphore; _iss sqInt profileMethod; _iss usqInt fwdTableNext; -_iss sqInt tempOop; _iss sqInt longRunningPrimitiveCheckMethod; _iss usqInt compStart; _iss sqInt extraRootCount; _iss sqInt classNameIndex; _iss sqInt statGrowMemory; +_iss sqInt tempOop2; _iss sqInt weakRootCount; _iss sqInt growHeadroom; _iss sqInt lastMethodCacheProbeWrite; @@ -2090,7 +2090,7 @@ /* 574 */ (void (*)(void))0, /* 575 */ (void (*)(void))0, 0 }; -const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.914"; +const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.916"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace;
@@ -5360,6 +5360,7 @@ primTraceLogIndex(GIV(primTraceLogIndex) + 1); } assert(!(isOopForwarded(stackValue(GIV(argumentCount))))); + assert((remapBufferCount()) == 0); nArgs = GIV(argumentCount); savedStackPointer = GIV(stackPointer); savedFramePointer = GIV(framePointer); @@ -5367,8 +5368,8 @@ /* begin initPrimCall */ GIV(primFailCode) = 0; dispatchFunctionPointer(primitiveFunctionPointer); - assert((remapBufferCount()) == 0); - + /* begin maybeRetryFailureDueToForwarding */ + ; /* begin maybeFailForLastObjectOverwrite */ if (checkAllocFiller) { if (((freeStart()) < GIV(scavengeThreshold)) @@ -16993,6 +16994,7 @@ primTraceLogIndex(GIV(primTraceLogIndex) + 1); } assert(!(isOopForwarded(stackValue(GIV(argumentCount))))); + assert((remapBufferCount()) == 0); nArgs = GIV(argumentCount); savedStackPointer = GIV(stackPointer); savedFramePointer = GIV(framePointer); @@ -17000,8 +17002,8 @@ /* begin initPrimCall */ GIV(primFailCode) = 0; dispatchFunctionPointer(primitiveFunctionPointer); - assert((remapBufferCount()) == 0); - + /* begin maybeRetryFailureDueToForwarding */ + ; /* begin maybeFailForLastObjectOverwrite */ if (checkAllocFiller) { if (((freeStart()) < GIV(scavengeThreshold)) @@ -18304,30 +18306,25 @@ primitivePropertyFlags(sqInt primIndex) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt baseFlags; - void (*functionPointer)(void); + sqInt baseFlags1;
- /* begin functionPointerFor:inClass: */ - functionPointer = ((void (*)(void)) ((primIndex > MaxPrimitiveIndex - ? 0 - : primitiveTable[primIndex]))); - - baseFlags = (GIV(profileSemaphore) != GIV(nilObj) + /* begin primitivePropertyFlagsForV3: */ + baseFlags1 = (GIV(profileSemaphore) != GIV(nilObj) ? PrimCallNeedsNewMethod + PrimCallCollectsProfileSamples : 0); - if (GIV(longRunningPrimitiveCheckSemaphore) != null) { - baseFlags = baseFlags | PrimCallNeedsNewMethod; + if (!(GIV(longRunningPrimitiveCheckSemaphore) == null)) { + baseFlags1 = baseFlags1 | PrimCallNeedsNewMethod; } - if ((functionPointer == primitiveExternalCall) - || (functionPointer == primitiveCalloutToFFI)) { + null; + if ((primIndex == 117) + || (primIndex == 120)) {
/* For callbacks */
- baseFlags = baseFlags | ((PrimCallNeedsNewMethod + PrimCallNeedsPrimitiveFunction) + PrimCallMayCallBack); - if (checkAllocFiller) { - baseFlags = baseFlags | CheckAllocationFillerAfterPrimCall; - } + baseFlags1 = baseFlags1 | ((PrimCallNeedsNewMethod + PrimCallNeedsPrimitiveFunction) + PrimCallMayCallBack); } - return baseFlags; + return baseFlags1; + }
void * @@ -20170,6 +20167,7 @@ primTraceLogIndex(GIV(primTraceLogIndex) + 1); } assert(!(isOopForwarded(stackValue(GIV(argumentCount))))); + assert((remapBufferCount()) == 0); nArgs = GIV(argumentCount); savedStackPointer = GIV(stackPointer); savedFramePointer = GIV(framePointer); @@ -20177,8 +20175,8 @@ /* begin initPrimCall */ GIV(primFailCode) = 0; dispatchFunctionPointer(primitiveFunctionPointer); - assert((remapBufferCount()) == 0); - + /* begin maybeRetryFailureDueToForwarding */ + ; /* begin maybeFailForLastObjectOverwrite */ if (checkAllocFiller) { if (((freeStart()) < GIV(scavengeThreshold)) @@ -22832,6 +22830,7 @@ if (ok) { return 1; } + /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; @@ -22918,6 +22917,7 @@ } return ((usqLong) smallIntValue); } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((oop & 1))); ccIndex1 = (((usqInt) (longAt(oop))) >> (compactClassFieldLSB())) & 0x1F; @@ -23008,9 +23008,7 @@ } return value; } - else { - ; - } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((oop & 1))); ccIndex = (((usqInt) (longAt(oop))) >> (compactClassFieldLSB())) & 0x1F; @@ -23059,6 +23057,7 @@ } return (oop >> 1); } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((oop & 1))); ccIndex = (((usqInt) (longAt(oop))) >> (compactClassFieldLSB())) & 0x1F; @@ -23113,6 +23112,7 @@ } return value; } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((oop & 1))); ccIndex = (((usqInt) (longAt(oop))) >> (compactClassFieldLSB())) & 0x1F; @@ -30046,6 +30046,7 @@ size = value; goto l1; } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((oop1 & 1))); ccIndex = (((usqInt) (longAt(oop1))) >> (compactClassFieldLSB())) & 0x1F; @@ -33843,6 +33844,7 @@ if ((oop & 1)) { return (oop >> 1); } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((oop & 1))); ccIndex1 = (((usqInt) (longAt(oop))) >> (compactClassFieldLSB())) & 0x1F; @@ -33929,6 +33931,7 @@ if ((oop & 1)) { return ((sqLong) ((oop >> 1))); } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((oop & 1))); ccIndex1 = (((usqInt) (longAt(oop))) >> (compactClassFieldLSB())) & 0x1F; @@ -34034,6 +34037,7 @@ if ((oop & 1)) { return (oop >> 1); } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((oop & 1))); ccIndex1 = (((usqInt) (longAt(oop))) >> (compactClassFieldLSB())) & 0x1F; @@ -43727,6 +43731,11 @@ ok = 0; } } + if (!(GIV(tempOop2) == 0)) { + if (!(checkOopIntegritynamed(GIV(tempOop2), "tempOop2"))) { + ok = 0; + } + } for (i = 1; i <= GIV(jmpDepth); i += 1) { if (!(checkOopIntegritynamedindex(GIV(suspendedCallbacks)[i], "suspendedCallbacks", i))) { ok = 0; @@ -45426,6 +45435,9 @@
do { assert(!(isForwarded(currClass))); + if (!(addressCouldBeClassObj(currClass))) { + return GIV(nilObj); + } classDict = longAt((currClass + BaseHeaderSize) + (MethodDictionaryIndex << ShiftForWord)); assert(!(isForwarded(classDict))); /* begin numSlotsOf: */ @@ -45454,7 +45466,6 @@ findClassOfMethodforReceiver(sqInt meth, sqInt rcvr) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt ccIndex; - sqInt mclass; sqInt rclass;
if ((((rcvr & 1)) @@ -45463,16 +45474,13 @@ && (((((usqInt)rcvr)) < GIV(freeStart)) && (((longAt(rcvr)) & TypeMask) != HeaderTypeGC))))) && (!0)) { - rclass = ((rcvr & 1) + rclass = findClassContainingMethodstartingAt(meth, ((rcvr & 1) ? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << ShiftForWord)) : (((ccIndex = (((usqInt) (longAt(rcvr))) >> (compactClassFieldLSB())) & 0x1F)) == 0 ? (longAt(rcvr - BaseHeaderSize)) & AllButTypeMask - : longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord)))); - if (addressCouldBeClassObj(rclass)) { - rclass = findClassContainingMethodstartingAt(meth, rclass); - if (rclass != GIV(nilObj)) { - return rclass; - } + : longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord))))); + if (rclass != GIV(nilObj)) { + return rclass; } } if (!((((meth & 3) == 0) @@ -45482,10 +45490,6 @@ && (((((usqInt) (longAt(meth))) >> (instFormatFieldLSB())) & 15) >= 12))) { return GIV(nilObj); } - mclass = safeMethodClassOf(meth); - if (addressCouldBeClassObj(mclass)) { - return GIV(nilObj); - } return findClassContainingMethodstartingAt(meth, safeMethodClassOf(meth)); }
@@ -47379,6 +47383,12 @@ && (((longAt(GIV(tempOop))) & MarkBit) != 0)))) { GIV(tempOop) = remapObj(GIV(tempOop)); } + if ((GIV(tempOop2) != 0) + && (((GIV(tempOop2) & 1) == 0) + && (((GIV(tempOop2) & 1) == 0) + && (((longAt(GIV(tempOop2))) & MarkBit) != 0)))) { + GIV(tempOop2) = remapObj(GIV(tempOop2)); + } }
@@ -47444,6 +47454,9 @@ if (!(GIV(tempOop) == 0)) { markAndTrace(GIV(tempOop)); } + if (!(GIV(tempOop2) == 0)) { + markAndTrace(GIV(tempOop2)); + } for (i = 1, iLimiT = (remapBufferCount()); i <= iLimiT; i += 1) { oop = GIV(remapBuffer)[i]; if (!((oop & 1))) { @@ -48520,7 +48533,6 @@ sqInt ccIndex1; sqInt ccIndex2; sqInt classObj; - sqInt mclass; sqInt methClass; sqInt methodSel; sqInt rclass; @@ -48535,17 +48547,14 @@ && (((((usqInt)anObject)) < GIV(freeStart)) && (((longAt(anObject)) & TypeMask) != HeaderTypeGC))))) && (!0)) { - rclass = ((anObject & 1) + rclass = findClassContainingMethodstartingAt(aMethod, ((anObject & 1) ? longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassSmallInteger << ShiftForWord)) : (((ccIndex2 = (((usqInt) (longAt(anObject))) >> (compactClassFieldLSB())) & 0x1F)) == 0 ? (longAt(anObject - BaseHeaderSize)) & AllButTypeMask - : longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex2 - 1) << ShiftForWord)))); - if (addressCouldBeClassObj(rclass)) { - rclass = findClassContainingMethodstartingAt(aMethod, rclass); - if (rclass != GIV(nilObj)) { - methClass = rclass; - goto l1; - } + : longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex2 - 1) << ShiftForWord))))); + if (rclass != GIV(nilObj)) { + methClass = rclass; + goto l1; } } if (!((((aMethod & 3) == 0) @@ -48556,11 +48565,6 @@ 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); @@ -51603,6 +51607,7 @@ } return value; } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((integerPointer & 1))); ccIndex = (((usqInt) (longAt(integerPointer))) >> (compactClassFieldLSB())) & 0x1F; @@ -51649,6 +51654,7 @@ if ((integerPointer & 1)) { return (integerPointer >> 1); } + /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!((integerPointer & 1))); ccIndex1 = (((usqInt) (longAt(integerPointer))) >> (compactClassFieldLSB())) & 0x1F; @@ -53430,7 +53436,6 @@ sqInt argumentArray; sqInt arraySize; sqInt ccIndex; - sqInt ctxtRcvr; sqInt firstBytecode; sqInt fmt; sqInt fmt1; @@ -53446,14 +53451,10 @@ sqInt methodHeader; sqInt moduleLength; sqInt moduleName; - sqInt oop; - sqInt oop1; - sqInt oop2; - sqInt oop3; - sqInt oop4; - sqInt oop5; - sqInt oop6; - sqInt oop7; + sqInt object; + sqInt object1; + sqInt object2; + sqInt object3; sqInt primBits; sqInt primRcvr; char *sp; @@ -53470,6 +53471,10 @@ sqInt sz2; sqInt top; sqInt top1; + sqInt valuePointer; + sqInt valuePointer1; + sqInt valuePointer2; + sqInt valuePointer3;
argumentArray = longAt(GIV(stackPointer)); methodArg = longAt(GIV(stackPointer) + (2 * BytesPerWord)); @@ -53617,40 +53622,25 @@ (GIV(primFailCode) = -1); return; } - /* begin pushRemappableOop: */ - oop = (argumentArray = popStack()); - assert(addressCouldBeOop(oop)); - GIV(remapBuffer)[(GIV(remapBufferCount) += 1)] = oop; - if (!(GIV(remapBufferCount) <= RemapBufferSize)) { - error("remapBuffer overflow"); - } - /* begin pushRemappableOop: */ - oop1 = (primRcvr = popStack()); - assert(addressCouldBeOop(oop1)); - GIV(remapBuffer)[(GIV(remapBufferCount) += 1)] = oop1; - if (!(GIV(remapBufferCount) <= RemapBufferSize)) { - error("remapBuffer overflow"); - } - /* begin pushRemappableOop: */ + GIV(tempOop) = eeInstantiateClassIndexformatnumSlots(ClassArrayCompactIndex, 2, 4); + /* begin storePointerUnchecked:ofObject:withValue: */ + valuePointer = (argumentArray = popStack()); + longAtput((GIV(tempOop) + BaseHeaderSize) + (0 << ShiftForWord), valuePointer); + /* begin storePointerUnchecked:ofObject:withValue: */ + valuePointer1 = (primRcvr = popStack()); + longAtput((GIV(tempOop) + BaseHeaderSize) + (1 << ShiftForWord), valuePointer1); + /* begin storePointerUnchecked:ofObject:withValue: */ /* begin popStack */ top = longAt(GIV(stackPointer)); GIV(stackPointer) += BytesPerWord; - oop2 = top; - assert(addressCouldBeOop(oop2)); - GIV(remapBuffer)[(GIV(remapBufferCount) += 1)] = oop2; - if (!(GIV(remapBufferCount) <= RemapBufferSize)) { - error("remapBuffer overflow"); - } - /* begin pushRemappableOop: */ + valuePointer2 = top; + longAtput((GIV(tempOop) + BaseHeaderSize) + (2 << ShiftForWord), valuePointer2); + /* begin storePointerUnchecked:ofObject:withValue: */ /* begin popStack */ top1 = longAt(GIV(stackPointer)); GIV(stackPointer) += BytesPerWord; - oop3 = top1; - assert(addressCouldBeOop(oop3)); - GIV(remapBuffer)[(GIV(remapBufferCount) += 1)] = oop3; - if (!(GIV(remapBufferCount) <= RemapBufferSize)) { - error("remapBuffer overflow"); - } + valuePointer3 = top1; + longAtput((GIV(tempOop) + BaseHeaderSize) + (3 << ShiftForWord), valuePointer3); /* begin push: */ longAtput((sp5 = GIV(stackPointer) - BytesPerWord), primRcvr); GIV(stackPointer) = sp5; @@ -53661,6 +53651,7 @@ GIV(stackPointer) = sp; } /* begin callExternalPrimitive: */ + ; dispatchFunctionPointer(addr); /* begin maybeFailForLastObjectOverwrite */ if (checkAllocFiller) { @@ -53669,22 +53660,7 @@ GIV(primFailCode) = PrimErrWritePastObject; } } - /* begin popRemappableOop */ - oop4 = GIV(remapBuffer)[GIV(remapBufferCount)]; - GIV(remapBufferCount) -= 1; - ctxtRcvr = oop4; - /* begin popRemappableOop */ - oop5 = GIV(remapBuffer)[GIV(remapBufferCount)]; - GIV(remapBufferCount) -= 1; - methodArg = oop5; - /* begin popRemappableOop */ - oop6 = GIV(remapBuffer)[GIV(remapBufferCount)]; - GIV(remapBufferCount) -= 1; - primRcvr = oop6; - /* begin popRemappableOop */ - oop7 = GIV(remapBuffer)[GIV(remapBufferCount)]; - GIV(remapBufferCount) -= 1; - argumentArray = oop7; + if (GIV(primFailCode)) {
/* If primitive failed, then restore state for failure code */ @@ -53693,16 +53669,20 @@ GIV(stackPointer) += (arraySize + 1) * BytesPerWord; null; /* begin push: */ - longAtput((sp1 = GIV(stackPointer) - BytesPerWord), ctxtRcvr); + object = longAt((GIV(tempOop) + BaseHeaderSize) + (3 << ShiftForWord)); + longAtput((sp1 = GIV(stackPointer) - BytesPerWord), object); GIV(stackPointer) = sp1; /* begin push: */ - longAtput((sp2 = GIV(stackPointer) - BytesPerWord), methodArg); + object1 = longAt((GIV(tempOop) + BaseHeaderSize) + (2 << ShiftForWord)); + longAtput((sp2 = GIV(stackPointer) - BytesPerWord), object1); GIV(stackPointer) = sp2; /* begin push: */ - longAtput((sp3 = GIV(stackPointer) - BytesPerWord), primRcvr); + object2 = longAt((GIV(tempOop) + BaseHeaderSize) + (1 << ShiftForWord)); + longAtput((sp3 = GIV(stackPointer) - BytesPerWord), object2); GIV(stackPointer) = sp3; /* begin push: */ - longAtput((sp4 = GIV(stackPointer) - BytesPerWord), argumentArray); + object3 = longAt((GIV(tempOop) + BaseHeaderSize) + (0 << ShiftForWord)); + longAtput((sp4 = GIV(stackPointer) - BytesPerWord), object3); GIV(stackPointer) = sp4;
/* Hack. A nil prim error code (primErrorCode = 1) is interpreted by the image @@ -53725,9 +53705,12 @@ sqInt index; sqInt integerPointer; sqInt nArgs; + sqInt nArgs1; sqInt primIdx; char *savedFramePointer; + char *savedFramePointer1; char *savedStackPointer; + char *savedStackPointer1; char *sp; char *sp1; char *sp2; @@ -53787,6 +53770,7 @@ ? 0 : primitiveTable[primIdx]))); if (primitiveFunctionPointer == 0) { + primitiveFunctionPointer = primitiveDoPrimitiveWithArgs; /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; @@ -53820,15 +53804,16 @@ primTraceLogIndex(GIV(primTraceLogIndex) + 1); } assert(!(isOopForwarded(stackValue(GIV(argumentCount))))); - nArgs = GIV(argumentCount); - savedStackPointer = GIV(stackPointer); - savedFramePointer = GIV(framePointer); + assert((remapBufferCount()) == 0); + nArgs1 = GIV(argumentCount); + savedStackPointer1 = GIV(stackPointer); + savedFramePointer1 = GIV(framePointer);
/* begin initPrimCall */ GIV(primFailCode) = 0; dispatchFunctionPointer(primitiveFunctionPointer); - assert((remapBufferCount()) == 0); - + /* begin maybeRetryFailureDueToForwarding */ + ; /* begin maybeFailForLastObjectOverwrite */ if (checkAllocFiller) { if (((freeStart()) < GIV(scavengeThreshold)) @@ -53838,14 +53823,14 @@ } if (FailImbalancedPrimitives && ((!GIV(primFailCode)) - && ((GIV(framePointer) == savedFramePointer) + && ((GIV(framePointer) == savedFramePointer1) && (!((((usqInt)(longAt(GIV(framePointer) + FoxMethod)))) < (startOfMemory())))))) {
/* Don't fail if primitive has done something radical, e.g. perform: */
- if (GIV(stackPointer) != (savedStackPointer + (nArgs * BytesPerWord))) { + if (GIV(stackPointer) != (savedStackPointer1 + (nArgs1 * BytesPerWord))) { flag("Would be nice to make this a message send of e.g. unbalancedPrimitive to the current process or context"); - GIV(stackPointer) = savedStackPointer; + GIV(stackPointer) = savedStackPointer1; failUnbalancedPrimitive(); } } @@ -53853,6 +53838,7 @@ checkProfileTick(GIV(newMethod)); } !GIV(primFailCode); + if (GIV(primFailCode)) {
/* If primitive failed, then restore state for failure code */ @@ -53868,6 +53854,7 @@ /* begin push: */ longAtput((sp2 = GIV(stackPointer) - BytesPerWord), GIV(tempOop)); GIV(stackPointer) = sp2; + primitiveFunctionPointer = primitiveDoPrimitiveWithArgs; GIV(argumentCount) = 2; } GIV(tempOop) = 0; @@ -54113,6 +54100,7 @@ if (addr != 0) { rewriteMethodCacheEntryForExternalPrimitiveToFunction(addr); /* begin callExternalPrimitive: */ + ; dispatchFunctionPointer(addr); /* begin maybeFailForLastObjectOverwrite */ if (checkAllocFiller) { @@ -54121,6 +54109,8 @@ GIV(primFailCode) = PrimErrWritePastObject; } } + /* begin maybeRetryFailureDueToForwarding */ + ; return; } (GIV(primFailCode) = PrimErrNamedInternal); @@ -54205,6 +54195,7 @@ if (index >= 0) { rewriteMethodCacheEntryForExternalPrimitiveToFunction(addr); /* begin callExternalPrimitive: */ + ; dispatchFunctionPointer(addr); /* begin maybeFailForLastObjectOverwrite */ if (checkAllocFiller) { @@ -54213,6 +54204,8 @@ GIV(primFailCode) = PrimErrWritePastObject; } } + /* begin maybeRetryFailureDueToForwarding */ + ; } else {
Modified: branches/Cog/nsspursrc/vm/cogit.c =================================================================== --- branches/Cog/nsspursrc/vm/cogit.c 2014-10-31 19:11:22 UTC (rev 3119) +++ branches/Cog/nsspursrc/vm/cogit.c 2014-10-31 19:13:28 UTC (rev 3120) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.911 uuid: 39c7bff8-ff88-43a5-88bc-cbbdb206cbcd + CCodeGenerator VMMaker.oscog-eem.916 uuid: 79925bdf-769f-446f-8532-f04f0e2f11ae from - StackToRegisterMappingCogit VMMaker.oscog-eem.911 uuid: 39c7bff8-ff88-43a5-88bc-cbbdb206cbcd + StackToRegisterMappingCogit VMMaker.oscog-eem.916 uuid: 79925bdf-769f-446f-8532-f04f0e2f11ae */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.911 uuid: 39c7bff8-ff88-43a5-88bc-cbbdb206cbcd " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.916 uuid: 79925bdf-769f-446f-8532-f04f0e2f11ae " __DATE__ ; char *__cogitBuildInfo = __buildInfo;
@@ -18332,18 +18332,16 @@
/* If primIndex has an accessorDepth, check for primitive failure and call - ceCheckForAndFollowForwardedPrimitiveStateFor:. If ceCheck.... answers + ceCheckForAndFollowForwardedPrimitiveState if so If ceCheck.... answers true, retry the primitive. */
static sqInt maybeCompileRetryonPrimitiveFail(AbstractInstruction *retryInst, sqInt primIndex) { - sqInt accessorDepth; sqInt address; AbstractInstruction *jmp;
- accessorDepth = accessorDepthForPrimitiveIndex(primIndex); - if (accessorDepth < 0) { + if ((accessorDepthForPrimitiveIndex(primIndex)) < 0) { return 0; } /* begin MoveAw:R: */ @@ -18353,7 +18351,7 @@ genoperandoperand(CmpCqR, 0, TempReg); /* begin JumpZero: */ jmp = genoperand(JumpZero, ((sqInt)0)); - compileCallFornumArgsargargargargresultRegsaveRegs(ceCheckForAndFollowForwardedPrimitiveStateFor, 1, primIndex, null, null, null, TempReg, 0); + compileCallFornumArgsargargargargresultRegsaveRegs(ceCheckForAndFollowForwardedPrimitiveState, 0, null, null, null, null, TempReg, 0); /* begin CmpCq:R: */ genoperandoperand(CmpCqR, 0, TempReg); /* begin JumpNonZero: */
Modified: branches/Cog/nsspursrc/vm/cogit.h =================================================================== --- branches/Cog/nsspursrc/vm/cogit.h 2014-10-31 19:11:22 UTC (rev 3119) +++ branches/Cog/nsspursrc/vm/cogit.h 2014-10-31 19:13:28 UTC (rev 3120) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.911 uuid: 39c7bff8-ff88-43a5-88bc-cbbdb206cbcd + CCodeGenerator VMMaker.oscog-eem.916 uuid: 79925bdf-769f-446f-8532-f04f0e2f11ae */
Modified: branches/Cog/nsspursrc/vm/cointerp.c =================================================================== --- branches/Cog/nsspursrc/vm/cointerp.c 2014-10-31 19:11:22 UTC (rev 3119) +++ branches/Cog/nsspursrc/vm/cointerp.c 2014-10-31 19:13:28 UTC (rev 3120) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.916 uuid: 79925bdf-769f-446f-8532-f04f0e2f11ae from - CoInterpreter VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 + CoInterpreter VMMaker.oscog-eem.916 uuid: 79925bdf-769f-446f-8532-f04f0e2f11ae */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.915 uuid: 4159cf52-4807-4416-9da6-1c46ec5b9f10 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.916 uuid: 79925bdf-769f-446f-8532-f04f0e2f11ae " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -288,7 +288,6 @@ #define ObjStackTopx 0 #define OldBecameNewFlag 4 #define PrimCallCollectsProfileSamples 8 -#define PrimCallDoNotJIT 32 #define PrimCallMayCallBack 4 #define PrimCallNeedsNewMethod 1 #define PrimCallNeedsPrimitiveFunction 2 @@ -409,7 +408,7 @@ sqInt ceActiveContext(void); sqInt ceBaseFrameReturn(sqInt returnValue); sqInt ceCannotResume(void); -sqInt ceCheckForAndFollowForwardedPrimitiveStateFor(sqInt primIndex); +sqInt ceCheckForAndFollowForwardedPrimitiveState(void); void ceCheckForInterrupts(void); void ceCheckProfileTick(void); sqInt ceContextinstVar(sqInt maybeContext, sqInt slotIndex); @@ -544,6 +543,7 @@ static sqInt returntoExecutive(sqInt returnValue, sqInt inInterpreter) NoDbgRegParms; static void rewriteMethodCacheEntryForExternalPrimitiveToFunction(void (*localPrimAddress)(void)) NoDbgRegParms; static sqInt roomToPushNArgs(sqInt n) NoDbgRegParms; +static sqInt saneFunctionPointerForFailureOfPrimIndex(sqInt primIndex) NoDbgRegParms; EXPORT(sqInt) sendInvokeCallbackContext(VMCallbackContext *vmCallbackContext); EXPORT(sqInt) sendInvokeCallbackStackRegistersJmpbuf(sqInt thunkPtr, sqInt stackPtr, sqInt regsPtr, sqInt jmpBufPtr); static sqInt shortPrintFrame(char *theFP) NoDbgRegParms; @@ -791,7 +791,6 @@ long signedMachineIntegerValueOf(sqInt oop); usqInt sizeOfAlienData(sqInt oop); void * startOfAlienData(sqInt oop); -static sqInt successful(void); sqInt success(sqInt successBoolean); static sqInt addressIsInPage(StackPage * self_in_addressIsInPage, char *address) NoDbgRegParms; static sqInt isFree(StackPage * self_in_isFree) NoDbgRegParms; @@ -1213,7 +1212,7 @@ sqInt checkAllAccessibleObjectsOkay(void); static sqInt checkDeliveryOfLongRunningPrimitiveSignal(void); sqInt checkedIntegerValueOf(sqInt intOop); -static sqInt checkForAndFollowForwardedPrimitiveStateFor(sqInt primIndex) NoDbgRegParms; +static sqInt checkForAndFollowForwardedPrimitiveState(void); static sqInt checkForEventsMayContextSwitch(sqInt mayContextSwitch) NoDbgRegParms; static sqInt checkImageVersionFromstartingAt(sqImageFile f, squeakFileOffsetType imageOffset) NoDbgRegParms; static sqInt checkInterpreterIntegrity(void); @@ -1522,8 +1521,8 @@ _iss sqInt argumentCount; _iss sqInt markStack; _iss usqInt instructionPointer; +_iss sqInt messageSelector; _iss usqInt newMethod; -_iss sqInt messageSelector; _iss sqInt hiddenRootsObj; _iss usqInt newSpaceLimit; _iss StackPage * pages; @@ -1535,37 +1534,38 @@ _iss sqInt needGCFlag; _iss sqInt trueObj; _iss sqInt falseObj; -_iss sqInt remapBufferCount; _iss usqInt totalFreeOldSpace; _iss usqInt pastSpaceStart; _iss sqInt bytesPerPage; _iss sqInt numSegments; _iss sqInt traceLogIndex; _iss usqInt scavengeThreshold; +_iss sqInt remapBufferCount; _iss char * stackLimit; _iss sqInt * freeLists; _iss sqInt rememberedSetSize; +_iss sqInt tempOop; _iss sqInt * rememberedSet; _iss usqInt freeListsMask; _iss sqInt profileProcess; _iss sqInt classTableFirstPage; +_iss unsigned char primTraceLogIndex; +_iss sqInt profileSemaphore; _iss sqInt longRunningPrimitiveCheckSemaphore; -_iss sqInt profileSemaphore; _iss SpurContiguousObjStack unscannedEphemerons; _iss usqInt firstFreeChunk; -_iss unsigned char primTraceLogIndex; _iss sqInt profileMethod;
@@ Diff output truncated at 50000 characters. @@
vm-dev@lists.squeakfoundation.org