diff options
| author | hypnotoad <yoda@etoyoc.com> | 2016-09-14 13:38:30 (GMT) |
|---|---|---|
| committer | hypnotoad <yoda@etoyoc.com> | 2016-09-14 13:38:30 (GMT) |
| commit | 3c85e6e0ef5152bc7267d7d7c5f8c456335b137f (patch) | |
| tree | f3900e225e1705096c592510898296094c1417ba /generic/tclNamesp.c | |
| parent | 58ab27bf86284012b5dba6df12a30f10ecee6491 (diff) | |
| parent | db811061d46dcd891e3434f509e28c578b603f17 (diff) | |
| download | tcl-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.c | 20 |
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); } |
