Attachment "2629338.patch" to
ticket [2629338fff]
added by
dgp
2009-03-20 23:43:07.
Index: generic/tclTrace.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclTrace.c,v
retrieving revision 1.47.2.1
diff -u -r1.47.2.1 tclTrace.c
--- generic/tclTrace.c 8 Oct 2008 14:52:39 -0000 1.47.2.1
+++ generic/tclTrace.c 20 Mar 2009 16:40:42 -0000
@@ -2894,6 +2894,7 @@
} else {
prevPtr->nextPtr = nextPtr;
}
+ tracePtr->nextPtr = NULL;
Tcl_EventuallyFree((ClientData) tracePtr, TCL_DYNAMIC);
for (tracePtr = nextPtr; tracePtr != NULL;
Index: generic/tclVar.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclVar.c,v
retrieving revision 1.160.2.3
diff -u -r1.160.2.3 tclVar.c
--- generic/tclVar.c 8 Oct 2008 14:52:39 -0000 1.160.2.3
+++ generic/tclVar.c 20 Mar 2009 16:40:42 -0000
@@ -2357,6 +2357,16 @@
(flags & (TCL_GLOBAL_ONLY|TCL_NAMESPACE_ONLY))
| TCL_TRACE_UNSETS,
/* leaveErrMsg */ 0, -1);
+ /*
+ * the traces that we just called may have triggered a change in the
+ * set of traces
+ */
+ tracePtr = NULL;
+ if (TclIsVarTraced(&dummyVar)) {
+ tPtr = Tcl_FindHashEntry(&iPtr->varTraces, (char *) &dummyVar);
+ tracePtr = Tcl_GetHashValue(tPtr);
+ }
+
if (tPtr) {
Tcl_DeleteHashEntry(tPtr);
}
@@ -2369,6 +2379,7 @@
VarTrace *prevPtr = tracePtr;
tracePtr = tracePtr->nextPtr;
+ prevPtr->nextPtr = NULL;
Tcl_EventuallyFree((ClientData) prevPtr, TCL_DYNAMIC);
}
for (activePtr = iPtr->activeVarTracePtr; activePtr != NULL;
@@ -4385,6 +4396,7 @@
*/
if (TclIsVarTraced(varPtr)) {
+ ActiveVarTrace *activePtr;
Tcl_HashEntry *tPtr = Tcl_FindHashEntry(&iPtr->varTraces,
(char *) varPtr);
VarTrace *tracePtr = (VarTrace *) Tcl_GetHashValue(tPtr);
@@ -4393,10 +4405,17 @@
VarTrace *prevPtr = tracePtr;
tracePtr = tracePtr->nextPtr;
+ prevPtr->nextPtr = NULL;
Tcl_EventuallyFree((ClientData) prevPtr, TCL_DYNAMIC);
}
Tcl_DeleteHashEntry(tPtr);
varPtr->flags &= ~VAR_ALL_TRACES;
+ for (activePtr = iPtr->activeVarTracePtr; activePtr != NULL;
+ activePtr = activePtr->nextPtr) {
+ if (activePtr->varPtr == varPtr) {
+ activePtr->nextTracePtr = NULL;
+ }
+ }
}
VarHashRefCount(varPtr)--;
VarHashDeleteEntry(varPtr);
@@ -4499,6 +4518,7 @@
UnsetVarStruct(varPtr, NULL, iPtr, *namePtrPtr, NULL,
TCL_TRACE_UNSETS);
}
+ framePtr->numCompiledLocals=0;
}
/*
@@ -4575,6 +4595,7 @@
VarTrace *prevPtr = tracePtr;
tracePtr = tracePtr->nextPtr;
+ prevPtr->nextPtr = NULL;
Tcl_EventuallyFree((ClientData) prevPtr, TCL_DYNAMIC);
}
Tcl_DeleteHashEntry(tPtr);