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 | 45d29cd41c215484eaf33a4f02be315a6b1872b9 (patch) | |
tree | 13f169828086bfbd8f44e7b6e5c8253d26bc58f3 /generic/tclBasic.c | |
parent | 7e302d3ca75cd9eb6998e895cf344665b1d08e5e (diff) | |
parent | 2c0667d7b04e34fa929ccc4758a19af166cf4206 (diff) | |
download | tcl-45d29cd41c215484eaf33a4f02be315a6b1872b9.zip tcl-45d29cd41c215484eaf33a4f02be315a6b1872b9.tar.gz tcl-45d29cd41c215484eaf33a4f02be315a6b1872b9.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); |