Author: eliot Date: 2012-08-14 09:06:45 -0700 (Tue, 14 Aug 2012) New Revision: 2585
Modified: branches/Cog/nscogsrc/vm/cogit.c branches/Cog/nscogsrc/vm/cogit.h branches/Cog/nscogsrc/vm/cogmethod.h branches/Cog/nscogsrc/vm/cointerp.c branches/Cog/nscogsrc/vm/cointerp.h branches/Cog/nscogsrc/vm/gcc3x-cointerp.c branches/Cog/nscogsrc/vm/interp.h branches/Cog/nscogsrc/vm/vmCallback.h branches/Cog/platforms/Cross/vm/sqSCCSVersion.h branches/Cog/src/vm/cogit.c branches/Cog/src/vm/cogit.h branches/Cog/src/vm/cogmethod.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/src/vm/interp.h branches/Cog/src/vm/vmCallback.h Log: Cog VM source as per VMMaker.oscog-eem.201.
Make sure youngReferrersList has room for every method since become/cache implicit receiver can cause any method to gain a young reference. Do so by counting methods in the zone. Make overflowing the youngReferrers list a hard error (appears to happen quite often in Newspeak code).
Fix assert in interpretMethodFromMachineCode.
Modified: branches/Cog/nscogsrc/vm/cogit.c =================================================================== --- branches/Cog/nscogsrc/vm/cogit.c 2012-08-10 23:59:57 UTC (rev 2584) +++ branches/Cog/nscogsrc/vm/cogit.c 2012-08-14 16:06:45 UTC (rev 2585) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CCodeGenerator VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d from - StackToRegisterMappingCogit VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + StackToRegisterMappingCogit VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d " __DATE__ ; char *__cogitBuildInfo = __buildInfo;
@@ -555,6 +555,7 @@ static void freeMethod(CogMethod *cogMethod); static void freeOlderMethodsForCompaction(void); static void freePICsWithFreedTargets(void); +static usqInt freeStart(void); static sqInt genActiveContextTrampoline(void); static sqInt genAddSmallIntegerTagsTo(sqInt aRegister); static sqInt genAlignCStackSavingRegistersnumArgswordAlignment(AbstractInstruction * self_in_genAlignCStackSavingRegistersnumArgswordAlignment, sqInt saveRegs, sqInt numArgs, sqInt alignment); @@ -810,7 +811,7 @@ static sqInt jumpLongConditionalByteSize(AbstractInstruction * self_in_jumpLongConditionalByteSize); static sqInt jumpLongTargetBeforeFollowingAddress(AbstractInstruction * self_in_jumpLongTargetBeforeFollowingAddress, sqInt mcpc); static sqInt jumpShortByteSize(AbstractInstruction * self_in_jumpShortByteSize); -static sqInt jumpTargetAddress(AbstractInstruction * self_in_jumpTargetAddress); +static AbstractInstruction * jumpTargetAddress(AbstractInstruction * self_in_jumpTargetAddress); static sqInt jumpTargetAt(AbstractInstruction * self_in_jumpTargetAt, sqInt pc); static sqInt kosherYoungReferrers(void); static AbstractInstruction * gLabel(void); @@ -824,7 +825,7 @@ static sqInt loadLiteralByteSize(AbstractInstruction * self_in_loadLiteralByteSize); static sqInt longBranchDistance(unsigned char byteZero, unsigned char byteOne); static sqInt longForwardBranchDistance(unsigned char byteZero, unsigned char byteOne); -static sqInt longJumpTargetAddress(AbstractInstruction * self_in_longJumpTargetAddress); +static AbstractInstruction * longJumpTargetAddress(AbstractInstruction * self_in_longJumpTargetAddress); static AbstractInstruction * gMoveAwR(sqInt address, sqInt reg); static AbstractInstruction * gMoveCwR(sqInt wordConstant, sqInt reg); static AbstractInstruction * gMoveMwrR(sqInt offset, sqInt baseReg, sqInt destReg); @@ -877,6 +878,7 @@ static sqInt numCheckFeaturesOpcodes(AbstractInstruction * self_in_numCheckFeaturesOpcodes); static sqInt numICacheFlushOpcodes(AbstractInstruction * self_in_numICacheFlushOpcodes); static sqInt numLowLevelLockOpcodes(AbstractInstruction * self_in_numLowLevelLockOpcodes); +static sqInt numMethods(void); sqInt numMethodsOfType(sqInt cogMethodType); static sqInt numSmallIntegerBits(void); static sqInt occurrencesInYoungReferrers(CogMethod *cogMethod); @@ -996,8 +998,6 @@ void voidCogCompiledCode(void); static void voidYoungReferrersPostTenureAll(void); static AbstractInstruction * gXorCwR(sqInt wordConstant, sqInt reg); -static sqInt zoneEnd(void); -static usqInt zoneLimit(void);
/*** Variables ***/ @@ -1359,6 +1359,7 @@ static CogBlockMethod * maxMethodBefore; static sqInt methodAbortTrampolines[4]; static sqInt methodBytesFreedSinceLastCompaction; +static sqInt methodCount; static AbstractInstruction *methodLabel = &aMethodLabel; static sqInt methodObj; static sqInt methodOrBlockNumArgs; @@ -1668,7 +1669,6 @@ #define haltmsg(msg) warning("halt: " msg) #define limitZony() ((CogMethod *)mzFreeStart) #define maybeConstant(sse) ((sse)->constant) -#define methodBytesFreedSinceLastCompaction() methodBytesFreedSinceLastCompaction #define minCallAddress() minValidCallAddress #define nextOpenPIC methodObject #define nextOpenPICHack hack hack hack i.e. the getter macro does all the work @@ -1945,11 +1945,13 @@ sqInt roundedBytes;
roundedBytes = (numBytes + 7) & -8; - if ((mzFreeStart + roundedBytes) > (youngReferrers - BytesPerWord)) { + if ((mzFreeStart + roundedBytes) >= (limitAddress - (methodCount * BytesPerWord))) { return 0; } allocation = mzFreeStart; mzFreeStart += roundedBytes; + methodCount += 1; + assert(roomOnYoungReferrersList()); ; return allocation; } @@ -2376,7 +2378,7 @@ innerReturn = popStack(); targetMethod = ((CogMethod *) (innerReturn - missOffset)); outerReturn = stackTop(); - assert(((outerReturn >= methodZoneBase) && (outerReturn <= (zoneLimit())))); + assert(((outerReturn >= methodZoneBase) && (outerReturn <= (freeStart())))); entryPoint = callTargetFromReturnAddress(backEnd, outerReturn); assert(((targetMethod->selector)) != (nilObject())); @@ -2800,10 +2802,7 @@ } cogMethod = methodAfter(cogMethod); } - mzFreeStart = baseAddress; - youngReferrers = limitAddress; - openPICList = null; - methodBytesFreedSinceLastCompaction = 0; + manageFromto(baseAddress, limitAddress); }
@@ -2964,14 +2963,14 @@ cogMethod = methodAfter(cogMethod); } if ((((label = stringForCString("CCFree"))) == null) - || (((value = cePositive32BitIntegerFor(zoneLimit()))) == null)) { + || (((value = cePositive32BitIntegerFor(freeStart()))) == null)) { popRemappableOop(); return null; } storePointerUncheckedofObjectwithValue(count, topRemappableOop(), label); storePointerUncheckedofObjectwithValue(count + 1, topRemappableOop(), value); if ((((label = stringForCString("CCEnd"))) == null) - || (((value = cePositive32BitIntegerFor(zoneEnd()))) == null)) { + || (((value = cePositive32BitIntegerFor(limitAddress))) == null)) { popRemappableOop(); return null; } @@ -3090,7 +3089,7 @@ if ((((sqInt) ((cogMethod->objectHeader)))) >= 0) { if ((((cogMethod->methodObject)) != 0) && ((((cogMethod->methodObject)) < methodZoneBase) - || ((((cogMethod->methodObject)) > ((zoneLimit()) - openPICSize)) + || ((((cogMethod->methodObject)) > ((freeStart()) - openPICSize)) || (((((cogMethod->methodObject)) & (BytesPerWord - 1)) != 0) || (((((CogMethod *) ((cogMethod->methodObject)))->cmType)) != CMOpenPIC))))) { return 23; @@ -3303,7 +3302,7 @@ compactCompiledCode(nullHeaderForMachineCodeMethod()); assert(allMethodsHaveCorrectHeader()); assert(kosherYoungReferrers()); - flushICacheFromto(processor, methodZoneBase, zoneLimit()); + flushICacheFromto(processor, methodZoneBase, freeStart()); }
static void @@ -3315,6 +3314,7 @@
source = ((CogMethod *) baseAddress); openPICList = null; + methodCount = 0; while ((source < (limitZony())) && (((source->cmType)) != CMFree)) { assert((cogMethodDoesntLookKosher(source)) == 0); @@ -3326,6 +3326,7 @@ (source->nextOpenPIC = ((usqInt)openPICList)); openPICList = source; } + methodCount += 1; source = methodAfter(source); } if (source >= (limitZony())) { @@ -3336,6 +3337,7 @@ assert((maybeFreeCogMethodDoesntLookKosher(source)) == 0); bytes = (source->blockSize); if (((source->cmType)) != CMFree) { + methodCount += 1; memmove(dest, source, bytes); (dest->objectHeader = objectHeaderValue); if (((dest->cmType)) == CMMethod) { @@ -7766,18 +7768,28 @@ freePICsWithFreedTargets(void) { CogMethod *cogMethod; + sqInt count;
cogMethod = ((CogMethod *) methodZoneBase); + count = 0; while (cogMethod < (limitZony())) { if ((((cogMethod->cmType)) == CMClosedPIC) && (cPICHasFreedTargets(cogMethod))) { (cogMethod->cmType = CMFree); } cogMethod = methodAfter(cogMethod); + count += 1; } + assert(count == (numMethods())); }
+static usqInt +freeStart(void) +{ + return mzFreeStart; +}
+ /* Short-circuit the interpreter call if a frame is already married. */
static sqInt @@ -8497,7 +8509,7 @@ headerSize = sizeof(CogMethod); (methodLabel->address = -headerSize); computeMaximumSizes(); - concretizeAt(methodLabel, allocate(0)); + concretizeAt(methodLabel, freeStart()); codeSize = generateInstructionsAt(((methodLabel->address)) + headerSize); mapSize = generateMapAtstart(0, ((methodLabel->address)) + cmNoCheckEntryOffset); totalSize = roundUpLength((headerSize + codeSize) + mapSize); @@ -13288,7 +13300,7 @@ sqInt isPCWithinMethodZone(char *address) { - return (((((usqInt)address)) >= methodZoneBase) && ((((usqInt)address)) <= (zoneLimit()))); + return (((((usqInt)address)) >= methodZoneBase) && ((((usqInt)address)) <= (freeStart()))); }
static sqInt @@ -13310,7 +13322,7 @@ } target = callTargetFromReturnAddress(backEnd, retpc); return (((target >= firstSend) && (target <= lastSend))) - || (((target >= methodZoneBase) && (target <= (zoneLimit())))); + || (((target >= methodZoneBase) && (target <= (freeStart())))); }
static sqInt @@ -13433,7 +13445,7 @@
/* Since it's an extraction from other methods. */
-static sqInt +static AbstractInstruction * jumpTargetAddress(AbstractInstruction * self_in_jumpTargetAddress) { AbstractInstruction *jumpTarget; @@ -13563,7 +13575,7 @@
# endif /* NewspeakVM */
- assert(((callSiteReturnAddress >= methodZoneBase) && (callSiteReturnAddress <= (zoneLimit())))); + assert(((callSiteReturnAddress >= methodZoneBase) && (callSiteReturnAddress <= (freeStart())))); inlineCacheTag = (theEntryOffset == cmNoCheckEntryOffset ? (targetMethod->selector) : inlineCacheTagForInstance(receiver)); @@ -13649,7 +13661,7 @@ sane. */
-static sqInt +static AbstractInstruction * longJumpTargetAddress(AbstractInstruction * self_in_longJumpTargetAddress) { AbstractInstruction *jumpTarget; @@ -13715,6 +13727,7 @@ youngReferrers = (limitAddress = theLimitAddress); openPICList = null; methodBytesFreedSinceLastCompaction = 0; + methodCount = 0; }
@@ -14093,7 +14106,7 @@ hasYoungObjPtr = ((sqInt)((&hasYoungObj))); codeModified = 0; pointer = youngReferrers(); - while (pointer < (zoneEnd())) { + while (pointer < limitAddress) { assert(!hasYoungObj); cogMethod = ((CogMethod *) (longAt(pointer))); if (((cogMethod->cmType)) == CMFree) { @@ -14158,6 +14171,9 @@ default: error("Case not found and no otherwise clause"); } + if (!(asserta((freeStart()) <= (youngReferrers())))) { + error("youngReferrers list overflowed"); + } }
static void @@ -14195,7 +14211,7 @@ } codeModified = 0; pointer = youngReferrers(); - while (pointer < (zoneEnd())) { + while (pointer < limitAddress) { cogMethod = ((CogMethod *) (longAt(pointer))); if ((cogMethod->cmRefersToYoung)) { assert((cogMethodDoesntLookKosher(cogMethod)) == 0); @@ -15024,6 +15040,12 @@ return 14; }
+static sqInt +numMethods(void) +{ + return methodCount; +} + sqInt numMethodsOfType(sqInt cogMethodType) { @@ -16161,19 +16183,33 @@ flags = primitivePropertyFlags(primIndex); if ((flags & PrimCallMayCallBack) != 0) { address = (((usqInt)cogMethod)) + (externalPrimJumpOffsets[(cogMethod->cmNumArgs)]); - extent = rewriteJumpLongAttarget(backEnd, address, ((sqInt)primFunctionPointer)); + extent = rewriteJumpLongAttarget(backEnd, address, ((usqInt)primFunctionPointer)); } else { address = (((usqInt)cogMethod)) + (externalPrimCallOffsets[(cogMethod->cmNumArgs)]); - extent = rewriteCallAttarget(backEnd, address, ((sqInt)primFunctionPointer)); + extent = rewriteCallAttarget(backEnd, address, ((usqInt)primFunctionPointer)); } flushICacheFromto(processor, address, address + extent); }
+ +/* The youngReferrers list holds methods that may contain a reference to a + young object and hence need to be visited during young-space garbage + collection. The + list saves walking through all of code space to do so, as in typical + circumstances there are no methods that refer to young objects.However, + events like become: + can potentially cause every method to refer to a new object (becomming + true for + example). So there needs to be room on the list for as many methods as + exist. */ + static sqInt roomOnYoungReferrersList(void) { - return (youngReferrers - BytesPerWord) >= mzFreeStart; + assert((youngReferrers <= limitAddress) + && (youngReferrers >= (limitAddress - (methodCount * BytesPerWord)))); + return (limitAddress - (methodCount * BytesPerWord)) >= mzFreeStart; }
static sqInt @@ -17595,15 +17631,3 @@ { return genoperandoperand(XorCwR, wordConstant, reg); } - -static sqInt -zoneEnd(void) -{ - return limitAddress; -} - -static usqInt -zoneLimit(void) -{ - return mzFreeStart; -}
Modified: branches/Cog/nscogsrc/vm/cogit.h =================================================================== --- branches/Cog/nscogsrc/vm/cogit.h 2012-08-10 23:59:57 UTC (rev 2584) +++ branches/Cog/nscogsrc/vm/cogit.h 2012-08-14 16:06:45 UTC (rev 2585) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CCodeGenerator VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d */
Modified: branches/Cog/nscogsrc/vm/cogmethod.h =================================================================== --- branches/Cog/nscogsrc/vm/cogmethod.h 2012-08-10 23:59:57 UTC (rev 2584) +++ branches/Cog/nscogsrc/vm/cogmethod.h 2012-08-14 16:06:45 UTC (rev 2585) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CCodeGenerator VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d */
typedef struct {
Modified: branches/Cog/nscogsrc/vm/cointerp.c =================================================================== --- branches/Cog/nscogsrc/vm/cointerp.c 2012-08-10 23:59:57 UTC (rev 2584) +++ branches/Cog/nscogsrc/vm/cointerp.c 2012-08-14 16:06:45 UTC (rev 2585) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d from - CoInterpreter VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CoInterpreter VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -619,6 +619,7 @@ sqInt isMarked(sqInt oop); static sqInt isMarriedOrWidowedContext(sqInt aContext); sqInt isNonIntegerObject(sqInt objectPointer); +static sqInt isNullExternalPrimitiveCall(sqInt aMethodObj); sqInt isOopCompiledMethod(sqInt oop); sqInt isPointers(sqInt oop); static sqInt isPrimitiveFunctionPointerAnIndex(void); @@ -1915,7 +1916,7 @@ /* 575 */ (void (*)(void))0, 0 }; static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void); -const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.199"; +const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.201"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */; volatile int sendTrace;
@@ -20973,8 +20974,10 @@ } } else { - assert(((primitiveIndexOf(GIV(newMethod))) == 0) - || ((functionPointerForinClass(primitiveIndexOf(GIV(newMethod)), nilObject())) == 0)); + assert((isOopCompiledMethod(GIV(newMethod))) + && (((primitiveIndexOf(GIV(newMethod))) == 0) + || (((functionPointerForinClass(primitiveIndexOf(GIV(newMethod)), nilObject())) == 0) + || (isNullExternalPrimitiveCall(GIV(newMethod)))))); } activateNewMethod(); siglongjmp(reenterInterpreter, ReturnToInterpreter); @@ -21196,6 +21199,27 @@ }
+/* Answer if the method is an external primtiive call (prim 117) with a null + external primtiive. + This is just for an assert in the CoInterpreter. */ + +static sqInt +isNullExternalPrimitiveCall(sqInt aMethodObj) +{ + sqInt lit; + + if (!(((primitiveIndexOf(aMethodObj)) == 117) + && ((literalCountOfHeader(headerOf(aMethodObj))) > 0))) { + return 0; + } + lit = longAt((aMethodObj + BaseHeaderSize) + ((0 + LiteralStart) << ShiftForWord)); + return (((lit & 1) == 0) + && (((((usqInt) (longAt(lit))) >> 8) & 15) == 2)) + && (((lengthOf(lit)) == 4) + && ((longAt((lit + BaseHeaderSize) + (3 << ShiftForWord))) == ConstZero)); +} + + /* Answer whether the oop is an object of compiled method format */
sqInt
Modified: branches/Cog/nscogsrc/vm/cointerp.h =================================================================== --- branches/Cog/nscogsrc/vm/cointerp.h 2012-08-10 23:59:57 UTC (rev 2584) +++ branches/Cog/nscogsrc/vm/cointerp.h 2012-08-14 16:06:45 UTC (rev 2585) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d */
Modified: branches/Cog/nscogsrc/vm/gcc3x-cointerp.c =================================================================== --- branches/Cog/nscogsrc/vm/gcc3x-cointerp.c 2012-08-10 23:59:57 UTC (rev 2584) +++ branches/Cog/nscogsrc/vm/gcc3x-cointerp.c 2012-08-14 16:06:45 UTC (rev 2585) @@ -2,11 +2,11 @@
/* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d from - CoInterpreter VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CoInterpreter VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -622,6 +622,7 @@ sqInt isMarked(sqInt oop); static sqInt isMarriedOrWidowedContext(sqInt aContext); sqInt isNonIntegerObject(sqInt objectPointer); +static sqInt isNullExternalPrimitiveCall(sqInt aMethodObj); sqInt isOopCompiledMethod(sqInt oop); sqInt isPointers(sqInt oop); static sqInt isPrimitiveFunctionPointerAnIndex(void); @@ -1918,7 +1919,7 @@ /* 575 */ (void (*)(void))0, 0 }; static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void); -const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.199"; +const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.201"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */; volatile int sendTrace;
@@ -20977,8 +20978,10 @@ } } else { - assert(((primitiveIndexOf(GIV(newMethod))) == 0) - || ((functionPointerForinClass(primitiveIndexOf(GIV(newMethod)), nilObject())) == 0)); + assert((isOopCompiledMethod(GIV(newMethod))) + && (((primitiveIndexOf(GIV(newMethod))) == 0) + || (((functionPointerForinClass(primitiveIndexOf(GIV(newMethod)), nilObject())) == 0) + || (isNullExternalPrimitiveCall(GIV(newMethod)))))); } activateNewMethod(); siglongjmp(reenterInterpreter, ReturnToInterpreter); @@ -21200,6 +21203,27 @@ }
+/* Answer if the method is an external primtiive call (prim 117) with a null + external primtiive. + This is just for an assert in the CoInterpreter. */ + +static sqInt +isNullExternalPrimitiveCall(sqInt aMethodObj) +{ + sqInt lit; + + if (!(((primitiveIndexOf(aMethodObj)) == 117) + && ((literalCountOfHeader(headerOf(aMethodObj))) > 0))) { + return 0; + } + lit = longAt((aMethodObj + BaseHeaderSize) + ((0 + LiteralStart) << ShiftForWord)); + return (((lit & 1) == 0) + && (((((usqInt) (longAt(lit))) >> 8) & 15) == 2)) + && (((lengthOf(lit)) == 4) + && ((longAt((lit + BaseHeaderSize) + (3 << ShiftForWord))) == ConstZero)); +} + + /* Answer whether the oop is an object of compiled method format */
sqInt
Modified: branches/Cog/nscogsrc/vm/interp.h =================================================================== --- branches/Cog/nscogsrc/vm/interp.h 2012-08-10 23:59:57 UTC (rev 2584) +++ branches/Cog/nscogsrc/vm/interp.h 2012-08-14 16:06:45 UTC (rev 2585) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d */
#define VM_PROXY_MAJOR 1
Modified: branches/Cog/nscogsrc/vm/vmCallback.h =================================================================== --- branches/Cog/nscogsrc/vm/vmCallback.h 2012-08-10 23:59:57 UTC (rev 2584) +++ branches/Cog/nscogsrc/vm/vmCallback.h 2012-08-14 16:06:45 UTC (rev 2585) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d */
#define VM_CALLBACK_INC 1
Property changes on: branches/Cog/platforms/Cross/vm/sqSCCSVersion.h ___________________________________________________________________ Modified: checkindate - Fri Aug 10 16:59:08 PDT 2012 + Tue Aug 14 09:01:26 PDT 2012
Modified: branches/Cog/src/vm/cogit.c =================================================================== --- branches/Cog/src/vm/cogit.c 2012-08-10 23:59:57 UTC (rev 2584) +++ branches/Cog/src/vm/cogit.c 2012-08-14 16:06:45 UTC (rev 2585) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CCodeGenerator VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d from - StackToRegisterMappingCogit VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + StackToRegisterMappingCogit VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d " __DATE__ ; char *__cogitBuildInfo = __buildInfo;
@@ -553,6 +553,7 @@ static void freeMethod(CogMethod *cogMethod); static void freeOlderMethodsForCompaction(void); static void freePICsWithFreedTargets(void); +static usqInt freeStart(void); static sqInt genActiveContextTrampoline(void); static sqInt genAddSmallIntegerTagsTo(sqInt aRegister); static sqInt genAlignCStackSavingRegistersnumArgswordAlignment(AbstractInstruction * self_in_genAlignCStackSavingRegistersnumArgswordAlignment, sqInt saveRegs, sqInt numArgs, sqInt alignment); @@ -803,7 +804,7 @@ static sqInt jumpLongConditionalByteSize(AbstractInstruction * self_in_jumpLongConditionalByteSize); static sqInt jumpLongTargetBeforeFollowingAddress(AbstractInstruction * self_in_jumpLongTargetBeforeFollowingAddress, sqInt mcpc); static sqInt jumpShortByteSize(AbstractInstruction * self_in_jumpShortByteSize); -static sqInt jumpTargetAddress(AbstractInstruction * self_in_jumpTargetAddress); +static AbstractInstruction * jumpTargetAddress(AbstractInstruction * self_in_jumpTargetAddress); static sqInt jumpTargetAt(AbstractInstruction * self_in_jumpTargetAt, sqInt pc); static sqInt kosherYoungReferrers(void); static AbstractInstruction * gLabel(void); @@ -817,7 +818,7 @@ static sqInt loadLiteralByteSize(AbstractInstruction * self_in_loadLiteralByteSize); static sqInt longBranchDistance(unsigned char byteZero, unsigned char byteOne); static sqInt longForwardBranchDistance(unsigned char byteZero, unsigned char byteOne); -static sqInt longJumpTargetAddress(AbstractInstruction * self_in_longJumpTargetAddress); +static AbstractInstruction * longJumpTargetAddress(AbstractInstruction * self_in_longJumpTargetAddress); static AbstractInstruction * gMoveAwR(sqInt address, sqInt reg); static AbstractInstruction * gMoveCwR(sqInt wordConstant, sqInt reg); static AbstractInstruction * gMoveMwrR(sqInt offset, sqInt baseReg, sqInt destReg); @@ -868,6 +869,7 @@ static sqInt numCheckFeaturesOpcodes(AbstractInstruction * self_in_numCheckFeaturesOpcodes); static sqInt numICacheFlushOpcodes(AbstractInstruction * self_in_numICacheFlushOpcodes); static sqInt numLowLevelLockOpcodes(AbstractInstruction * self_in_numLowLevelLockOpcodes); +static sqInt numMethods(void); sqInt numMethodsOfType(sqInt cogMethodType); static sqInt numSmallIntegerBits(void); static sqInt occurrencesInYoungReferrers(CogMethod *cogMethod); @@ -985,8 +987,6 @@ void voidCogCompiledCode(void); static void voidYoungReferrersPostTenureAll(void); static AbstractInstruction * gXorCwR(sqInt wordConstant, sqInt reg); -static sqInt zoneEnd(void); -static usqInt zoneLimit(void);
/*** Variables ***/ @@ -1342,6 +1342,7 @@ static CogBlockMethod * maxMethodBefore; static sqInt methodAbortTrampolines[4]; static sqInt methodBytesFreedSinceLastCompaction; +static sqInt methodCount; static AbstractInstruction *methodLabel = &aMethodLabel; static sqInt methodObj; static sqInt methodOrBlockNumArgs; @@ -1651,7 +1652,6 @@ #define haltmsg(msg) warning("halt: " msg) #define limitZony() ((CogMethod *)mzFreeStart) #define maybeConstant(sse) ((sse)->constant) -#define methodBytesFreedSinceLastCompaction() methodBytesFreedSinceLastCompaction #define minCallAddress() minValidCallAddress #define nextOpenPIC methodObject #define nextOpenPICHack hack hack hack i.e. the getter macro does all the work @@ -1928,11 +1928,13 @@ sqInt roundedBytes;
roundedBytes = (numBytes + 7) & -8; - if ((mzFreeStart + roundedBytes) > (youngReferrers - BytesPerWord)) { + if ((mzFreeStart + roundedBytes) >= (limitAddress - (methodCount * BytesPerWord))) { return 0; } allocation = mzFreeStart; mzFreeStart += roundedBytes; + methodCount += 1; + assert(roomOnYoungReferrersList()); ; return allocation; } @@ -2299,7 +2301,7 @@ innerReturn = popStack(); targetMethod = ((CogMethod *) (innerReturn - missOffset)); outerReturn = stackTop(); - assert(((outerReturn >= methodZoneBase) && (outerReturn <= (zoneLimit())))); + assert(((outerReturn >= methodZoneBase) && (outerReturn <= (freeStart())))); entryPoint = callTargetFromReturnAddress(backEnd, outerReturn); assert(((targetMethod->selector)) != (nilObject())); @@ -2723,10 +2725,7 @@ } cogMethod = methodAfter(cogMethod); } - mzFreeStart = baseAddress; - youngReferrers = limitAddress; - openPICList = null; - methodBytesFreedSinceLastCompaction = 0; + manageFromto(baseAddress, limitAddress); }
@@ -2887,14 +2886,14 @@ cogMethod = methodAfter(cogMethod); } if ((((label = stringForCString("CCFree"))) == null) - || (((value = cePositive32BitIntegerFor(zoneLimit()))) == null)) { + || (((value = cePositive32BitIntegerFor(freeStart()))) == null)) { popRemappableOop(); return null; } storePointerUncheckedofObjectwithValue(count, topRemappableOop(), label); storePointerUncheckedofObjectwithValue(count + 1, topRemappableOop(), value); if ((((label = stringForCString("CCEnd"))) == null) - || (((value = cePositive32BitIntegerFor(zoneEnd()))) == null)) { + || (((value = cePositive32BitIntegerFor(limitAddress))) == null)) { popRemappableOop(); return null; } @@ -3013,7 +3012,7 @@ if ((((sqInt) ((cogMethod->objectHeader)))) >= 0) { if ((((cogMethod->methodObject)) != 0) && ((((cogMethod->methodObject)) < methodZoneBase) - || ((((cogMethod->methodObject)) > ((zoneLimit()) - openPICSize)) + || ((((cogMethod->methodObject)) > ((freeStart()) - openPICSize)) || (((((cogMethod->methodObject)) & (BytesPerWord - 1)) != 0) || (((((CogMethod *) ((cogMethod->methodObject)))->cmType)) != CMOpenPIC))))) { return 23; @@ -3226,7 +3225,7 @@ compactCompiledCode(nullHeaderForMachineCodeMethod()); assert(allMethodsHaveCorrectHeader()); assert(kosherYoungReferrers()); - flushICacheFromto(processor, methodZoneBase, zoneLimit()); + flushICacheFromto(processor, methodZoneBase, freeStart()); }
static void @@ -3238,6 +3237,7 @@
source = ((CogMethod *) baseAddress); openPICList = null; + methodCount = 0; while ((source < (limitZony())) && (((source->cmType)) != CMFree)) { assert((cogMethodDoesntLookKosher(source)) == 0); @@ -3249,6 +3249,7 @@ (source->nextOpenPIC = ((usqInt)openPICList)); openPICList = source; } + methodCount += 1; source = methodAfter(source); } if (source >= (limitZony())) { @@ -3259,6 +3260,7 @@ assert((maybeFreeCogMethodDoesntLookKosher(source)) == 0); bytes = (source->blockSize); if (((source->cmType)) != CMFree) { + methodCount += 1; memmove(dest, source, bytes); (dest->objectHeader = objectHeaderValue); if (((dest->cmType)) == CMMethod) { @@ -7689,18 +7691,28 @@ freePICsWithFreedTargets(void) { CogMethod *cogMethod; + sqInt count;
cogMethod = ((CogMethod *) methodZoneBase); + count = 0; while (cogMethod < (limitZony())) { if ((((cogMethod->cmType)) == CMClosedPIC) && (cPICHasFreedTargets(cogMethod))) { (cogMethod->cmType = CMFree); } cogMethod = methodAfter(cogMethod); + count += 1; } + assert(count == (numMethods())); }
+static usqInt +freeStart(void) +{ + return mzFreeStart; +}
+ /* Short-circuit the interpreter call if a frame is already married. */
static sqInt @@ -8408,7 +8420,7 @@ headerSize = sizeof(CogMethod); (methodLabel->address = -headerSize); computeMaximumSizes(); - concretizeAt(methodLabel, allocate(0)); + concretizeAt(methodLabel, freeStart()); codeSize = generateInstructionsAt(((methodLabel->address)) + headerSize); mapSize = generateMapAtstart(0, ((methodLabel->address)) + cmNoCheckEntryOffset); totalSize = roundUpLength((headerSize + codeSize) + mapSize); @@ -13076,7 +13088,7 @@ sqInt isPCWithinMethodZone(char *address) { - return (((((usqInt)address)) >= methodZoneBase) && ((((usqInt)address)) <= (zoneLimit()))); + return (((((usqInt)address)) >= methodZoneBase) && ((((usqInt)address)) <= (freeStart()))); }
static sqInt @@ -13098,7 +13110,7 @@ } target = callTargetFromReturnAddress(backEnd, retpc); return (((target >= firstSend) && (target <= lastSend))) - || (((target >= methodZoneBase) && (target <= (zoneLimit())))); + || (((target >= methodZoneBase) && (target <= (freeStart())))); }
static sqInt @@ -13221,7 +13233,7 @@
/* Since it's an extraction from other methods. */
-static sqInt +static AbstractInstruction * jumpTargetAddress(AbstractInstruction * self_in_jumpTargetAddress) { AbstractInstruction *jumpTarget; @@ -13351,7 +13363,7 @@
# endif /* NewspeakVM */
- assert(((callSiteReturnAddress >= methodZoneBase) && (callSiteReturnAddress <= (zoneLimit())))); + assert(((callSiteReturnAddress >= methodZoneBase) && (callSiteReturnAddress <= (freeStart())))); inlineCacheTag = (theEntryOffset == cmNoCheckEntryOffset ? (targetMethod->selector) : inlineCacheTagForInstance(receiver)); @@ -13437,7 +13449,7 @@ sane. */
-static sqInt +static AbstractInstruction * longJumpTargetAddress(AbstractInstruction * self_in_longJumpTargetAddress) { AbstractInstruction *jumpTarget; @@ -13503,6 +13515,7 @@ youngReferrers = (limitAddress = theLimitAddress); openPICList = null; methodBytesFreedSinceLastCompaction = 0; + methodCount = 0; }
@@ -13881,7 +13894,7 @@ hasYoungObjPtr = ((sqInt)((&hasYoungObj))); codeModified = 0; pointer = youngReferrers(); - while (pointer < (zoneEnd())) { + while (pointer < limitAddress) { assert(!hasYoungObj); cogMethod = ((CogMethod *) (longAt(pointer))); if (((cogMethod->cmType)) == CMFree) { @@ -13946,6 +13959,9 @@ default: error("Case not found and no otherwise clause"); } + if (!(asserta((freeStart()) <= (youngReferrers())))) { + error("youngReferrers list overflowed"); + } }
static void @@ -13983,7 +13999,7 @@ } codeModified = 0; pointer = youngReferrers(); - while (pointer < (zoneEnd())) { + while (pointer < limitAddress) { cogMethod = ((CogMethod *) (longAt(pointer))); if ((cogMethod->cmRefersToYoung)) { assert((cogMethodDoesntLookKosher(cogMethod)) == 0); @@ -14639,6 +14655,12 @@ return 14; }
+static sqInt +numMethods(void) +{ + return methodCount; +} + sqInt numMethodsOfType(sqInt cogMethodType) { @@ -15680,19 +15702,33 @@ flags = primitivePropertyFlags(primIndex); if ((flags & PrimCallMayCallBack) != 0) { address = (((usqInt)cogMethod)) + (externalPrimJumpOffsets[(cogMethod->cmNumArgs)]); - extent = rewriteJumpLongAttarget(backEnd, address, ((sqInt)primFunctionPointer)); + extent = rewriteJumpLongAttarget(backEnd, address, ((usqInt)primFunctionPointer)); } else { address = (((usqInt)cogMethod)) + (externalPrimCallOffsets[(cogMethod->cmNumArgs)]); - extent = rewriteCallAttarget(backEnd, address, ((sqInt)primFunctionPointer)); + extent = rewriteCallAttarget(backEnd, address, ((usqInt)primFunctionPointer)); } flushICacheFromto(processor, address, address + extent); }
+ +/* The youngReferrers list holds methods that may contain a reference to a + young object and hence need to be visited during young-space garbage + collection. The + list saves walking through all of code space to do so, as in typical + circumstances there are no methods that refer to young objects.However, + events like become: + can potentially cause every method to refer to a new object (becomming + true for + example). So there needs to be room on the list for as many methods as + exist. */ + static sqInt roomOnYoungReferrersList(void) { - return (youngReferrers - BytesPerWord) >= mzFreeStart; + assert((youngReferrers <= limitAddress) + && (youngReferrers >= (limitAddress - (methodCount * BytesPerWord)))); + return (limitAddress - (methodCount * BytesPerWord)) >= mzFreeStart; }
static sqInt @@ -17114,15 +17150,3 @@ { return genoperandoperand(XorCwR, wordConstant, reg); } - -static sqInt -zoneEnd(void) -{ - return limitAddress; -} - -static usqInt -zoneLimit(void) -{ - return mzFreeStart; -}
Modified: branches/Cog/src/vm/cogit.h =================================================================== --- branches/Cog/src/vm/cogit.h 2012-08-10 23:59:57 UTC (rev 2584) +++ branches/Cog/src/vm/cogit.h 2012-08-14 16:06:45 UTC (rev 2585) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CCodeGenerator VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d */
Modified: branches/Cog/src/vm/cogmethod.h =================================================================== --- branches/Cog/src/vm/cogmethod.h 2012-08-10 23:59:57 UTC (rev 2584) +++ branches/Cog/src/vm/cogmethod.h 2012-08-14 16:06:45 UTC (rev 2585) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CCodeGenerator VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d */
typedef struct {
Modified: branches/Cog/src/vm/cointerp.c =================================================================== --- branches/Cog/src/vm/cointerp.c 2012-08-10 23:59:57 UTC (rev 2584) +++ branches/Cog/src/vm/cointerp.c 2012-08-14 16:06:45 UTC (rev 2585) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d from - CoInterpreter VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CoInterpreter VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -610,6 +610,7 @@ sqInt isMarked(sqInt oop); static sqInt isMarriedOrWidowedContext(sqInt aContext); sqInt isNonIntegerObject(sqInt objectPointer); +static sqInt isNullExternalPrimitiveCall(sqInt aMethodObj); sqInt isOopCompiledMethod(sqInt oop); sqInt isPointers(sqInt oop); static sqInt isPrimitiveFunctionPointerAnIndex(void); @@ -1905,7 +1906,7 @@ /* 575 */ (void (*)(void))0, 0 }; static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void); -const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.199]"; +const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.201]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */; volatile int sendTrace;
@@ -20281,8 +20282,10 @@ } } else { - assert(((primitiveIndexOf(GIV(newMethod))) == 0) - || ((functionPointerForinClass(primitiveIndexOf(GIV(newMethod)), nilObject())) == 0)); + assert((isOopCompiledMethod(GIV(newMethod))) + && (((primitiveIndexOf(GIV(newMethod))) == 0) + || (((functionPointerForinClass(primitiveIndexOf(GIV(newMethod)), nilObject())) == 0) + || (isNullExternalPrimitiveCall(GIV(newMethod)))))); } activateNewMethod(); siglongjmp(reenterInterpreter, ReturnToInterpreter); @@ -20504,6 +20507,27 @@ }
+/* Answer if the method is an external primtiive call (prim 117) with a null + external primtiive. + This is just for an assert in the CoInterpreter. */ + +static sqInt +isNullExternalPrimitiveCall(sqInt aMethodObj) +{ + sqInt lit; + + if (!(((primitiveIndexOf(aMethodObj)) == 117) + && ((literalCountOfHeader(headerOf(aMethodObj))) > 0))) { + return 0; + } + lit = longAt((aMethodObj + BaseHeaderSize) + ((0 + LiteralStart) << ShiftForWord)); + return (((lit & 1) == 0) + && (((((usqInt) (longAt(lit))) >> 8) & 15) == 2)) + && (((lengthOf(lit)) == 4) + && ((longAt((lit + BaseHeaderSize) + (3 << ShiftForWord))) == ConstZero)); +} + + /* Answer whether the oop is an object of compiled method format */
sqInt
Modified: branches/Cog/src/vm/cointerp.h =================================================================== --- branches/Cog/src/vm/cointerp.h 2012-08-10 23:59:57 UTC (rev 2584) +++ branches/Cog/src/vm/cointerp.h 2012-08-14 16:06:45 UTC (rev 2585) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d */
Modified: branches/Cog/src/vm/cointerpmt.c =================================================================== --- branches/Cog/src/vm/cointerpmt.c 2012-08-10 23:59:57 UTC (rev 2584) +++ branches/Cog/src/vm/cointerpmt.c 2012-08-14 16:06:45 UTC (rev 2585) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.200 uuid: 5a8e1270-adca-4f75-9712-0c0deda989d2 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d from - CoInterpreterMT VMMaker.oscog-eem.200 uuid: 5a8e1270-adca-4f75-9712-0c0deda989d2 + CoInterpreterMT VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d */ -static char __buildInfo[] = "CoInterpreterMT VMMaker.oscog-eem.200 uuid: 5a8e1270-adca-4f75-9712-0c0deda989d2 " __DATE__ ; +static char __buildInfo[] = "CoInterpreterMT VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -666,6 +666,7 @@ sqInt isMarked(sqInt oop); static sqInt isMarriedOrWidowedContext(sqInt aContext); sqInt isNonIntegerObject(sqInt objectPointer); +static sqInt isNullExternalPrimitiveCall(sqInt aMethodObj); sqInt isOopCompiledMethod(sqInt oop); sqInt isPointers(sqInt oop); static sqInt isPrimitiveFunctionPointerAnIndex(void); @@ -2004,7 +2005,7 @@ /* 575 */ (void (*)(void))0, 0 }; static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void); -const char *interpreterVersion = "Croquet Closure Cog MT VM [CoInterpreterMT VMMaker.oscog-eem.200]"; +const char *interpreterVersion = "Croquet Closure Cog MT VM [CoInterpreterMT VMMaker.oscog-eem.201]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */; volatile int sendTrace; sqInt willNotThreadWarnCount; @@ -20987,8 +20988,10 @@ } } else { - assert(((primitiveIndexOf(GIV(newMethod))) == 0) - || ((functionPointerForinClass(primitiveIndexOf(GIV(newMethod)), nilObject())) == 0)); + assert((isOopCompiledMethod(GIV(newMethod))) + && (((primitiveIndexOf(GIV(newMethod))) == 0) + || (((functionPointerForinClass(primitiveIndexOf(GIV(newMethod)), nilObject())) == 0) + || (isNullExternalPrimitiveCall(GIV(newMethod)))))); } activateNewMethod(); siglongjmp(reenterInterpreter, ReturnToInterpreter); @@ -21235,6 +21238,27 @@ }
+/* Answer if the method is an external primtiive call (prim 117) with a null + external primtiive. + This is just for an assert in the CoInterpreter. */ + +static sqInt +isNullExternalPrimitiveCall(sqInt aMethodObj) +{ + sqInt lit; + + if (!(((primitiveIndexOf(aMethodObj)) == 117) + && ((literalCountOfHeader(headerOf(aMethodObj))) > 0))) { + return 0; + } + lit = longAt((aMethodObj + BaseHeaderSize) + ((0 + LiteralStart) << ShiftForWord)); + return (((lit & 1) == 0) + && (((((usqInt) (longAt(lit))) >> 8) & 15) == 2)) + && (((lengthOf(lit)) == 4) + && ((longAt((lit + BaseHeaderSize) + (3 << ShiftForWord))) == ConstZero)); +} + + /* Answer whether the oop is an object of compiled method format */
sqInt
Modified: branches/Cog/src/vm/cointerpmt.h =================================================================== --- branches/Cog/src/vm/cointerpmt.h 2012-08-10 23:59:57 UTC (rev 2584) +++ branches/Cog/src/vm/cointerpmt.h 2012-08-14 16:06:45 UTC (rev 2585) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.200 uuid: 5a8e1270-adca-4f75-9712-0c0deda989d2 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d */
Modified: branches/Cog/src/vm/gcc3x-cointerp.c =================================================================== --- branches/Cog/src/vm/gcc3x-cointerp.c 2012-08-10 23:59:57 UTC (rev 2584) +++ branches/Cog/src/vm/gcc3x-cointerp.c 2012-08-14 16:06:45 UTC (rev 2585) @@ -2,11 +2,11 @@
/* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d from - CoInterpreter VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CoInterpreter VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -613,6 +613,7 @@ sqInt isMarked(sqInt oop); static sqInt isMarriedOrWidowedContext(sqInt aContext); sqInt isNonIntegerObject(sqInt objectPointer); +static sqInt isNullExternalPrimitiveCall(sqInt aMethodObj); sqInt isOopCompiledMethod(sqInt oop); sqInt isPointers(sqInt oop); static sqInt isPrimitiveFunctionPointerAnIndex(void); @@ -1908,7 +1909,7 @@ /* 575 */ (void (*)(void))0, 0 }; static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void); -const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.199]"; +const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.201]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */; volatile int sendTrace;
@@ -20285,8 +20286,10 @@ } } else { - assert(((primitiveIndexOf(GIV(newMethod))) == 0) - || ((functionPointerForinClass(primitiveIndexOf(GIV(newMethod)), nilObject())) == 0)); + assert((isOopCompiledMethod(GIV(newMethod))) + && (((primitiveIndexOf(GIV(newMethod))) == 0) + || (((functionPointerForinClass(primitiveIndexOf(GIV(newMethod)), nilObject())) == 0) + || (isNullExternalPrimitiveCall(GIV(newMethod)))))); } activateNewMethod(); siglongjmp(reenterInterpreter, ReturnToInterpreter); @@ -20508,6 +20511,27 @@ }
+/* Answer if the method is an external primtiive call (prim 117) with a null + external primtiive. + This is just for an assert in the CoInterpreter. */ + +static sqInt +isNullExternalPrimitiveCall(sqInt aMethodObj) +{ + sqInt lit; + + if (!(((primitiveIndexOf(aMethodObj)) == 117) + && ((literalCountOfHeader(headerOf(aMethodObj))) > 0))) { + return 0; + } + lit = longAt((aMethodObj + BaseHeaderSize) + ((0 + LiteralStart) << ShiftForWord)); + return (((lit & 1) == 0) + && (((((usqInt) (longAt(lit))) >> 8) & 15) == 2)) + && (((lengthOf(lit)) == 4) + && ((longAt((lit + BaseHeaderSize) + (3 << ShiftForWord))) == ConstZero)); +} + + /* Answer whether the oop is an object of compiled method format */
sqInt
Modified: branches/Cog/src/vm/gcc3x-cointerpmt.c =================================================================== --- branches/Cog/src/vm/gcc3x-cointerpmt.c 2012-08-10 23:59:57 UTC (rev 2584) +++ branches/Cog/src/vm/gcc3x-cointerpmt.c 2012-08-14 16:06:45 UTC (rev 2585) @@ -2,11 +2,11 @@
/* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.200 uuid: 5a8e1270-adca-4f75-9712-0c0deda989d2 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d from - CoInterpreterMT VMMaker.oscog-eem.200 uuid: 5a8e1270-adca-4f75-9712-0c0deda989d2 + CoInterpreterMT VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d */ -static char __buildInfo[] = "CoInterpreterMT VMMaker.oscog-eem.200 uuid: 5a8e1270-adca-4f75-9712-0c0deda989d2 " __DATE__ ; +static char __buildInfo[] = "CoInterpreterMT VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -669,6 +669,7 @@ sqInt isMarked(sqInt oop); static sqInt isMarriedOrWidowedContext(sqInt aContext); sqInt isNonIntegerObject(sqInt objectPointer); +static sqInt isNullExternalPrimitiveCall(sqInt aMethodObj); sqInt isOopCompiledMethod(sqInt oop); sqInt isPointers(sqInt oop); static sqInt isPrimitiveFunctionPointerAnIndex(void); @@ -2007,7 +2008,7 @@ /* 575 */ (void (*)(void))0, 0 }; static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void); -const char *interpreterVersion = "Croquet Closure Cog MT VM [CoInterpreterMT VMMaker.oscog-eem.200]"; +const char *interpreterVersion = "Croquet Closure Cog MT VM [CoInterpreterMT VMMaker.oscog-eem.201]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */; volatile int sendTrace; sqInt willNotThreadWarnCount; @@ -20991,8 +20992,10 @@ } } else { - assert(((primitiveIndexOf(GIV(newMethod))) == 0) - || ((functionPointerForinClass(primitiveIndexOf(GIV(newMethod)), nilObject())) == 0)); + assert((isOopCompiledMethod(GIV(newMethod))) + && (((primitiveIndexOf(GIV(newMethod))) == 0) + || (((functionPointerForinClass(primitiveIndexOf(GIV(newMethod)), nilObject())) == 0) + || (isNullExternalPrimitiveCall(GIV(newMethod)))))); } activateNewMethod(); siglongjmp(reenterInterpreter, ReturnToInterpreter); @@ -21239,6 +21242,27 @@ }
+/* Answer if the method is an external primtiive call (prim 117) with a null + external primtiive. + This is just for an assert in the CoInterpreter. */ + +static sqInt +isNullExternalPrimitiveCall(sqInt aMethodObj) +{ + sqInt lit; + + if (!(((primitiveIndexOf(aMethodObj)) == 117) + && ((literalCountOfHeader(headerOf(aMethodObj))) > 0))) { + return 0; + } + lit = longAt((aMethodObj + BaseHeaderSize) + ((0 + LiteralStart) << ShiftForWord)); + return (((lit & 1) == 0) + && (((((usqInt) (longAt(lit))) >> 8) & 15) == 2)) + && (((lengthOf(lit)) == 4) + && ((longAt((lit + BaseHeaderSize) + (3 << ShiftForWord))) == ConstZero)); +} + + /* Answer whether the oop is an object of compiled method format */
sqInt
Modified: branches/Cog/src/vm/interp.h =================================================================== --- branches/Cog/src/vm/interp.h 2012-08-10 23:59:57 UTC (rev 2584) +++ branches/Cog/src/vm/interp.h 2012-08-14 16:06:45 UTC (rev 2585) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d */
#define VM_PROXY_MAJOR 1
Modified: branches/Cog/src/vm/vmCallback.h =================================================================== --- branches/Cog/src/vm/vmCallback.h 2012-08-10 23:59:57 UTC (rev 2584) +++ branches/Cog/src/vm/vmCallback.h 2012-08-14 16:06:45 UTC (rev 2585) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.199 uuid: 1b0cff66-2042-49a7-ae74-5fa119256732 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.201 uuid: 56cdd078-6771-401a-8bed-68402a0e283d */
#define VM_CALLBACK_INC 1
vm-dev@lists.squeakfoundation.org