diff options
author | dgp <dgp@users.sourceforge.net> | 2016-09-09 12:42:09 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2016-09-09 12:42:09 (GMT) |
commit | f52c111f3b4848a8a63d505513bcdc0ea5c14930 (patch) | |
tree | 4aa39b66a85f72f4485c7c81543729c01d8c8090 /generic/tclNamesp.c | |
parent | dfe46aaba1d57b828a9378ec10f20818087a70c8 (diff) | |
parent | f26a4a0948cbd769519cf1e79ea027511051b2bd (diff) | |
download | tcl-f52c111f3b4848a8a63d505513bcdc0ea5c14930.zip tcl-f52c111f3b4848a8a63d505513bcdc0ea5c14930.tar.gz tcl-f52c111f3b4848a8a63d505513bcdc0ea5c14930.tar.bz2 |
merge trunk
Diffstat (limited to 'generic/tclNamesp.c')
-rw-r--r-- | generic/tclNamesp.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/generic/tclNamesp.c b/generic/tclNamesp.c index fc2d63d..7aacf7f 100644 --- a/generic/tclNamesp.c +++ b/generic/tclNamesp.c @@ -399,6 +399,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); @@ -426,13 +439,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); } |