[Vm-dev] [commit][2750] CogVM source as per VMMaker.oscog-eem.303
commits at squeakvm.org
commits at squeakvm.org
Tue Jul 16 22:54:53 UTC 2013
Revision: 2750
Author: eliot
Date: 2013-07-16 15:54:52 -0700 (Tue, 16 Jul 2013)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.303
Add assert:l: and asserta:l: which take line numbers.
Refactor assertValidExecutionPointe:r:s:imbar: to take a line number
and supply it to assert:l: et al, for more informative assert failures.
Use sqLowLevelMFence in deferStackLimitSmashAround:with: et al.
Refactor preambleCCode emission so that a comment indicating its
source is generated.
Eliminate some compiler warnings is pathTo:using:followWeak:.
Modified Paths:
--------------
branches/Cog/nscogsrc/examplePlugins.ext
branches/Cog/nscogsrc/plugins/BitBltPlugin/BitBltPlugin.c
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/dispdbg.h
branches/Cog/platforms/Cross/vm/sqAssert.h
branches/Cog/src/plugins/SqueakFFIPrims/SqueakFFIPrims.c
branches/Cog/src/vm/cointerp.c
branches/Cog/src/vm/cointerp.h
branches/Cog/src/vm/cointerpmt.c
branches/Cog/src/vm/cointerpmt.h
branches/Cog/src/vm/gcc3x-cointerp.c
branches/Cog/src/vm/gcc3x-cointerpmt.c
branches/Cog/src/vm/interp.h
branches/Cog/src/vm/vmCallback.h
Property Changed:
----------------
branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
Modified: branches/Cog/nscogsrc/examplePlugins.ext
===================================================================
--- branches/Cog/nscogsrc/examplePlugins.ext 2013-07-15 22:18:31 UTC (rev 2749)
+++ branches/Cog/nscogsrc/examplePlugins.ext 2013-07-16 22:54:52 UTC (rev 2750)
@@ -26,5 +26,6 @@
SqueakFFIPrims \
UUIDPlugin \
UnixOSProcessPlugin \
+VMProfileLinuxSupportPlugin \
VMProfileMacSupportPlugin \
Win32OSProcessPlugin
Modified: branches/Cog/nscogsrc/plugins/BitBltPlugin/BitBltPlugin.c
===================================================================
--- branches/Cog/nscogsrc/plugins/BitBltPlugin/BitBltPlugin.c 2013-07-15 22:18:31 UTC (rev 2749)
+++ branches/Cog/nscogsrc/plugins/BitBltPlugin/BitBltPlugin.c 2013-07-16 22:54:52 UTC (rev 2750)
@@ -1,9 +1,9 @@
/* Automatically generated by
- SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.282 uuid: 6c2f2048-555b-4d37-a9eb-4d9252acf3b9
+ SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.302 uuid: 2ac39432-ac54-4584-964e-b129c90792f4
from
- BitBltSimulation VMMaker.oscog-eem.282 uuid: 6c2f2048-555b-4d37-a9eb-4d9252acf3b9
+ BitBltSimulation VMMaker.oscog-eem.302 uuid: 2ac39432-ac54-4584-964e-b129c90792f4
*/
-static char __buildInfo[] = "BitBltSimulation VMMaker.oscog-eem.282 uuid: 6c2f2048-555b-4d37-a9eb-4d9252acf3b9 " __DATE__ ;
+static char __buildInfo[] = "BitBltSimulation VMMaker.oscog-eem.302 uuid: 2ac39432-ac54-4584-964e-b129c90792f4 " __DATE__ ;
@@ -33,6 +33,12 @@
#define EXPORT(returnType) static returnType
#endif
+#ifdef ENABLE_FAST_BLT
+#include "BitBltDispatch.h"
+#else
+// to handle the unavoidable decl in the spec of copyBitsFallback();
+#define operation_t void
+#endif
#include "sqMemoryAccess.h"
@@ -102,8 +108,11 @@
static sqInt clearWordwith(sqInt source, sqInt destination);
static void clipRange(void);
EXPORT(void) copyBits(void);
+static void copyBitsFastPathSpecialised(void);
EXPORT(void) copyBitsFromtoat(sqInt startX, sqInt stopX, sqInt yValue);
static void copyBitsLockedAndClipped(void);
+static void copyBitsRule41Test(void);
+void copyBitsFallback(operation_t *op, unsigned int flags);
static void copyLoop(void);
static void copyLoopNoSource(void);
static void copyLoopPixMap(void);
@@ -337,9 +346,9 @@
};
static const char *moduleName =
#ifdef SQUEAK_BUILTIN_PLUGIN
- "BitBltPlugin VMMaker.oscog-eem.282 (i)"
+ "BitBltPlugin VMMaker.oscog-eem.302 (i)"
#else
- "BitBltPlugin VMMaker.oscog-eem.282 (e)"
+ "BitBltPlugin VMMaker.oscog-eem.302 (e)"
#endif
;
static sqInt noHalftone;
@@ -1203,18 +1212,6 @@
EXPORT(void)
copyBits(void)
{
- sqInt done;
- sqInt dWid;
- sqInt dxLowBits;
- sqInt endBits;
- sqInt gammaLookupTableOop;
- sqInt pixPerM1;
- sqInt pixPerM11;
- sqInt startBits;
- sqInt sxLowBits;
- sqInt t;
- sqInt ungammaLookupTableOop;
-
clipRange();
if ((bbW <= 0)
|| (bbH <= 0)) {
@@ -1227,68 +1224,160 @@
if (!(lockSurfaces())) {
primitiveFail(); return;
}
- /* begin copyBitsLockedAndClipped */
- if (combinationRule == 41) {
+
+# if ENABLE_FAST_BLT
- /* fetch the forecolor into componentAlphaModeColor. */
+ /* you really, really mustn't call this unless you have the rest of the code to link to */
- componentAlphaModeAlpha = 255;
- componentAlphaModeColor = 16777215;
- gammaLookupTable = null;
- ungammaLookupTable = null;
- if ((methodArgumentCount()) >= 2) {
- componentAlphaModeAlpha = stackIntegerValue((methodArgumentCount()) - 2);
- if (!(!(failed()))) {
- primitiveFail();
- goto l1;
+ copyBitsFastPathSpecialised();
+
+# else /* ENABLE_FAST_BLT */
+ copyBitsLockedAndClipped();
+
+# endif /* ENABLE_FAST_BLT */
+
+ unlockSurfaces();
+}
+
+
+/* Perform the actual copyBits operation using the fast path specialised
+ code; fail some cases by falling back to normal code.
+ Assume: Surfaces have been locked and clipping was performed.
+ */
+
+static void
+copyBitsFastPathSpecialised(void)
+{
+
+# if ENABLE_FAST_BLT
+
+ /* set the affected area to 0 first */
+
+ affectedL = (affectedR = (affectedT = (affectedB = 0)));
+ copyBitsRule41Test();
+ if (!(!(failed()))) {
+ primitiveFail(); return;
+ }
+ if ((combinationRule == 30) || (combinationRule == 31)) {
+
+ /* Check and fetch source alpha parameter for alpha blend */
+
+ if ((methodArgumentCount()) == 1) {
+ sourceAlpha = stackIntegerValue(0);
+ if (!((!(failed()))
+ && ((sourceAlpha >= 0) && (sourceAlpha <= 255)))) {
+ primitiveFail(); return;
}
- componentAlphaModeColor = stackIntegerValue((methodArgumentCount()) - 1);
- if (!(!(failed()))) {
- primitiveFail();
- goto l1;
- }
- if ((methodArgumentCount()) == 4) {
- gammaLookupTableOop = stackObjectValue(1);
- if (isBytes(gammaLookupTableOop)) {
- gammaLookupTable = firstIndexableField(gammaLookupTableOop);
- }
- ungammaLookupTableOop = stackObjectValue(0);
- if (isBytes(ungammaLookupTableOop)) {
- ungammaLookupTable = firstIndexableField(ungammaLookupTableOop);
- }
- }
}
else {
- if ((methodArgumentCount()) == 1) {
- componentAlphaModeColor = stackIntegerValue(0);
- if (!(!(failed()))) {
- primitiveFail();
- goto l1;
- }
- }
- else {
- primitiveFail();
- goto l1;
- }
+ primitiveFail(); return;
}
}
+ if ((combinationRule != 22) && (combinationRule != 32)) {
+
+ /* zero width and height; return the count */
+
+ affectedL = dx;
+ affectedR = dx + bbW;
+ affectedT = dy;
+ affectedB = dy + bbH;
+ }
+
+ // fill the operation structure
+ operation_t op;
+ op.combinationRule = combinationRule;
+ op.noSource = noSource;
+ op.src.bits = (void *) sourceBits;
+ op.src.pitch = sourcePitch;
+ op.src.depth = sourceDepth;
+ op.src.msb = sourceMSB;
+ op.src.x = sx;
+ op.src.y = sy;
+ op.dest.bits = (void *) destBits;
+ op.dest.pitch = destPitch;
+ op.dest.depth = destDepth;
+ op.dest.msb = destMSB;
+ op.dest.x = dx;
+ op.dest.y = dy;
+ op.width = bbW;
+ op.height = bbH;
+ op.cmFlags = cmFlags;
+ op.cmShiftTable = (void *) cmShiftTable;
+ op.cmMaskTable = (void *) cmMaskTable;
+ op.cmMask = cmMask;
+ op.cmLookupTable = (void *) cmLookupTable;
+ op.noHalftone = noHalftone;
+ op.halftoneHeight = halftoneHeight;
+ op.halftoneBase = (void *) halftoneBase;
+ if (combinationRule == 30 || combinationRule == 31) {
+ op.opt.sourceAlpha = sourceAlpha;
+ }
+ if (combinationRule == 41) {
+ op.opt.componentAlpha.componentAlphaModeColor = componentAlphaModeColor;
+ op.opt.componentAlpha.componentAlphaModeAlpha = componentAlphaModeAlpha;
+ op.opt.componentAlpha.gammaLookupTable = (void *) gammaLookupTable;
+ op.opt.componentAlpha.ungammaLookupTable = (void *) ungammaLookupTable;
+ }
+ // call the sneaky code
+ copyBitsDispatch(&op);
+
+# endif /* ENABLE_FAST_BLT */
+
+}
+
+
+/* Support for the balloon engine. */
+
+EXPORT(void)
+copyBitsFromtoat(sqInt startX, sqInt stopX, sqInt yValue)
+{
+ destX = startX;
+ destY = yValue;
+ sourceX = startX;
+ width = stopX - startX;
+ copyBits();
+ /* begin showDisplayBits */
+ showDisplayBitsLeftTopRightBottom(destForm, affectedL, affectedT, affectedR, affectedB);
+}
+
+
+/* Perform the actual copyBits operation.
+ Assume: Surfaces have been locked and clipping was performed. */
+
+static void
+copyBitsLockedAndClipped(void)
+{
+ sqInt done;
+ sqInt dWid;
+ sqInt dxLowBits;
+ sqInt endBits;
+ sqInt pixPerM1;
+ sqInt pixPerM11;
+ sqInt startBits;
+ sqInt sxLowBits;
+ sqInt t;
+
+ copyBitsRule41Test();
+ if (!(!(failed()))) {
+ primitiveFail(); return;
+ }
/* begin tryCopyingBitsQuickly */
if (noSource) {
done = 0;
- goto l2;
+ goto l1;
}
if (!((combinationRule == 34)
|| (combinationRule == 41))) {
done = 0;
- goto l2;
+ goto l1;
}
if (!(sourceDepth == 32)) {
done = 0;
- goto l2;
+ goto l1;
}
if (sourceForm == destForm) {
done = 0;
- goto l2;
+ goto l1;
}
if (combinationRule == 41) {
if (destDepth == 32) {
@@ -1298,7 +1387,7 @@
affectedT = dy;
affectedB = dy + bbH;
done = 1;
- goto l2;
+ goto l1;
}
if (destDepth == 16) {
rgbComponentAlpha16();
@@ -1307,7 +1396,7 @@
affectedT = dy;
affectedB = dy + bbH;
done = 1;
- goto l2;
+ goto l1;
}
if (destDepth == 8) {
rgbComponentAlpha8();
@@ -1316,19 +1405,19 @@
affectedT = dy;
affectedB = dy + bbH;
done = 1;
- goto l2;
+ goto l1;
}
done = 0;
- goto l2;
+ goto l1;
}
if (destDepth < 8) {
done = 0;
- goto l2;
+ goto l1;
}
if ((destDepth == 8)
&& ((cmFlags & ColorMapPresent) == 0)) {
done = 0;
- goto l2;
+ goto l1;
}
if (destDepth == 32) {
alphaSourceBlendBits32();
@@ -1344,10 +1433,9 @@
affectedT = dy;
affectedB = dy + bbH;
done = 1;
-l2: /* end tryCopyingBitsQuickly */;
+l1: /* end tryCopyingBitsQuickly */;
if (done) {
- null;
- goto l1;
+ return;
}
if ((combinationRule == 30) || (combinationRule == 31)) {
@@ -1357,13 +1445,11 @@
sourceAlpha = stackIntegerValue(0);
if (!((!(failed()))
&& ((sourceAlpha >= 0) && (sourceAlpha <= 255)))) {
- primitiveFail();
- goto l1;
+ primitiveFail(); return;
}
}
else {
- primitiveFail();
- goto l1;
+ primitiveFail(); return;
}
}
@@ -1537,47 +1623,19 @@
affectedT = (dy - bbH) + 1;
affectedB = dy + 1;
}
-l1: /* end copyBitsLockedAndClipped */;
- unlockSurfaces();
}
-/* Support for the balloon engine. */
+/* Test possible use of rule 41, rgbComponentAlpha:with: Nothing to return,
+ just set up some variables
+ */
-EXPORT(void)
-copyBitsFromtoat(sqInt startX, sqInt stopX, sqInt yValue)
-{
- destX = startX;
- destY = yValue;
- sourceX = startX;
- width = stopX - startX;
- copyBits();
- /* begin showDisplayBits */
- showDisplayBitsLeftTopRightBottom(destForm, affectedL, affectedT, affectedR, affectedB);
-}
-
-
-/* Perform the actual copyBits operation.
- Assume: Surfaces have been locked and clipping was performed. */
-
static void
-copyBitsLockedAndClipped(void)
+copyBitsRule41Test(void)
{
- sqInt done;
- sqInt dWid;
- sqInt dxLowBits;
- sqInt endBits;
sqInt gammaLookupTableOop;
- sqInt pixPerM1;
- sqInt pixPerM11;
- sqInt startBits;
- sqInt sxLowBits;
- sqInt t;
sqInt ungammaLookupTableOop;
-
- /* Try a shortcut for stuff that should be run as quickly as possible */
-
if (combinationRule == 41) {
/* fetch the forecolor into componentAlphaModeColor. */
@@ -1618,6 +1676,74 @@
}
}
}
+}
+
+
+/* Recover from the fast path specialised code saying Help-I-cant-cope */
+
+void
+copyBitsFallback(operation_t *op, unsigned int flags)
+{
+ sqInt done;
+ sqInt dWid;
+ sqInt dxLowBits;
+ sqInt endBits;
+ sqInt pixPerM1;
+ sqInt pixPerM11;
+ sqInt startBits;
+ sqInt sxLowBits;
+ sqInt t;
+
+
+# if ENABLE_FAST_BLT
+
+ /* recover values from the operation struct used by the fast ARM code */
+
+
+ combinationRule = op->combinationRule;
+ noSource = op->noSource;
+ sourceBits = (sqInt) op->src.bits;
+ sourcePitch = op->src.pitch;
+ sourceDepth = op->src.depth;
+ sourceMSB = op->src.msb;
+ sx = op->src.x;
+ sy = op->src.y;
+ destBits = (sqInt) op->dest.bits;
+ destPitch = op->dest.pitch;
+ destDepth = op->dest.depth;
+ destMSB = op->dest.msb;
+ dx = op->dest.x;
+ dy = op->dest.y;
+ bbW = op->width;
+ bbH = op->height;
+ cmFlags = op->cmFlags;
+ cmShiftTable = (void *) op->cmShiftTable;
+ cmMaskTable = (void *) op->cmMaskTable;
+ cmMask = op->cmMask;
+ cmLookupTable = (void *) op->cmLookupTable;
+ noHalftone = op->noHalftone;
+ halftoneHeight = op->halftoneHeight;
+ halftoneBase = (sqInt) op->halftoneBase;
+ if (combinationRule == 30 || combinationRule == 31) {
+ sourceAlpha = op->opt.sourceAlpha;
+ }
+ if (combinationRule == 41) {
+ componentAlphaModeColor = op->opt.componentAlpha.componentAlphaModeColor;
+ componentAlphaModeAlpha = op->opt.componentAlpha.componentAlphaModeAlpha;
+ gammaLookupTable = (void *) op->opt.componentAlpha.gammaLookupTable;
+ ungammaLookupTable = (void *) op->opt.componentAlpha.ungammaLookupTable;
+ }
+ destPPW = 32 / destDepth;
+ cmBitsPerColor = 0;
+ if (cmMask == 511) {
+ cmBitsPerColor = 3;
+ }
+ if (cmMask == 4095) {
+ cmBitsPerColor = 4;
+ }
+ if (cmMask == 16383) {
+ cmBitsPerColor = 5;
+ }
/* begin tryCopyingBitsQuickly */
if (noSource) {
done = 0;
@@ -1694,22 +1820,7 @@
if (done) {
return;
}
- if ((combinationRule == 30) || (combinationRule == 31)) {
- /* Check and fetch source alpha parameter for alpha blend */
-
- if ((methodArgumentCount()) == 1) {
- sourceAlpha = stackIntegerValue(0);
- if (!((!(failed()))
- && ((sourceAlpha >= 0) && (sourceAlpha <= 255)))) {
- primitiveFail(); return;
- }
- }
- else {
- primitiveFail(); return;
- }
- }
-
/* Choose and perform the actual copy loop. */
bitCount = 0;
@@ -1858,28 +1969,9 @@
copyLoop();
}
}
- if ((combinationRule == 22) || (combinationRule == 32)) {
- /* zero width and height; return the count */
+# endif /* ENABLE_FAST_BLT */
- affectedL = (affectedR = (affectedT = (affectedB = 0)));
- }
- if (hDir > 0) {
- affectedL = dx;
- affectedR = dx + bbW;
- }
- else {
- affectedL = (dx - bbW) + 1;
- affectedR = dx + 1;
- }
- if (vDir > 0) {
- affectedT = dy;
- affectedB = dy + bbH;
- }
- else {
- affectedT = (dy - bbH) + 1;
- affectedB = dy + 1;
- }
}
Modified: branches/Cog/nscogsrc/vm/cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.c 2013-07-15 22:18:31 UTC (rev 2749)
+++ branches/Cog/nscogsrc/vm/cointerp.c 2013-07-16 22:54:52 UTC (rev 2750)
@@ -1,9 +1,9 @@
/* Automatically generated by
- CCodeGeneratorGlobalStructure VMMaker.oscog-eem.302 uuid: 2ac39432-ac54-4584-964e-b129c90792f4
+ CCodeGeneratorGlobalStructure VMMaker.oscog-eem.303 uuid: 99b81fe2-3c89-43bb-8a2c-2541842da7e0
from
- CoInterpreter VMMaker.oscog-eem.302 uuid: 2ac39432-ac54-4584-964e-b129c90792f4
+ CoInterpreter VMMaker.oscog-eem.303 uuid: 99b81fe2-3c89-43bb-8a2c-2541842da7e0
*/
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.302 uuid: 2ac39432-ac54-4584-964e-b129c90792f4 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.303 uuid: 99b81fe2-3c89-43bb-8a2c-2541842da7e0 " __DATE__ ;
char *__interpBuildInfo = __buildInfo;
@@ -32,20 +32,21 @@
#include "sqMemoryAccess.h"
-void printCallStack(void);
-
+/* StackInterpreter class>>preambleCCode */
/* Disable Intel compiler inlining of warning which is used for breakpoints */
#pragma auto_inline off
void
warning(char *s) { /* Print an error message but don't exit. */
printf("\n%s\n", s);
}
+void
+warningat(char *s, int l) { /* ditto with line number. */
+ printf("\n%s %d\n", s,l);
+}
#pragma auto_inline on
void
invalidCompactClassError(char *s) { /* Print a compact class index error message and exit. */
- static sqInt printingStack = true; /* not running at this point */
-
printf("\nClass %s does not have the required compact class index\n", s);
exit(-1);
}
@@ -61,6 +62,8 @@
# define siglongjmp(jb,v) _longjmp(jb,v)
#endif
+/* end StackInterpreter class>>preambleCCode */
+
typedef struct _StackPage {
char *stackLimit;
char *headSP;
@@ -361,9 +364,9 @@
static CogMethod * asCogHomeMethod(CogBlockMethod *aCogMethod);
static sqInt asciiOfCharacter(sqInt characterObj);
void assertValidExecutionPointers(usqInt lip, char *lifp, char *lisp);
-static void assertValidExecutionPointersimbar(usqInt lip, char *lifp, char *lisp, sqInt inInterpreter);
+static void assertValidExecutionPointersimbarline(usqInt lip, char *lifp, char *lisp, sqInt inInterpreter, sqInt ln);
void assertValidMachineCodeFrame(sqInt instrPtr);
-static void assertValidStackLimits(void);
+static void assertValidStackLimits(sqInt ln);
static void attemptToSwitchToMachineCode(sqInt bcpc);
sqInt becomewith(sqInt array1, sqInt array2);
static sqInt becomewithtwoWaycopyHash(sqInt array1, sqInt array2, sqInt twoWayFlag, sqInt copyHashFlag);
@@ -477,7 +480,7 @@
static sqInt defaultCogCodeSize(void);
static sqInt defaultEdenBytes(void);
static sqInt defaultNumStackPages(void);
-static void deferStackLimitSmashAround(void (*functionSymbol)(void));
+static void deferStackLimitSmashAroundwith(void (*functionSymbol)(sqInt), sqInt arg);
static void displayBitsOfLeftTopRightBottom(sqInt aForm, sqInt l, sqInt t, sqInt r, sqInt b);
sqInt displayObject(void);
static sqInt divorceAllFrames(void);
@@ -593,9 +596,7 @@
sqInt headerOf(sqInt methodPointer);
static sqInt headerWhileForwardingOf(sqInt oop);
sqInt highBit(usqInt anUnsignedValue);
-static sqInt iframeIsBlockActivation(char *theFP);
static usqInt iframeMethod(char *theFP);
-static sqInt iframeReceiver(char *theFP);
static sqInt iframeSavedIP(char *theFP);
void ifValidWriteBackStackPointersSaveTo(void *theCFP, void *theCSP, char **savedFPP, char **savedSPP);
static sqInt imageSegmentVersion(void);
@@ -731,8 +732,6 @@
static CogBlockMethod * mframeCogMethod(char *theFP);
CogMethod * mframeHomeMethodExport(void);
CogMethod * mframeHomeMethod(char *theFP);
-static sqInt mframeIsBlockActivation(char *theFP);
-static sqInt mframeReceiver(char *theFP);
static sqInt minimumUnusedHeadroom(void);
sqInt mMethodClass(void);
static sqInt mnuMethodOrNilFor(sqInt rcvr);
@@ -1042,7 +1041,7 @@
static void printFrameThingat(char *name, char *address);
static void printFrameThingatextra(char *name, char *address, sqInt extraValue);
void printFrame(char *theFP);
-static void printFrameWithSP(char *theFP, char *theSP);
+void printFrameWithSP(char *theFP, char *theSP);
void printHex(sqInt n);
void printInstancesOf(sqInt aClassOop);
static void printLogEntryAt(sqInt i);
@@ -1068,7 +1067,6 @@
void print(char *s);
static void pruneStackstackp(sqInt stack, sqInt stackp);
void pushBool(sqInt trueOrFalse);
-static sqInt pushedReceiverOrClosureOfFrame(char *theFP);
void pushFloat(double f);
sqInt pushInteger(sqInt integerValue);
void pushRemappableOop(sqInt oop);
@@ -1978,7 +1976,7 @@
/* 575 */ (void (*)(void))0,
0 };
static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void);
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.302";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.303";
sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
volatile int sendTrace;
@@ -4442,7 +4440,7 @@
assertCStackWellAligned();
assert((((usqInt)localIP)) < (startOfMemory()));
assert(isMachineCodeFrame(localFP));
- assertValidExecutionPointersimbar(((usqInt)localIP), localFP, localSP, 0);
+ assertValidExecutionPointersimbarline(((usqInt)localIP), localFP, localSP, 0, __LINE__);
longAtPointerput(localSP, localIP);
/* begin internalPush: */
longAtPointerput((localSP -= BytesPerOop), localReturnValue);
@@ -4667,7 +4665,7 @@
assertCStackWellAligned();
assert((((usqInt)localIP)) < (startOfMemory()));
assert(isMachineCodeFrame(localFP));
- assertValidExecutionPointersimbar(((usqInt)localIP), localFP, localSP, 0);
+ assertValidExecutionPointersimbarline(((usqInt)localIP), localFP, localSP, 0, __LINE__);
longAtPointerput(localSP, localIP);
/* begin internalPush: */
longAtPointerput((localSP -= BytesPerOop), localReturnValue);
@@ -4717,7 +4715,7 @@
assertCStackWellAligned();
assert((((usqInt)localIP)) < (startOfMemory()));
assert(isMachineCodeFrame(localFP));
- assertValidExecutionPointersimbar(((usqInt)localIP), localFP, localSP, 0);
+ assertValidExecutionPointersimbarline(((usqInt)localIP), localFP, localSP, 0, __LINE__);
longAtPointerput(localSP, localIP);
/* begin internalPush: */
longAtPointerput((localSP -= BytesPerOop), localReturnValue);
@@ -5649,7 +5647,7 @@
localSP = pointerForOop(GIV(stackPointer));
localFP = pointerForOop(GIV(framePointer));
markStackPageMostRecentlyUsed(GIV(stackPage));
- assertValidExecutionPointersimbar(((usqInt)localIP), localFP, localSP, 1);
+ assertValidExecutionPointersimbarline(((usqInt)localIP), localFP, localSP, 1, __LINE__);
l5: /* end instVar:ofContext:put: */;
}
else {
@@ -5912,7 +5910,6 @@
sqInt blockSize;
sqInt context;
sqInt i;
- sqInt initialIP;
sqInt newClosure;
sqInt newClosure1;
sqInt numArgs;
@@ -5943,14 +5940,13 @@
l9: /* end ensureFrameIsMarried:SP: */;
/* begin closureIn:numArgs:instructionPointer:numCopiedValues: */
VM_LABEL(0closureInnumArgsinstructionPointernumCopiedValues);
- initialIP = ((oopForPointer(localIP)) + 2) - (GIV(method) + BaseHeaderSize);
assert(((BytesPerWord * (ClosureFirstCopiedValueIndex + numCopied)) + BaseHeaderSize) <= 252);
/* Assume: have just allocated a new closure; it must be young. Thus, can use unchecked stores. */
newClosure1 = eeInstantiateSmallClasssizeInBytes(longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassBlockClosure << ShiftForWord)), (BytesPerWord * (ClosureFirstCopiedValueIndex + numCopied)) + BaseHeaderSize);
longAtput((newClosure1 + BaseHeaderSize) + (ClosureOuterContextIndex << ShiftForWord), context);
- longAtput((newClosure1 + BaseHeaderSize) + (ClosureStartPCIndex << ShiftForWord), ((initialIP << 1) | 1));
+ longAtput((newClosure1 + BaseHeaderSize) + (ClosureStartPCIndex << ShiftForWord), (((((oopForPointer(localIP)) + 2) - (GIV(method) + BaseHeaderSize)) << 1) | 1));
longAtput((newClosure1 + BaseHeaderSize) + (ClosureNumArgsIndex << ShiftForWord), ((numArgs << 1) | 1));
newClosure = newClosure1;
if (recordSendTrace()) {
@@ -12072,7 +12068,7 @@
localSP = pointerForOop(GIV(stackPointer));
localFP = pointerForOop(GIV(framePointer));
markStackPageMostRecentlyUsed(GIV(stackPage));
- assertValidExecutionPointersimbar(((usqInt)localIP), localFP, localSP, 1);
+ assertValidExecutionPointersimbarline(((usqInt)localIP), localFP, localSP, 1, __LINE__);
l262: /* end instVar:ofContext:put: */;
}
else {
@@ -12224,7 +12220,7 @@
localSP = pointerForOop(GIV(stackPointer));
localFP = pointerForOop(GIV(framePointer));
markStackPageMostRecentlyUsed(GIV(stackPage));
- assertValidExecutionPointersimbar(((usqInt)localIP), localFP, localSP, 1);
+ assertValidExecutionPointersimbarline(((usqInt)localIP), localFP, localSP, 1, __LINE__);
l263: /* end instVar:ofContext:put: */;
}
else {
@@ -12571,7 +12567,6 @@
sqInt byte;
sqInt context;
sqInt i;
- sqInt initialIP;
sqInt newClosure;
sqInt newClosure1;
sqInt numArgs;
@@ -12599,14 +12594,13 @@
l266: /* end ensureFrameIsMarried:SP: */;
/* begin closureIn:numArgs:instructionPointer:numCopiedValues: */
VM_LABEL(1closureInnumArgsinstructionPointernumCopiedValues);
- initialIP = ((oopForPointer(localIP)) + 2) - (GIV(method) + BaseHeaderSize);
assert(((BytesPerWord * (ClosureFirstCopiedValueIndex + numCopied)) + BaseHeaderSize) <= 252);
/* Assume: have just allocated a new closure; it must be young. Thus, can use unchecked stores. */
newClosure1 = eeInstantiateSmallClasssizeInBytes(longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassBlockClosure << ShiftForWord)), (BytesPerWord * (ClosureFirstCopiedValueIndex + numCopied)) + BaseHeaderSize);
longAtput((newClosure1 + BaseHeaderSize) + (ClosureOuterContextIndex << ShiftForWord), context);
- longAtput((newClosure1 + BaseHeaderSize) + (ClosureStartPCIndex << ShiftForWord), ((initialIP << 1) | 1));
+ longAtput((newClosure1 + BaseHeaderSize) + (ClosureStartPCIndex << ShiftForWord), (((((oopForPointer(localIP)) + 2) - (GIV(method) + BaseHeaderSize)) << 1) | 1));
longAtput((newClosure1 + BaseHeaderSize) + (ClosureNumArgsIndex << ShiftForWord), ((numArgs << 1) | 1));
newClosure = newClosure1;
if (recordSendTrace()) {
@@ -13399,44 +13393,46 @@
void
assertValidExecutionPointers(usqInt lip, char *lifp, char *lisp)
{
- assertValidExecutionPointersimbar(lip, lifp, lisp, !((((usqInt)(longAt(lifp + FoxMethod)))) < (startOfMemory())));
+ assertValidExecutionPointersimbarline(lip, lifp, lisp, !((((usqInt)(longAt(lifp + FoxMethod)))) < (startOfMemory())), __LINE__);
}
static void
-assertValidExecutionPointersimbar(usqInt lip, char *lifp, char *lisp, sqInt inInterpreter)
+assertValidExecutionPointersimbarline(usqInt lip, char *lifp, char *lisp, sqInt inInterpreter, sqInt ln)
{ DECL_MAYBE_SQ_GLOBAL_STRUCT
CogMethod *cogMethod;
sqInt methodField;
sqInt methodField1;
- assert(GIV(stackPage) == (stackPageFor(lifp)));
- assert(GIV(stackPage) == (mostRecentlyUsedPage()));
- deferStackLimitSmashAround(assertValidStackLimits);
- assert(lifp < ((GIV(stackPage)->baseAddress)));
- assert(lisp < lifp);
- assert(lifp > lisp);
- assert(lisp >= (((GIV(stackPage)->realStackLimit)) - (stackLimitOffset())));
- assert((lifp - lisp) < LargeContextSize);
+ assertl(GIV(stackPage) == (stackPageFor(lifp)), ln);
+ assertl(GIV(stackPage) == (mostRecentlyUsedPage()), ln);
+ deferStackLimitSmashAroundwith(assertValidStackLimits, ln);
+ assertl(lifp < ((GIV(stackPage)->baseAddress)), ln);
+ assertl(lisp < lifp, ln);
+ assertl(lifp > lisp, ln);
+ assertl(lisp >= (((GIV(stackPage)->realStackLimit)) - ((IFrameSlots + 64) * BytesPerWord)), ln);
+ assertl((lifp - lisp) < LargeContextSize, ln);
methodField = longAt(lifp + FoxMethod);
if (inInterpreter) {
- assert(!(isMachineCodeFrame(lifp)));
- assert(GIV(method) == methodField);
- assert((methodUsesAlternateBytecodeSet(GIV(method))) == (GIV(bytecodeSetSelector) == 256));
+ assertl(!((((usqInt)(longAt(lifp + FoxMethod)))) < (startOfMemory())), ln);
+ assertl(GIV(method) == methodField, ln);
+ assertl((headerIndicatesAlternateBytecodeSet(headerOf(GIV(method)))) == (GIV(bytecodeSetSelector) == 256), ln);
- if ((asserta((((usqInt)methodField)) > (startOfMemory())))
- && (asserta((((usqInt)methodField)) < (freeStart())))) {
+ if ((assertal((((usqInt)methodField)) > (startOfMemory()), ln))
+ && (assertal((((usqInt)methodField)) < (freeStart()), ln))) {
if (lip != (ceReturnToInterpreterPC())) {
- assert((lip >= (((methodField + (lastPointerOf(methodField))) + BaseHeaderSize) - 1))
- && (lip < ((methodField + (byteLengthOf(methodField))) + BaseHeaderSize)));
+ assertl((lip >= (((methodField + (lastPointerOf(methodField))) + BaseHeaderSize) - 1))
+ && (lip < ((methodField + (byteLengthOf(methodField))) + BaseHeaderSize)), ln);
}
}
- assert((iframeIsBlockActivation(lifp))
- || ((pushedReceiverOrClosureOfFrame(lifp)) == (iframeReceiver(lifp))));
+ assertl(((byteAt((lifp + FoxIFrameFlags) + 3)) != 0)
+ || ((longAt(lifp + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(lifp + FoxMethod)))) < (startOfMemory())
+ ? (mframeCogMethod(lifp)->cmNumArgs)
+ : byteAt((lifp + FoxIFrameFlags) + 1)))))) == (longAt(lifp + FoxIFReceiver))), ln);
}
else {
- assert(isMachineCodeFrame(lifp));
- if ((asserta((((usqInt)methodField)) >= (minCogMethodAddress())))
- && (asserta((((usqInt)methodField)) < (maxCogMethodAddress())))) {
+ assertl((((usqInt)(longAt(lifp + FoxMethod)))) < (startOfMemory()), ln);
+ if ((assertal((((usqInt)methodField)) >= (minCogMethodAddress()), ln))
+ && (assertal((((usqInt)methodField)) < (maxCogMethodAddress()), ln))) {
/* begin mframeHomeMethod: */
methodField1 = longAt(lifp + FoxMethod);
if ((methodField1 & MFMethodFlagIsBlockFlag) != 0) {
@@ -13445,17 +13441,21 @@
}
cogMethod = ((CogMethod *) (methodField1 & MFMethodMask));
l1: /* end mframeHomeMethod: */;
- assert((lip > (methodField + ((mframeIsBlockActivation(lifp)
+ assertl((lip > (methodField + ((((longAt(lifp + FoxMethod)) & MFMethodFlagIsBlockFlag) != 0
? sizeof(CogBlockMethod)
: sizeof(CogMethod)))))
- && (lip < (methodField + ((cogMethod->blockSize)))));
+ && (lip < (methodField + ((cogMethod->blockSize)))), ln);
}
- assert((mframeIsBlockActivation(lifp))
- || ((pushedReceiverOrClosureOfFrame(lifp)) == (mframeReceiver(lifp))));
+ assertl((((longAt(lifp + FoxMethod)) & MFMethodFlagIsBlockFlag) != 0)
+ || ((longAt(lifp + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(lifp + FoxMethod)))) < (startOfMemory())
+ ? (mframeCogMethod(lifp)->cmNumArgs)
+ : byteAt((lifp + FoxIFrameFlags) + 1)))))) == (longAt(lifp + FoxMFReceiver))), ln);
}
if ((longAt(lifp + FoxSavedFP)) == 0) {
- assert(frameHasContext(lifp));
- assert((frameContext(lifp)) == (longAt(((GIV(stackPage)->baseAddress)) - BytesPerWord)));
+ assertl(((((usqInt)(longAt(lifp + FoxMethod)))) < (startOfMemory())
+ ? ((longAt(lifp + FoxMethod)) & MFMethodFlagHasContextFlag) != 0
+ : (byteAt((lifp + FoxIFrameFlags) + 2)) != 0), ln);
+ assertl((longAt(lifp + FoxThisContext)) == (longAt(((GIV(stackPage)->baseAddress)) - BytesPerWord)), ln);
}
}
@@ -13484,12 +13484,12 @@
*/
static void
-assertValidStackLimits(void)
+assertValidStackLimits(sqInt ln)
{ DECL_MAYBE_SQ_GLOBAL_STRUCT
- assert((GIV(stackLimit) == ((GIV(stackPage)->realStackLimit)))
- || (GIV(stackLimit) == (((char *) (((usqInt) -1))))));
- assert((((GIV(stackPage)->stackLimit)) == ((GIV(stackPage)->realStackLimit)))
- || (((GIV(stackPage)->stackLimit)) == (((char *) (((usqInt) -1))))));
+ assertl((GIV(stackLimit) == ((GIV(stackPage)->realStackLimit)))
+ || (GIV(stackLimit) == (((char *) (((usqInt) -1))))), ln);
+ assertl((((GIV(stackPage)->stackLimit)) == ((GIV(stackPage)->realStackLimit)))
+ || (((GIV(stackPage)->stackLimit)) == (((char *) (((usqInt) -1))))), ln);
}
static void
@@ -15216,7 +15216,7 @@
? 256
: 0);
- assertValidExecutionPointersimbar(longAt(GIV(framePointer) + FoxIFSavedIP), GIV(framePointer), GIV(stackPointer), 1);
+ assertValidExecutionPointersimbarline(longAt(GIV(framePointer) + FoxIFSavedIP), GIV(framePointer), GIV(stackPointer), 1, __LINE__);
GIV(instructionPointer) = longAt(GIV(framePointer) + FoxIFSavedIP);
/* begin push: */
longAtput((sp = GIV(stackPointer) - BytesPerWord), anOop);
@@ -15603,7 +15603,7 @@
cogMethod = ((CogBlockMethod *) ((longAt(GIV(framePointer) + FoxMethod)) & MFMethodMask));
assert((cesoRetAddr - (abortOffset())) == (((sqInt)(asCogHomeMethod(cogMethod)))));
GIV(instructionPointer) = (((sqInt)cogMethod)) + ((cogMethod->stackCheckOffset));
- assertValidExecutionPointersimbar(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), 0);
+ assertValidExecutionPointersimbarline(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), 0, __LINE__);
GIV(method) = (GIV(newMethod) = (GIV(messageSelector) = (GIV(lkupClass) = GIV(nilObj))));
switched = handleStackOverflowOrEventAllowContextSwitch(contextSwitchIfNotNil != 0);
returnToExecutivepostContextSwitch(0, switched);
@@ -18394,13 +18394,16 @@
*/
static void
-deferStackLimitSmashAround(void (*functionSymbol)(void))
+deferStackLimitSmashAroundwith(void (*functionSymbol)(sqInt), sqInt arg)
{ DECL_MAYBE_SQ_GLOBAL_STRUCT
GIV(deferSmash) = 1;
- functionSymbol();
+ sqLowLevelMFence();
+ functionSymbol(arg);
GIV(deferSmash) = 0;
+ sqLowLevelMFence();
if (GIV(deferredSmash)) {
GIV(deferredSmash) = 0;
+ sqLowLevelMFence();
forceInterruptCheck();
}
}
@@ -19878,7 +19881,7 @@
if (GIV(instructionPointer) == (ceReturnToInterpreterPC())) {
GIV(instructionPointer) = longAt(GIV(framePointer) + FoxIFSavedIP);
}
- assertValidExecutionPointersimbar(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), 1);
+ assertValidExecutionPointersimbarline(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), 1, __LINE__);
interpret();
return 0;
}
@@ -19933,7 +19936,7 @@
assertCStackWellAligned();
assert(isMachineCodeFrame(GIV(framePointer)));
- assertValidExecutionPointersimbar(longAt(GIV(stackPointer)), GIV(framePointer), GIV(stackPointer), 0);
+ assertValidExecutionPointersimbarline(longAt(GIV(stackPointer)), GIV(framePointer), GIV(stackPointer), 0, __LINE__);
# if (numRegArgs()) > 0
if (((cogMethod->cmNumArgs)) <= (numRegArgs())) {
@@ -19973,7 +19976,7 @@
assertCStackWellAligned();
assert(isMachineCodeFrame(GIV(framePointer)));
- assertValidExecutionPointersimbar(longAt(GIV(stackPointer)), GIV(framePointer), GIV(stackPointer), 0);
+ assertValidExecutionPointersimbarline(longAt(GIV(stackPointer)), GIV(framePointer), GIV(stackPointer), 0, __LINE__);
/* begin push: */
object = (((sqInt)cogMethod)) + (entryOffset());
longAtput((sp1 = GIV(stackPointer) - BytesPerWord), object);
@@ -20027,7 +20030,7 @@
assertCStackWellAligned();
assert(isMachineCodeFrame(GIV(framePointer)));
- assertValidExecutionPointersimbar(longAt(GIV(stackPointer)), GIV(framePointer), GIV(stackPointer), 0);
+ assertValidExecutionPointersimbarline(longAt(GIV(stackPointer)), GIV(framePointer), GIV(stackPointer), 0, __LINE__);
# if (numRegArgs()) > 0
if (((cogMethod->cmNumArgs)) <= (numRegArgs())) {
@@ -20874,7 +20877,7 @@
: (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)
? (assert(checkIsStillMarriedContextcurrentFP(frameContext(callerFP), null)),
longAt(callerFP + FoxThisContext))
- : callerFP));
+ : ((sqInt)callerFP)));
case StackPointerIndex:
case InstructionPointerIndex:
@@ -21903,8 +21906,10 @@
sqLowLevelMFence();
}
l1: /* end checkForLongRunningPrimitive */;
+ sqLowLevelMFence();
if (GIV(deferSmash)) {
GIV(deferredSmash) = 1;
+ sqLowLevelMFence();
}
else {
forceInterruptCheck();
@@ -22924,15 +22929,6 @@
return bitNo + shifted;
}
-
-/* <Integer> */
-
-static sqInt
-iframeIsBlockActivation(char *theFP)
-{
- return (byteAt((theFP + FoxIFrameFlags) + 3)) != 0;
-}
-
static usqInt
iframeMethod(char *theFP)
{
@@ -22940,12 +22936,6 @@
}
static sqInt
-iframeReceiver(char *theFP)
-{
- return longAt(theFP + FoxIFReceiver);
-}
-
-static sqInt
iframeSavedIP(char *theFP)
{
return longAt(theFP + FoxIFSavedIP);
@@ -28521,21 +28511,6 @@
}
-/* <Integer> */
-
-static sqInt
-mframeIsBlockActivation(char *theFP)
-{
- return ((longAt(theFP + FoxMethod)) & MFMethodFlagIsBlockFlag) != 0;
-}
-
-static sqInt
-mframeReceiver(char *theFP)
-{
- return longAt(theFP + FoxMFReceiver);
-}
-
-
/* Traverse all stack pages looking for non-zero bytes in the headroom part
of each page.
Answer the minimum size of unused headroom (zero bytes) in the pages. This
@@ -31706,7 +31681,7 @@
cogMethod = ((CogMethod *) methodHeader1);
assertCStackWellAligned();
/* begin assertValidExecutionPointe:r:s: */
- assertValidExecutionPointersimbar(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), !((((usqInt)(longAt(GIV(framePointer) + FoxMethod)))) < (startOfMemory())));
+ assertValidExecutionPointersimbarline(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), !((((usqInt)(longAt(GIV(framePointer) + FoxMethod)))) < (startOfMemory())), __LINE__);
/* begin ensurePushedInstructionPointer */
if ((((usqInt)GIV(instructionPointer))) >= (startOfMemory())) {
@@ -31761,7 +31736,7 @@
cogMethod1 = ((CogMethod *) methodHeader2);
assertCStackWellAligned();
/* begin assertValidExecutionPointe:r:s: */
- assertValidExecutionPointersimbar(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), !((((usqInt)(longAt(GIV(framePointer) + FoxMethod)))) < (startOfMemory())));
+ assertValidExecutionPointersimbarline(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), !((((usqInt)(longAt(GIV(framePointer) + FoxMethod)))) < (startOfMemory())), __LINE__);
/* begin ensurePushedInstructionPointer */
if ((((usqInt)GIV(instructionPointer))) >= (startOfMemory())) {
@@ -31978,7 +31953,7 @@
cogMethod = ((CogMethod *) methodHeader1);
assertCStackWellAligned();
/* begin assertValidExecutionPointe:r:s: */
- assertValidExecutionPointersimbar(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), !((((usqInt)(longAt(GIV(framePointer) + FoxMethod)))) < (startOfMemory())));
+ assertValidExecutionPointersimbarline(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), !((((usqInt)(longAt(GIV(framePointer) + FoxMethod)))) < (startOfMemory())), __LINE__);
/* begin ensurePushedInstructionPointer */
if ((((usqInt)GIV(instructionPointer))) >= (startOfMemory())) {
@@ -32033,7 +32008,7 @@
cogMethod1 = ((CogMethod *) methodHeader2);
assertCStackWellAligned();
/* begin assertValidExecutionPointe:r:s: */
- assertValidExecutionPointersimbar(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), !((((usqInt)(longAt(GIV(framePointer) + FoxMethod)))) < (startOfMemory())));
+ assertValidExecutionPointersimbarline(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), !((((usqInt)(longAt(GIV(framePointer) + FoxMethod)))) < (startOfMemory())), __LINE__);
/* begin ensurePushedInstructionPointer */
if ((((usqInt)GIV(instructionPointer))) >= (startOfMemory())) {
@@ -32285,7 +32260,7 @@
cogMethod = ((CogMethod *) methodHeader1);
assertCStackWellAligned();
/* begin assertValidExecutionPointe:r:s: */
- assertValidExecutionPointersimbar(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), !((((usqInt)(longAt(GIV(framePointer) + FoxMethod)))) < (startOfMemory())));
+ assertValidExecutionPointersimbarline(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), !((((usqInt)(longAt(GIV(framePointer) + FoxMethod)))) < (startOfMemory())), __LINE__);
/* begin ensurePushedInstructionPointer */
if ((((usqInt)GIV(instructionPointer))) >= (startOfMemory())) {
@@ -32340,7 +32315,7 @@
cogMethod1 = ((CogMethod *) methodHeader2);
assertCStackWellAligned();
/* begin assertValidExecutionPointe:r:s: */
- assertValidExecutionPointersimbar(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), !((((usqInt)(longAt(GIV(framePointer) + FoxMethod)))) < (startOfMemory())));
+ assertValidExecutionPointersimbarline(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), !((((usqInt)(longAt(GIV(framePointer) + FoxMethod)))) < (startOfMemory())), __LINE__);
/* begin ensurePushedInstructionPointer */
if ((((usqInt)GIV(instructionPointer))) >= (startOfMemory())) {
@@ -40000,7 +39975,7 @@
next = ((((((usqInt)current)) & (BytesPerWord - 1)) == 0)
&& ((((((usqInt)current)) >= (((usqInt)(GIV(stackBasePlus1) - 1)))) && ((((usqInt)current)) <= (((usqInt)GIV(pages))))))
? (index >= 0
- ? fieldofFrame(index, current)
+ ? fieldofFrame(index, ((char *) current))
: GIV(nilObj))
: (index >= 0
? ((hdr = longAt(current)),
@@ -40012,7 +39987,7 @@
: longAt(((longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (CompactClasses << ShiftForWord))) + BaseHeaderSize) + ((ccIndex - 1) << ShiftForWord)))));
if ((((((usqInt)next)) & (BytesPerWord - 1)) == 0)
&& ((((((usqInt)next)) >= (((usqInt)(GIV(stackBasePlus1) - 1)))) && ((((usqInt)next)) <= (((usqInt)GIV(pages))))))) {
- assert(isFrameonPage(next, stackPageFor(next)));
+ assert(isFrameonPage(((char *) next), stackPageFor(((char *) next))));
}
else {
if (next >= heapBase) {
@@ -45736,7 +45711,7 @@
printFrameWithSP(theFP, theSP);
}
-static void
+void
printFrameWithSP(char *theFP, char *theSP)
{ DECL_MAYBE_SQ_GLOBAL_STRUCT
char *addr;
@@ -47407,19 +47382,6 @@
GIV(stackPointer) = sp;
}
-
-/* The receiver of a message send or the closure of a block activation is
- always on the stack above any arguments and the frame itself. See the
- diagram in StackInterpreter class>>initializeFrameIndices. */
-
-static sqInt
-pushedReceiverOrClosureOfFrame(char *theFP)
-{
- return longAt(theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory())
- ? (mframeCogMethod(theFP)->cmNumArgs)
- : byteAt((theFP + FoxIFrameFlags) + 1)))));
-}
-
void
pushFloat(double f)
{ DECL_MAYBE_SQ_GLOBAL_STRUCT
@@ -48405,7 +48367,7 @@
assertCStackWellAligned();
if ((((usqInt)(longAt(GIV(framePointer) + FoxMethod)))) < (startOfMemory())) {
- assertValidExecutionPointersimbar(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), 0);
+ assertValidExecutionPointersimbarline(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), 0, __LINE__);
if (switchedContext) {
/* begin mframeCogMethod: */
cogMethod = ((CogBlockMethod *) ((longAt(GIV(framePointer) + FoxMethod)) & MFMethodMask));
@@ -48448,7 +48410,7 @@
GIV(instructionPointer) = ((usqInt)(longAt(GIV(framePointer) + FoxIFSavedIP)));
fullyInInterpreter = 0;
}
- assertValidExecutionPointersimbar(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), 1);
+ assertValidExecutionPointersimbarline(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), 1, __LINE__);
if (!fullyInInterpreter) {
siglongjmp(reenterInterpreter, ReturnToInterpreter);
}
@@ -48472,7 +48434,7 @@
assertCStackWellAligned();
if ((((usqInt)(longAt(GIV(framePointer) + FoxMethod)))) < (startOfMemory())) {
- assertValidExecutionPointersimbar(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), 0);
+ assertValidExecutionPointersimbarline(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), 0, __LINE__);
/* begin push: */
longAtput((sp = GIV(stackPointer) - BytesPerWord), GIV(instructionPointer));
GIV(stackPointer) = sp;
@@ -48494,7 +48456,7 @@
? 256
: 0);
- assertValidExecutionPointersimbar(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), 1);
+ assertValidExecutionPointersimbarline(GIV(instructionPointer), GIV(framePointer), GIV(stackPointer), 1, __LINE__);
if (GIV(instructionPointer) == (ceReturnToInterpreterPC())) {
GIV(instructionPointer) = longAt(GIV(framePointer) + FoxIFSavedIP);
}
@@ -52458,7 +52420,7 @@
}
/* begin assertValidExecutionPointe:r:s: */
- assertValidExecutionPointersimbar(((usqInt)(longAt(GIV(stackPointer)))), GIV(framePointer), GIV(stackPointer), !((((usqInt)(longAt(GIV(framePointer) + FoxMethod)))) < (startOfMemory())));
+ assertValidExecutionPointersimbarline(((usqInt)(longAt(GIV(stackPointer)))), GIV(framePointer), GIV(stackPointer), !((((usqInt)(longAt(GIV(framePointer) + FoxMethod)))) < (startOfMemory())), __LINE__);
/* begin popStack */
top = longAt(GIV(stackPointer));
GIV(stackPointer) += BytesPerWord;
Modified: branches/Cog/nscogsrc/vm/cointerp.h
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.h 2013-07-15 22:18:31 UTC (rev 2749)
+++ branches/Cog/nscogsrc/vm/cointerp.h 2013-07-16 22:54:52 UTC (rev 2750)
@@ -1,5 +1,5 @@
/* Automatically generated by
- CCodeGeneratorGlobalStructure VMMaker.oscog-eem.302 uuid: 2ac39432-ac54-4584-964e-b129c90792f4
+ CCodeGeneratorGlobalStructure VMMaker.oscog-eem.303 uuid: 99b81fe2-3c89-43bb-8a2c-2541842da7e0
*/
@@ -161,6 +161,7 @@
void printCallStackOf(sqInt aContextOrProcess);
void printChar(sqInt aByte);
void printCogMethod(CogMethod *cogMethod);
+void printFrameWithSP(char *theFP, char *theSP);
void printHex(sqInt n);
void printInstancesOf(sqInt aClassOop);
void printMethodDictionaryOf(sqInt behavior);
Modified: branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/gcc3x-cointerp.c 2013-07-15 22:18:31 UTC (rev 2749)
+++ branches/Cog/nscogsrc/vm/gcc3x-cointerp.c 2013-07-16 22:54:52 UTC (rev 2750)
@@ -2,11 +2,11 @@
/* Automatically generated by
- CCodeGeneratorGlobalStructure VMMaker.oscog-eem.302 uuid: 2ac39432-ac54-4584-964e-b129c90792f4
+ CCodeGeneratorGlobalStructure VMMaker.oscog-eem.303 uuid: 99b81fe2-3c89-43bb-8a2c-2541842da7e0
from
- CoInterpreter VMMaker.oscog-eem.302 uuid: 2ac39432-ac54-4584-964e-b129c90792f4
+ CoInterpreter VMMaker.oscog-eem.303 uuid: 99b81fe2-3c89-43bb-8a2c-2541842da7e0
*/
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.302 uuid: 2ac39432-ac54-4584-964e-b129c90792f4 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.303 uuid: 99b81fe2-3c89-43bb-8a2c-2541842da7e0 " __DATE__ ;
char *__interpBuildInfo = __buildInfo;
@@ -35,20 +35,21 @@
#include "sqMemoryAccess.h"
-void printCallStack(void);
-
+/* StackInterpreter class>>preambleCCode */
/* Disable Intel compiler inlining of warning which is used for breakpoints */
#pragma auto_inline off
void
warning(char *s) { /* Print an error message but don't exit. */
printf("\n%s\n", s);
}
+void
+warningat(char *s, int l) { /* ditto with line number. */
+ printf("\n%s %d\n", s,l);
+}
#pragma auto_inline on
void
invalidCompactClassError(char *s) { /* Print a compact class index error message and exit. */
- static sqInt printingStack = true; /* not running at this point */
-
printf("\nClass %s does not have the required compact class index\n", s);
exit(-1);
}
@@ -64,6 +65,8 @@
# define siglongjmp(jb,v) _longjmp(jb,v)
#endif
+/* end StackInterpreter class>>preambleCCode */
+
typedef struct _StackPage {
char *stackLimit;
char *headSP;
@@ -364,9 +367,9 @@
static CogMethod * asCogHomeMethod(CogBlockMethod *aCogMethod);
static sqInt asciiOfCharacter(sqInt characterObj);
void assertValidExecutionPointers(usqInt lip, char *lifp, char *lisp);
-static void assertValidExecutionPointersimbar(usqInt lip, char *lifp, char *lisp, sqInt inInterpreter);
+static void assertValidExecutionPointersimbarline(usqInt lip, char *lifp, char *lisp, sqInt inInterpreter, sqInt ln);
void assertValidMachineCodeFrame(sqInt instrPtr);
-static void assertValidStackLimits(void);
+static void assertValidStackLimits(sqInt ln);
static void attemptToSwitchToMachineCode(sqInt bcpc);
sqInt becomewith(sqInt array1, sqInt array2);
static sqInt becomewithtwoWaycopyHash(sqInt array1, sqInt array2, sqInt twoWayFlag, sqInt copyHashFlag);
@@ -480,7 +483,7 @@
static sqInt defaultCogCodeSize(void);
static sqInt defaultEdenBytes(void);
static sqInt defaultNumStackPages(void);
-static void deferStackLimitSmashAround(void (*functionSymbol)(void));
+static void deferStackLimitSmashAroundwith(void (*functionSymbol)(sqInt), sqInt arg);
static void displayBitsOfLeftTopRightBottom(sqInt aForm, sqInt l, sqInt t, sqInt r, sqInt b);
sqInt displayObject(void);
static sqInt divorceAllFrames(void);
@@ -596,9 +599,7 @@
sqInt headerOf(sqInt methodPointer);
static sqInt headerWhileForwardingOf(sqInt oop);
sqInt highBit(usqInt anUnsignedValue);
-static sqInt iframeIsBlockActivation(char *theFP);
static usqInt iframeMethod(char *theFP);
-static sqInt iframeReceiver(char *theFP);
static sqInt iframeSavedIP(char *theFP);
void ifValidWriteBackStackPointersSaveTo(void *theCFP, void *theCSP, char **savedFPP, char **savedSPP);
static sqInt imageSegmentVersion(void);
@@ -734,8 +735,6 @@
static CogBlockMethod * mframeCogMethod(char *theFP);
CogMethod * mframeHomeMethodExport(void);
CogMethod * mframeHomeMethod(char *theFP);
-static sqInt mframeIsBlockActivation(char *theFP);
-static sqInt mframeReceiver(char *theFP);
static sqInt minimumUnusedHeadroom(void);
sqInt mMethodClass(void);
static sqInt mnuMethodOrNilFor(sqInt rcvr);
@@ -1045,7 +1044,7 @@
static void printFrameThingat(char *name, char *address);
static void printFrameThingatextra(char *name, char *address, sqInt extraValue);
void printFrame(char *theFP);
-static void printFrameWithSP(char *theFP, char *theSP);
+void printFrameWithSP(char *theFP, char *theSP);
void printHex(sqInt n);
void printInstancesOf(sqInt aClassOop);
static void printLogEntryAt(sqInt i);
@@ -1071,7 +1070,6 @@
void print(char *s);
static void pruneStackstackp(sqInt stack, sqInt stackp);
void pushBool(sqInt trueOrFalse);
-static sqInt pushedReceiverOrClosureOfFrame(char *theFP);
void pushFloat(double f);
sqInt pushInteger(sqInt integerValue);
void pushRemappableOop(sqInt oop);
@@ -1981,7 +1979,7 @@
/* 575 */ (void (*)(void))0,
0 };
static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void);
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.302";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.303";
sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
volatile int sendTrace;
@@ -4451,7 +4449,7 @@
assertCStackWellAligned();
assert((((usqInt)localIP)) < (startOfMemory()));
assert(isMachineCodeFrame(localFP));
- assertValidExecutionPointersimbar(((usqInt)localIP), localFP, localSP, 0);
+ assertValidExecutionPointersimbarline(((usqInt)localIP), localFP, localSP, 0, __LINE__);
longAtPointerput(localSP, localIP);
/* begin internalPush: */
longAtPointerput((localSP -= BytesPerOop), localReturnValue);
@@ -4676,7 +4674,7 @@
assertCStackWellAligned();
assert((((usqInt)localIP)) < (startOfMemory()));
assert(isMachineCodeFrame(localFP));
- assertValidExecutionPointersimbar(((usqInt)localIP), localFP, localSP, 0);
+ assertValidExecutionPointersimbarline(((usqInt)localIP), localFP, localSP, 0, __LINE__);
longAtPointerput(localSP, localIP);
/* begin internalPush: */
longAtPointerput((localSP -= BytesPerOop), localReturnValue);
@@ -4726,7 +4724,7 @@
assertCStackWellAligned();
assert((((usqInt)localIP)) < (startOfMemory()));
assert(isMachineCodeFrame(localFP));
- assertValidExecutionPointersimbar(((usqInt)localIP), localFP, localSP, 0);
+ assertValidExecutionPointersimbarline(((usqInt)localIP), localFP, localSP, 0, __LINE__);
longAtPointerput(localSP, localIP);
/* begin internalPush: */
longAtPointerput((localSP -= BytesPerOop), localReturnValue);
@@ -5658,7 +5656,7 @@
localSP = pointerForOop(GIV(stackPointer));
localFP = pointerForOop(GIV(framePointer));
markStackPageMostRecentlyUsed(GIV(stackPage));
- assertValidExecutionPointersimbar(((usqInt)localIP), localFP, localSP, 1);
+ assertValidExecutionPointersimbarline(((usqInt)localIP), localFP, localSP, 1, __LINE__);
l5: /* end instVar:ofContext:put: */;
}
else {
@@ -5921,7 +5919,6 @@
sqInt blockSize;
sqInt context;
sqInt i;
- sqInt initialIP;
sqInt newClosure;
sqInt newClosure1;
sqInt numArgs;
@@ -5952,14 +5949,13 @@
l9: /* end ensureFrameIsMarried:SP: */;
/* begin closureIn:numArgs:instructionPointer:numCopiedValues: */
VM_LABEL(0closureInnumArgsinstructionPointernumCopiedValues);
- initialIP = ((oopForPointer(localIP)) + 2) - (GIV(method) + BaseHeaderSize);
assert(((BytesPerWord * (ClosureFirstCopiedValueIndex + numCopied)) + BaseHeaderSize) <= 252);
/* Assume: have just allocated a new closure; it must be young. Thus, can use unchecked stores. */
newClosure1 = eeInstantiateSmallClasssizeInBytes(longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassBlockClosure << ShiftForWord)), (BytesPerWord * (ClosureFirstCopiedValueIndex + numCopied)) + BaseHeaderSize);
longAtput((newClosure1 + BaseHeaderSize) + (ClosureOuterContextIndex << ShiftForWord), context);
- longAtput((newClosure1 + BaseHeaderSize) + (ClosureStartPCIndex << ShiftForWord), ((initialIP << 1) | 1));
@@ Diff output truncated at 50000 characters. @@
More information about the Vm-dev
mailing list