summaryrefslogtreecommitdiffstats
path: root/generic/tclExecute.c
diff options
context:
space:
mode:
authorMiguel Sofer <miguel.sofer@gmail.com>2011-03-05 15:09:01 (GMT)
committerMiguel Sofer <miguel.sofer@gmail.com>2011-03-05 15:09:01 (GMT)
commitbc47f3260fa46a560c1a2e7e1a0891e5493cda50 (patch)
treecd7fbf0fbe27d0ed2e274f519ee07fed9331de9c /generic/tclExecute.c
parent368e4fad6fab0c934ca09516ed3fc28519ec5578 (diff)
downloadtcl-bc47f3260fa46a560c1a2e7e1a0891e5493cda50.zip
tcl-bc47f3260fa46a560c1a2e7e1a0891e5493cda50.tar.gz
tcl-bc47f3260fa46a560c1a2e7e1a0891e5493cda50.tar.bz2
* generic/tclExecute.c: cleaner mem management for TEBCdata
Diffstat (limited to 'generic/tclExecute.c')
-rw-r--r--generic/tclExecute.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index 6703d43..5cffc90 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -178,6 +178,10 @@ typedef struct TEBCdata {
int cleanup; /* new codePtr was received for NR */
Tcl_Obj *auxObjList; /* execution. */
int checkInterp;
+ CmdFrame cmdFrame;
+ void * stack[1]; /* Start of the actual combined catch and obj
+ * stacks; the struct will be expanded as
+ * necessary */
} TEBCdata;
#define TEBC_YIELD() \
@@ -1910,8 +1914,8 @@ TclIncrObj(
*
*----------------------------------------------------------------------
*/
-#define bcFramePtr ((CmdFrame *) (TD + 1))
-#define initCatchTop (((ptrdiff_t *) (bcFramePtr + 1)) - 1)
+#define bcFramePtr (&TD->cmdFrame)
+#define initCatchTop ((ptrdiff_t *) (&TD->stack[-1]))
#define initTosPtr ((Tcl_Obj **) (initCatchTop+codePtr->maxExceptDepth))
#define esPtr (iPtr->execEnvPtr->execStackPtr)
@@ -1922,9 +1926,9 @@ TclNRExecuteByteCode(
{
Interp *iPtr = (Interp *) interp;
TEBCdata *TD;
- int size = sizeof(TEBCdata) + sizeof(CmdFrame) +
+ int size = sizeof(TEBCdata) -1 +
+ (codePtr->maxStackDepth + codePtr->maxExceptDepth)
- *(sizeof(Tcl_Obj *));
+ *(sizeof(void *));
int numWords = (size + sizeof(Tcl_Obj *) - 1)/sizeof(Tcl_Obj *);
if (iPtr->execEnvPtr->rewind) {