Attachment "811483-HEAD.patch" to
ticket [811483ffff]
added by
dgp
2003-10-03 01:54:54.
Index: generic/tclBasic.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclBasic.c,v
retrieving revision 1.89
diff -u -r1.89 tclBasic.c
--- generic/tclBasic.c 29 Sep 2003 23:56:15 -0000 1.89
+++ generic/tclBasic.c 2 Oct 2003 18:52:44 -0000
@@ -2611,11 +2611,9 @@
* must get the name from cmdPtr */
CONST char *newName; /* Command's new name, or NULL if
* the command is not being renamed */
- int flags; /* Flags passed to trace procedures:
- * indicates what's happening to command,
- * plus other stuff like TCL_GLOBAL_ONLY,
- * TCL_NAMESPACE_ONLY, and
- * TCL_INTERP_DESTROYED. */
+ int flags; /* Flags indicating the type of traces
+ * to trigger, either TCL_TRACE_DELETE
+ * or TCL_TRACE_RENAME. */
{
register CommandTrace *tracePtr;
ActiveCommandTrace active;
Index: generic/tclTrace.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclTrace.c,v
retrieving revision 1.5
diff -u -r1.5 tclTrace.c
--- generic/tclTrace.c 2 Oct 2003 18:08:31 -0000 1.5
+++ generic/tclTrace.c 2 Oct 2003 18:52:46 -0000
@@ -506,7 +506,8 @@
tcmdPtr->length = length;
tcmdPtr->refCount = 1;
flags |= TCL_TRACE_DELETE;
- if (flags & (TRACE_EXEC_ENTER_STEP | TRACE_EXEC_LEAVE_STEP)) {
+ if (flags & (TCL_TRACE_ENTER_DURING_EXEC |
+ TCL_TRACE_LEAVE_DURING_EXEC)) {
flags |= (TCL_TRACE_ENTER_EXEC | TCL_TRACE_LEAVE_EXEC);
}
strcpy(tcmdPtr->command, command);
@@ -548,8 +549,8 @@
&& (strncmp(command, tcmdPtr->command,
(size_t) length) == 0)) {
flags |= TCL_TRACE_DELETE;
- if (flags & (TRACE_EXEC_ENTER_STEP |
- TRACE_EXEC_LEAVE_STEP)) {
+ if (flags & (TCL_TRACE_ENTER_DURING_EXEC |
+ TCL_TRACE_LEAVE_DURING_EXEC)) {
flags |= (TCL_TRACE_ENTER_EXEC |
TCL_TRACE_LEAVE_EXEC);
}
@@ -1351,6 +1352,8 @@
* because command deletes are unconditional, so the trace must go away.
*/
if (flags & (TCL_TRACE_DESTROYED | TCL_TRACE_DELETE)) {
+ int untraceFlags = tcmdPtr->flags;
+
if (tcmdPtr->stepTrace != NULL) {
Tcl_DeleteTrace(interp, tcmdPtr->stepTrace);
tcmdPtr->stepTrace = NULL;
@@ -1362,10 +1365,28 @@
/* Postpone deletion, until exec trace returns */
tcmdPtr->flags = 0;
}
- /*
- * Decrement the refCount since the command which held our
- * reference (ever since we were created) has just gone away
+ /*
+ * We need to construct the same flags for Tcl_UntraceCommand
+ * as were passed to Tcl_TraceCommand. Reproduce the processing
+ * of [trace add execution/command]. Be careful to keep this
+ * code in sync with that.
+ */
+ if (untraceFlags & TCL_TRACE_ANY_EXEC) {
+ untraceFlags |= TCL_TRACE_DELETE;
+ if (untraceFlags & (TCL_TRACE_ENTER_DURING_EXEC
+ | TCL_TRACE_LEAVE_DURING_EXEC)) {
+ untraceFlags |= (TCL_TRACE_ENTER_EXEC | TCL_TRACE_LEAVE_EXEC);
+ }
+ } else if (untraceFlags & TCL_TRACE_RENAME) {
+ untraceFlags |= TCL_TRACE_DELETE;
+ }
+ /*
+ * Remove the trace since TCL_TRACE_DESTROYED tells us to, or the
+ * command we're tracing has just gone away. Then decrement the
+ * clientData refCount that was set up by trace creation.
*/
+ Tcl_UntraceCommand(interp, oldName, untraceFlags,
+ TraceCommandProc, clientData);
tcmdPtr->refCount--;
}
if ((--tcmdPtr->refCount) <= 0) {