summaryrefslogtreecommitdiffstats
path: root/generic/tclNamesp.c
diff options
context:
space:
mode:
authorhypnotoad <yoda@etoyoc.com>2016-09-14 13:38:30 (GMT)
committerhypnotoad <yoda@etoyoc.com>2016-09-14 13:38:30 (GMT)
commit3c85e6e0ef5152bc7267d7d7c5f8c456335b137f (patch)
treef3900e225e1705096c592510898296094c1417ba /generic/tclNamesp.c
parent58ab27bf86284012b5dba6df12a30f10ecee6491 (diff)
parentdb811061d46dcd891e3434f509e28c578b603f17 (diff)
downloadtcl-3c85e6e0ef5152bc7267d7d7c5f8c456335b137f.zip
tcl-3c85e6e0ef5152bc7267d7d7c5f8c456335b137f.tar.gz
tcl-3c85e6e0ef5152bc7267d7d7c5f8c456335b137f.tar.bz2
Pulling changes from trunk
Diffstat (limited to 'generic/tclNamesp.c')
-rw-r--r--generic/tclNamesp.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/generic/tclNamesp.c b/generic/tclNamesp.c
index 74dfaf8..7f6ecf5 100644
--- a/generic/tclNamesp.c
+++ b/generic/tclNamesp.c
@@ -382,6 +382,19 @@ Tcl_PopCallFrame(
register CallFrame *framePtr = iPtr->framePtr;
Namespace *nsPtr;
+ /*
+ * It's important to remove the call frame from the interpreter's stack of
+ * call frames before deleting local variables, so that traces invoked by
+ * the variable deletion don't see the partially-deleted frame.
+ */
+
+ if (framePtr->callerPtr) {
+ iPtr->framePtr = framePtr->callerPtr;
+ iPtr->varFramePtr = framePtr->callerVarPtr;
+ } else {
+ /* Tcl_PopCallFrame: trying to pop rootCallFrame! */
+ }
+
if (framePtr->varTablePtr != NULL) {
TclDeleteVars(iPtr, framePtr->varTablePtr);
ckfree(framePtr->varTablePtr);
@@ -409,13 +422,6 @@ Tcl_PopCallFrame(
}
framePtr->nsPtr = NULL;
- if (framePtr->callerPtr) {
- iPtr->framePtr = framePtr->callerPtr;
- iPtr->varFramePtr = framePtr->callerVarPtr;
- } else {
- /* Tcl_PopCallFrame: trying to pop rootCallFrame! */
- }
-
if (framePtr->tailcallPtr) {
TclSetTailcall(interp, framePtr->tailcallPtr);
}