diff options
| author | dgp <dgp@users.sourceforge.net> | 2012-06-11 17:34:35 (GMT) |
|---|---|---|
| committer | dgp <dgp@users.sourceforge.net> | 2012-06-11 17:34:35 (GMT) |
| commit | da206716d027775cf443cf2f3be8acb1949ac398 (patch) | |
| tree | 13f169828086bfbd8f44e7b6e5c8253d26bc58f3 /generic/tclBasic.c | |
| parent | 0fcbc26adf89ede8f4035b9104416e354b0edb26 (diff) | |
| parent | b755b8b9f87b9bd65ad904bf18c4024d4ea91d14 (diff) | |
| download | tcl-da206716d027775cf443cf2f3be8acb1949ac398.zip tcl-da206716d027775cf443cf2f3be8acb1949ac398.tar.gz tcl-da206716d027775cf443cf2f3be8acb1949ac398.tar.bz2 | |
3532959 Make sure the lifetime management of entries in the linePBodyPtr hash
table can tolerate either order of teardown, interp first, or Proc first.
Diffstat (limited to 'generic/tclBasic.c')
| -rw-r--r-- | generic/tclBasic.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/generic/tclBasic.c b/generic/tclBasic.c index 954b2b3..fa13b50 100644 --- a/generic/tclBasic.c +++ b/generic/tclBasic.c @@ -1388,12 +1388,15 @@ DeleteInterpProc( hPtr != NULL; hPtr = Tcl_NextHashEntry(&hSearch)) { CmdFrame *cfPtr = Tcl_GetHashValue(hPtr); - - if (cfPtr->type == TCL_LOCATION_SOURCE) { - Tcl_DecrRefCount(cfPtr->data.eval.path); + Proc *procPtr = (Proc *) Tcl_GetHashKey(iPtr->linePBodyPtr, hPtr); + procPtr->iPtr = NULL; + if (cfPtr) { + if (cfPtr->type == TCL_LOCATION_SOURCE) { + Tcl_DecrRefCount(cfPtr->data.eval.path); + } + ckfree((char *) cfPtr->line); + ckfree((char *) cfPtr); } - ckfree((char *) cfPtr->line); - ckfree((char *) cfPtr); Tcl_DeleteHashEntry(hPtr); } Tcl_DeleteHashTable(iPtr->linePBodyPtr); |
