diff options
author | Miguel Sofer <miguel.sofer@gmail.com> | 2004-04-02 20:07:04 (GMT) |
---|---|---|
committer | Miguel Sofer <miguel.sofer@gmail.com> | 2004-04-02 20:07:04 (GMT) |
commit | d6a5ccd7025b7a835ca14053320b3b0023042e22 (patch) | |
tree | 6faaf2d23e95ff98d8d9f1250ddb890d036806c7 /generic/tclCompile.c | |
parent | 8dc115f0527fc2e8f8863a39a407a8fec572711f (diff) | |
download | tcl-d6a5ccd7025b7a835ca14053320b3b0023042e22.zip tcl-d6a5ccd7025b7a835ca14053320b3b0023042e22.tar.gz tcl-d6a5ccd7025b7a835ca14053320b3b0023042e22.tar.bz2 |
* generic/tclCompile.c:
* generic/tclInt.h: removed the macro TCL_ALIGN() from tclInt.h,
replaced by the static macro ALIGN() in tclCompile.c [Bug 926445]
Diffstat (limited to 'generic/tclCompile.c')
-rw-r--r-- | generic/tclCompile.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/generic/tclCompile.c b/generic/tclCompile.c index def4e4d..2df8451 100644 --- a/generic/tclCompile.c +++ b/generic/tclCompile.c @@ -11,13 +11,28 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclCompile.c,v 1.60 2004/03/30 16:22:11 msofer Exp $ + * RCS: @(#) $Id: tclCompile.c,v 1.61 2004/04/02 20:07:05 msofer Exp $ */ #include "tclInt.h" #include "tclCompile.h" /* + * This macro is used to determine the offset needed to safely allocate any + * data structure in memory. Given a starting offset or size, it "rounds up" + * or "aligns" the offset to the next 8-byte boundary so that any data + * structure can be placed at the resulting offset without fear of an + * alignment error. + * + * WARNING!! DO NOT USE THIS MACRO TO ALIGN POINTERS: it will produce + * the wrong result on platforms that allocate addresses that are divisible + * by 4 or 2. Only use it for offsets or sizes. + */ + +#define ALIGN(x) (((int)(x) + 7) & ~7) + + +/* * Table of all AuxData types. */ @@ -1661,9 +1676,9 @@ TclInitByteCodeObj(objPtr, envPtr) */ structureSize = sizeof(ByteCode); - structureSize += TCL_ALIGN(codeBytes); /* align object array */ - structureSize += TCL_ALIGN(objArrayBytes); /* align exc range arr */ - structureSize += TCL_ALIGN(exceptArrayBytes); /* align AuxData array */ + structureSize += ALIGN(codeBytes); /* align object array */ + structureSize += ALIGN(objArrayBytes); /* align exc range arr */ + structureSize += ALIGN(exceptArrayBytes); /* align AuxData array */ structureSize += auxDataArrayBytes; structureSize += cmdLocBytes; @@ -1698,13 +1713,13 @@ TclInitByteCodeObj(objPtr, envPtr) codePtr->codeStart = p; memcpy((VOID *) p, (VOID *) envPtr->codeStart, (size_t) codeBytes); - p += TCL_ALIGN(codeBytes); /* align object array */ + p += ALIGN(codeBytes); /* align object array */ codePtr->objArrayPtr = (Tcl_Obj **) p; for (i = 0; i < numLitObjects; i++) { codePtr->objArrayPtr[i] = envPtr->literalArrayPtr[i].objPtr; } - p += TCL_ALIGN(objArrayBytes); /* align exception range array */ + p += ALIGN(objArrayBytes); /* align exception range array */ if (exceptArrayBytes > 0) { codePtr->exceptArrayPtr = (ExceptionRange *) p; memcpy((VOID *) p, (VOID *) envPtr->exceptArrayPtr, @@ -1713,7 +1728,7 @@ TclInitByteCodeObj(objPtr, envPtr) codePtr->exceptArrayPtr = NULL; } - p += TCL_ALIGN(exceptArrayBytes); /* align AuxData array */ + p += ALIGN(exceptArrayBytes); /* align AuxData array */ if (auxDataArrayBytes > 0) { codePtr->auxDataArrayPtr = (AuxData *) p; memcpy((VOID *) p, (VOID *) envPtr->auxDataArrayPtr, |