diff options
author | Miguel Sofer <miguel.sofer@gmail.com> | 2005-10-29 17:45:22 (GMT) |
---|---|---|
committer | Miguel Sofer <miguel.sofer@gmail.com> | 2005-10-29 17:45:22 (GMT) |
commit | 905504b25f37317b91c478e7a9fc1d5166250a73 (patch) | |
tree | c33d7e39d470aeab57cb502bab9c9e94316c545c /generic/tclCmdMZ.c | |
parent | 71b715c88b019bf819a112ac7e8b0aa68c6dc9e8 (diff) | |
download | tcl-905504b25f37317b91c478e7a9fc1d5166250a73.zip tcl-905504b25f37317b91c478e7a9fc1d5166250a73.tar.gz tcl-905504b25f37317b91c478e7a9fc1d5166250a73.tar.bz2 |
* generic/tclCmdMZ.c (TraceVarProc): [Bug 1337229], partial
fix. Insure that a second call with TCL_TRACE_DESTROYED does not
lead to a second call to Tcl_EventuallyFree(). It is still true
that that second call should not happen, so the bug is not
completely fixed.
* tests/trace.test (test-18.3-4): added tests for bugs #1337229
and 1338280.
Diffstat (limited to 'generic/tclCmdMZ.c')
-rw-r--r-- | generic/tclCmdMZ.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c index d1cb609..b2f5919 100644 --- a/generic/tclCmdMZ.c +++ b/generic/tclCmdMZ.c @@ -14,7 +14,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclCmdMZ.c,v 1.82.2.21 2005/10/23 22:01:29 msofer Exp $ + * RCS: @(#) $Id: tclCmdMZ.c,v 1.82.2.22 2005/10/29 17:45:23 msofer Exp $ */ #include "tclInt.h" @@ -4694,7 +4694,7 @@ TraceVarProc(clientData, interp, name1, name2, flags) Tcl_SavedResult state; TraceVarInfo *tvarPtr = (TraceVarInfo *) clientData; char *result; - int code; + int code, destroy = 0; Tcl_DString cmd; /* @@ -4755,7 +4755,9 @@ TraceVarProc(clientData, interp, name1, name2, flags) */ Tcl_SaveResult(interp, &state); - if (flags & TCL_TRACE_DESTROYED) { + if ((flags & TCL_TRACE_DESTROYED) + && !(tvarPtr->flags & TCL_TRACE_DESTROYED)) { + destroy = 1; tvarPtr->flags |= TCL_TRACE_DESTROYED; } @@ -4772,7 +4774,7 @@ TraceVarProc(clientData, interp, name1, name2, flags) Tcl_DStringFree(&cmd); } } - if (flags & TCL_TRACE_DESTROYED) { + if (destroy) { if (result != NULL) { register Tcl_Obj *errMsgObj = (Tcl_Obj *) result; |