summaryrefslogtreecommitdiffstats
path: root/generic/tclBasic.c
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2012-06-11 17:34:35 (GMT)
committerdgp <dgp@users.sourceforge.net>2012-06-11 17:34:35 (GMT)
commit45d29cd41c215484eaf33a4f02be315a6b1872b9 (patch)
tree13f169828086bfbd8f44e7b6e5c8253d26bc58f3 /generic/tclBasic.c
parent7e302d3ca75cd9eb6998e895cf344665b1d08e5e (diff)
parent2c0667d7b04e34fa929ccc4758a19af166cf4206 (diff)
downloadtcl-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.c13
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);