summaryrefslogtreecommitdiffstats
path: root/generic/tclExecute.c
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2007-06-20 18:46:05 (GMT)
committerdgp <dgp@users.sourceforge.net>2007-06-20 18:46:05 (GMT)
commit990150fd25c8206ca25d424fafbdfd2b81199d1f (patch)
tree3d231361d50bc42a020d3f65eefb68a5951da2ae /generic/tclExecute.c
parent03e71e94a6bfa74deaf5a629ba1b72353f17bfc7 (diff)
downloadtcl-990150fd25c8206ca25d424fafbdfd2b81199d1f.zip
tcl-990150fd25c8206ca25d424fafbdfd2b81199d1f.tar.gz
tcl-990150fd25c8206ca25d424fafbdfd2b81199d1f.tar.bz2
* generic/tclInt.decls: Revised the interfaces of the routines
* generic/tclExecute.c: TclStackAlloc and TclStackFree to make them easier for callers to use (or more precisely, harder to misuse). TclStackFree now takes a (void *) argument which is the pointer intended to be freed. TclStackFree will panic if that's not actually the memory the call will free. TSA/TSF also now tolerate receiving (interp == NULL), in which case they simply fall back to be calls to Tcl_Alloc/Tcl_Free. * generic/tclIntDecls.h: make genstubs * generic/tclBasic.c: Updated callers * generic/tclCmdAH.c: * generic/tclCmdIL.c: * generic/tclCompCmds.c: * generic/tclCompExpr.c: * generic/tclCompile.c: * generic/tclFCmd.c: * generic/tclFileName.c: * generic/tclIOCmd.c: * generic/tclIndexObj.c: * generic/tclInterp.c: * generic/tclNamesp.c: * generic/tclProc.c: * generic/tclTrace.c: * unix/tclUnixPipe.c:
Diffstat (limited to 'generic/tclExecute.c')
-rw-r--r--generic/tclExecute.c39
1 files changed, 29 insertions, 10 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index 20e61ea..9e74fd3 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -12,7 +12,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclExecute.c,v 1.300 2007/06/19 20:21:43 msofer Exp $
+ * RCS: @(#) $Id: tclExecute.c,v 1.301 2007/06/20 18:46:12 dgp Exp $
*/
#include "tclInt.h"
@@ -814,18 +814,33 @@ StackReallocWords(
void
TclStackFree(
- Tcl_Interp *interp)
+ Tcl_Interp *interp,
+ void *freePtr)
{
+ Interp *iPtr;
+ ExecEnv *eePtr;
+ ExecStack *esPtr;
+ Tcl_Obj **markerPtr;
+
+ if (interp == NULL) {
+ Tcl_Free((char *) freePtr);
+ return;
+ }
+
/*
* Rewind the stack to the previous marker position. The current marker,
* as set in the last call to GrowEvaluationStack, contains a pointer to
* the previous marker.
*/
-
- Interp *iPtr = (Interp *) interp;
- ExecEnv *eePtr = iPtr->execEnvPtr;
- ExecStack *esPtr = eePtr->execStackPtr;
- Tcl_Obj **markerPtr = esPtr->markerPtr;
+
+ iPtr = (Interp *) interp;
+ eePtr = iPtr->execEnvPtr;
+ esPtr = eePtr->execStackPtr;
+ markerPtr = esPtr->markerPtr;
+
+ if ((markerPtr+1) != (Tcl_Obj **)freePtr) {
+ Tcl_Panic("TclStackFree: incorrect freePtr. Call out of sequence?");
+ }
esPtr->tosPtr = markerPtr-1;
esPtr->markerPtr = (Tcl_Obj **) *markerPtr;
@@ -849,14 +864,18 @@ TclStackFree(
}
}
-char *
+void *
TclStackAlloc(
Tcl_Interp *interp,
int numBytes)
{
int numWords = (numBytes + (sizeof(Tcl_Obj *) - 1))/sizeof(Tcl_Obj *);
- return (char *) StackAllocWords(interp, numWords);
+ if (interp == NULL) {
+ return (void *) Tcl_Alloc(numBytes);
+ }
+
+ return (void *) StackAllocWords(interp, numWords);
}
char *
@@ -6842,7 +6861,7 @@ TclExecuteByteCode(
* Restore the stack to the state it had previous to this bytecode.
*/
- TclStackFree(interp);
+ TclStackFree(interp, initCatchTop+1);
return result;
#undef iPtr
}