From 8399b253ca7479b09d5d05ce4e81a9c9697a3582 Mon Sep 17 00:00:00 2001 From: dgp Date: Thu, 13 Dec 2007 14:13:17 +0000 Subject: merge updates from HEAD --- ChangeLog | 23 ++++--- doc/trace.n | 218 +++++++++++++++++++++++++++++++++--------------------------- 2 files changed, 136 insertions(+), 105 deletions(-) diff --git a/ChangeLog b/ChangeLog index f464cb6..65e4691 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2007-12-13 Donal K. Fellows + + *** 8.5.0 TAGGED FOR RELEASE *** + + * doc/trace.n: Clarified documentation of enterstep and leavestep + traces, including adding example. [Bug 614282, 1701540, 1755984] + 2007-12-12 Don Porter * doc/IntObj.3: Update docs for the Tcl_GetBignumAndClearObj() -> @@ -19,24 +26,24 @@ * doc/StrMatch.3: It is compatible with existing usage. * generic/tclExecute.c (INST_STR_MATCH): flag for TclByteArrayMatch * generic/tclUtil.c (TclByteArrayMatch, TclStringMatchObj): - * generic/tclRegexp.c (Tcl_RegExpExecObj): + * generic/tclRegexp.c (Tcl_RegExpExecObj): * generic/tclCmdMZ.c (StringMatchCmd): Use TclStringMatchObj * tests/string.test (11.9.* 11.10.*): more tests - + 2007-12-10 Joe English * doc/string.n, doc/UniCharIsAlpha.3: Fix markup errors. * doc/CrtCommand.3, doc/CrtMathFnc.3, doc/FileSystem.3, - doc/GetStdChan.3, doc/OpenFileChnl.3, doc/SetChanErr.3, - doc/eval.n, doc/filename.n: Consistency: Move "KEYWORDS" - section after "SEE ALSO". + * doc/GetStdChan.3, doc/OpenFileChnl.3, doc/SetChanErr.3, + * doc/eval.n, doc/filename.n: Consistency: Move "KEYWORDS" section + after "SEE ALSO". 2007-12-10 Daniel Steffen * tools/genStubs.tcl: fix numerous issues handling 'macosx', 'aqua' or 'x11' entries interleaved - with 'unix' entries [Bug 1834288]; - add genStubs::export command + with 'unix' entries [Bug 1834288]; add + genStubs::export command [Tk FR 1716117]; cleanup formatting. * generic/tcl.decls: use new genstubs 'export' command to @@ -55,7 +62,7 @@ * tests/io.test, tests/chanio.test (io-73.1): Make sure to invalidate * generic/tclIO.c (SetChannelFromAny): internal rep only after validating channel rep. [Bug 1847044] - + 2007-12-08 Donal K. Fellows * doc/expr.n, doc/mathop.n: Improved the documentation of the diff --git a/doc/trace.n b/doc/trace.n index b18b66a..6487dfd 100644 --- a/doc/trace.n +++ b/doc/trace.n @@ -6,7 +6,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: trace.n,v 1.18.12.1 2007/11/01 16:25:56 dgp Exp $ +'\" RCS: @(#) $Id: trace.n,v 1.18.12.2 2007/12/13 14:13:18 dgp Exp $ '\" .so man.macros .TH trace n "8.4" Tcl "Tcl Built-In Commands" @@ -26,45 +26,48 @@ invoked. The legal \fIoption\fRs (which may be abbreviated) are: Where \fItype\fR is \fBcommand\fR, \fBexecution\fR, or \fBvariable\fR. .RS .TP -\fBtrace add command\fR \fIname ops command\fR -Arrange for \fIcommand\fR to be executed whenever command \fIname\fR -is modified in one of the ways given by the list \fIops\fR. \fIName\fR will be -resolved using the usual namespace resolution rules used by -procedures. If the command does not exist, an error will be thrown. +\fBtrace add command\fR \fIname ops commandPrefix\fR +. +Arrange for \fIcommandPrefix\fR to be executed (with additional arguments) +whenever command \fIname\fR is modified in one of the ways given by the list +\fIops\fR. \fIName\fR will be resolved using the usual namespace resolution +rules used by commands. If the command does not exist, an error will be +thrown. .RS .PP \fIOps\fR indicates which operations are of interest, and is a list of one or more of the following items: .TP \fBrename\fR -Invoke \fIcommand\fR whenever the command is renamed. Note that -renaming to the empty string is considered deletion, and will not -be traced with +. +Invoke \fIcommandPrefix\fR whenever the traced command is renamed. Note that +renaming to the empty string is considered deletion, and will not be traced +with .QW \fBrename\fR . .TP \fBdelete\fR -Invoke \fIcommand\fR when the command is deleted. Commands can be -deleted explicitly by using the \fBrename\fR command to rename the -command to an empty string. Commands are also deleted when the -interpreter is deleted, but traces will not be invoked because there is no -interpreter in which to execute them. +. +Invoke \fIcommandPrefix\fR when the traced command is deleted. Commands can be +deleted explicitly by using the \fBrename\fR command to rename the command to +an empty string. Commands are also deleted when the interpreter is deleted, +but traces will not be invoked because there is no interpreter in which to +execute them. .PP -When the trace triggers, depending on the operations being traced, a -number of arguments are appended to \fIcommand\fR so that the actual -command is as follows: +When the trace triggers, depending on the operations being traced, a number of +arguments are appended to \fIcommandPrefix\fR so that the actual command is as +follows: .CS -\fIcommand oldName newName op\fR +\fIcommandPrefix oldName newName op\fR .CE -\fIOldName\fR and \fInewName\fR give the traced command's current -(old) name, and the name to which it is being renamed (the empty -string if this is a +\fIOldName\fR and \fInewName\fR give the traced command's current (old) name, +and the name to which it is being renamed (the empty string if this is a .QW delete operation). \fIOp\fR indicates what operation is being performed on the command, and is one of \fBrename\fR or \fBdelete\fR as defined above. The trace operation cannot be used to stop a command from being deleted. Tcl will always remove the command once the trace -is complete. Recursive renaming or deleting will not cause further traces +is complete. Recursive renaming or deleting will not cause further traces of the same type to be evaluated, so a delete trace which itself deletes the command, or a rename trace which itself renames the command will not cause further trace evaluations to occur. @@ -72,54 +75,59 @@ Both \fIoldName\fR and \fInewName\fR are fully qualified with any namespace(s) in which they appear. .RE .TP -\fBtrace add execution\fR \fIname ops command\fR -Arrange for \fIcommand\fR to be executed whenever command \fIname\fR -is executed, with traces occurring at the points indicated by the list -\fIops\fR. \fIName\fR will be -resolved using the usual namespace resolution rules used by -procedures. If the command does not exist, an error will be thrown. +\fBtrace add execution\fR \fIname ops commandPrefix\fR +. +Arrange for \fIcommandPrefix\fR to be executed (with additional arguments) +whenever command \fIname\fR is executed, with traces occurring at the points +indicated by the list \fIops\fR. \fIName\fR will be resolved using the usual +namespace resolution rules used by commands. If the command does not exist, +an error will be thrown. .RS .PP \fIOps\fR indicates which operations are of interest, and is a list of one or more of the following items: .TP \fBenter\fR -Invoke \fIcommand\fR whenever the command \fIname\fR is executed, +Invoke \fIcommandPrefix\fR whenever the command \fIname\fR is executed, just before the actual execution takes place. .TP \fBleave\fR -Invoke \fIcommand\fR whenever the command \fIname\fR is executed, +Invoke \fIcommandPrefix\fR whenever the command \fIname\fR is executed, just after the actual execution takes place. .TP \fBenterstep\fR -Invoke \fIcommand\fR for every Tcl command which is executed -inside the procedure \fIname\fR, just before the actual execution -takes place. For example if we have +. +Invoke \fIcommandPrefix\fR for every Tcl command which is executed from the +start of the execution of the procedure \fIname\fR until that +procedure finishes. \fICommandPrefix\fR is invoked just before the actual +execution of the Tcl command being reported takes place. For example +if we have .QW "proc foo {} { puts \N'34'hello\N'34' }" , -then an \fIenterstep\fR trace would be -invoked just before +then an \fIenterstep\fR trace would be invoked just before .QW "\fIputs \N'34'hello\N'34'\fR" is executed. -Setting an \fIenterstep\fR trace on a \fIcommand\fR -will not result in an error and is simply ignored. +Setting an \fIenterstep\fR trace on a command \fIname\fR that does not refer +to a procedure will not result in an error and is simply ignored. .TP \fBleavestep\fR -Invoke \fIcommand\fR for every Tcl command which is executed -inside the procedure \fIname\fR, just after the actual execution -takes place. -Setting a \fIleavestep\fR trace on a \fIcommand\fR -will not result in an error and is simply ignored. +. +Invoke \fIcommandPrefix\fR for every Tcl command which is executed from the +start of the execution of the procedure \fIname\fR until that +procedure finishes. \fICommandPrefix\fR is invoked just after the actual +execution of the Tcl command being reported takes place. +Setting a \fIleavestep\fR trace on a command \fIname\fR that does not refer to +a procedure will not result in an error and is simply ignored. .PP -When the trace triggers, depending on the operations being traced, a -number of arguments are appended to \fIcommand\fR so that the actual +When the trace triggers, depending on the operations being traced, a +number of arguments are appended to \fIcommandPrefix\fR so that the actual command is as follows: .PP For \fBenter\fR and \fBenterstep\fR operations: .CS -\fIcommand command-string op\fR +\fIcommandPrefix command-string op\fR .CE -\fICommand-string\fR gives the complete current command being -executed (the traced command for a \fBenter\fR operation, an +\fICommand-string\fR gives the complete current command being +executed (the traced command for a \fBenter\fR operation, an arbitrary command for a \fBenterstep\fR operation), including all arguments in their fully expanded form. \fIOp\fR indicates what operation is being performed on the @@ -134,32 +142,33 @@ For \fBleave\fR and \fBleavestep\fR operations: .CS \fIcommand command-string code result op\fR .CE -\fICommand-string\fR gives the complete current command being -executed (the traced command for a \fBenter\fR operation, an +\fICommand-string\fR gives the complete current command being +executed (the traced command for a \fBenter\fR operation, an arbitrary command for a \fBenterstep\fR operation), including all arguments in their fully expanded form. \fICode\fR gives the result code of that execution, and \fIresult\fR the result string. \fIOp\fR indicates what operation is being performed on the command execution, and is one of \fBleave\fR or \fBleavestep\fR as -defined above. +defined above. Note that the creation of many \fBenterstep\fR or \fBleavestep\fR traces can lead to unintuitive results, since the invoked commands from one trace can themselves lead to further command invocations for other traces. .PP -\fICommand\fR executes in the same context as the code that invoked -the traced operation: thus the \fIcommand\fR, if invoked from a procedure, -will have access to the same local variables as code in the procedure. -This context may be different than the context in which the trace was -created. If \fIcommand\fR invokes a procedure (which it normally does) -then the procedure will have to use upvar or uplevel commands if it wishes -to access the local variables of the code which invoked the trace operation. +\fICommandPrefix\fR executes in the same context as the code that invoked +the traced operation: thus the \fIcommandPrefix\fR, if invoked from a +procedure, will have access to the same local variables as code in the +procedure. This context may be different than the context in which the trace +was created. If \fIcommandPrefix\fR invokes a procedure (which it normally +does) then the procedure will have to use \fBupvar\fR or \fBuplevel\fR +commands if it wishes to access the local variables of the code which invoked +the trace operation. .PP -While \fIcommand\fR is executing during an execution trace, traces -on \fIname\fR are temporarily disabled. This allows the \fIcommand\fR +While \fIcommandPrefix\fR is executing during an execution trace, traces +on \fIname\fR are temporarily disabled. This allows the \fIcommandPrefix\fR to execute \fIname\fR in its body without invoking any other traces again. -If an error occurs while executing the \fIcommand\fR body, then the +If an error occurs while executing the \fIcommandPrefix\fR, then the command \fIname\fR as a whole will return that same error. .PP When multiple traces are set on \fIname\fR, then for \fIenter\fR @@ -168,17 +177,17 @@ in the reverse order of how the traces were originally created; and for \fIleave\fR and \fIleavestep\fR operations, the traced commands are invoked in the original order of creation. .PP -The behavior of execution traces is currently undefined for a command +The behavior of execution traces is currently undefined for a command \fIname\fR imported into another namespace. .RE .TP -\fBtrace add variable\fI name ops command\fR -Arrange for \fIcommand\fR to be executed whenever variable \fIname\fR +\fBtrace add variable\fI name ops commandPrefix\fR +Arrange for \fIcommandPrefix\fR to be executed whenever variable \fIname\fR is accessed in one of the ways given by the list \fIops\fR. \fIName\fR may refer to a normal variable, an element of an array, or to an array as a whole (i.e. \fIname\fR may be just the name of an array, with no parenthesized index). If \fIname\fR refers to a whole array, then -\fIcommand\fR is invoked whenever any element of the array is +\fIcommandPrefix\fR is invoked whenever any element of the array is manipulated. If the variable does not exist, it will be created but will not be given a value, so it will be visible to \fBnamespace which\fR queries, but not to \fBinfo exists\fR queries. @@ -188,20 +197,20 @@ queries, but not to \fBinfo exists\fR queries. one or more of the following items: .TP \fBarray\fR -Invoke \fIcommand\fR whenever the variable is accessed or modified via +Invoke \fIcommandPrefix\fR whenever the variable is accessed or modified via the \fBarray\fR command, provided that \fIname\fR is not a scalar variable at the time that the \fBarray\fR command is invoked. If \fIname\fR is a scalar variable, the access via the \fBarray\fR command will not trigger the trace. .TP \fBread\fR -Invoke \fIcommand\fR whenever the variable is read. +Invoke \fIcommandPrefix\fR whenever the variable is read. .TP \fBwrite\fR -Invoke \fIcommand\fR whenever the variable is written. +Invoke \fIcommandPrefix\fR whenever the variable is written. .TP \fBunset\fR -Invoke \fIcommand\fR whenever the variable is unset. Variables +Invoke \fIcommandPrefix\fR whenever the variable is unset. Variables can be unset explicitly with the \fBunset\fR command, or implicitly when procedures return (all of their local variables are unset). Variables are also unset when interpreters are @@ -209,9 +218,9 @@ deleted, but traces will not be invoked because there is no interpreter in which to execute them. .PP When the trace triggers, three arguments are appended to -\fIcommand\fR so that the actual command is as follows: +\fIcommandPrefix\fR so that the actual command is as follows: .CS -\fIcommand name1 name2 op\fR +\fIcommandPrefix name1 name2 op\fR .CE \fIName1\fR and \fIname2\fR give the name(s) for the variable being accessed: if the variable is a scalar then \fIname1\fR @@ -229,11 +238,11 @@ different name. variable, and is one of \fBread\fR, \fBwrite\fR, or \fBunset\fR as defined above. .PP -\fICommand\fR executes in the same context as the code that invoked +\fICommandPrefix\fR executes in the same context as the code that invoked the traced operation: if the variable was accessed as part of a Tcl -procedure, then \fIcommand\fR will have access to the same local +procedure, then \fIcommandPrefix\fR will have access to the same local variables as code in the procedure. This context may be different -than the context in which the trace was created. If \fIcommand\fR +than the context in which the trace was created. If \fIcommandPrefix\fR invokes a procedure (which it normally does) then the procedure will have to use \fBupvar\fR or \fBuplevel\fR if it wishes to access the traced variable. Note also that \fIname1\fR may not necessarily be @@ -241,25 +250,25 @@ the same as the name used to set the trace on the variable; differences can occur if the access is made through a variable defined with the \fBupvar\fR command. .PP -For read and write traces, \fIcommand\fR can modify the variable to -affect the result of the traced operation. If \fIcommand\fR modifies +For read and write traces, \fIcommandPrefix\fR can modify the variable to +affect the result of the traced operation. If \fIcommandPrefix\fR modifies the value of a variable during a read or write trace, then the new value will be returned as the result of the traced operation. The -return value from \fIcommand\fR is ignored except that if it returns +return value from \fIcommandPrefix\fR is ignored except that if it returns an error of any sort then the traced operation also returns an error with the same error message returned by the trace command (this mechanism can be used to implement read-only variables, for example). -For write traces, \fIcommand\fR is invoked after the variable's value +For write traces, \fIcommandPrefix\fR is invoked after the variable's value has been changed; it can write a new value into the variable to override the original value specified in the write operation. To -implement read-only variables, \fIcommand\fR will have to restore the +implement read-only variables, \fIcommandPrefix\fR will have to restore the old value of the variable. .PP -While \fIcommand\fR is executing during a read or write trace, traces +While \fIcommandPrefix\fR is executing during a read or write trace, traces on the variable are temporarily disabled. This means that reads and -writes invoked by \fIcommand\fR will occur directly, without invoking -\fIcommand\fR (or any other traces) again. However, if \fIcommand\fR -unsets the variable then unset traces will be invoked. +writes invoked by \fIcommandPrefix\fR will occur directly, without invoking +\fIcommandPrefix\fR (or any other traces) again. However, if +\fIcommandPrefix\fR unsets the variable then unset traces will be invoked. .PP When an unset trace is invoked, the variable has already been deleted: it will appear to be undefined with no traces. If an unset occurs @@ -287,28 +296,28 @@ This command returns an empty string. .RE .RE .TP -\fBtrace remove \fItype name opList command\fR +\fBtrace remove \fItype name opList commandPrefix\fR Where \fItype\fR is either \fBcommand\fR, \fBexecution\fR or \fBvariable\fR. .RS .TP -\fBtrace remove command\fI name opList command\fR +\fBtrace remove command\fI name opList commandPrefix\fR If there is a trace set on command \fIname\fR with the operations and -command given by \fIopList\fR and \fIcommand\fR, then the trace is -removed, so that \fIcommand\fR will never again be invoked. Returns +command given by \fIopList\fR and \fIcommandPrefix\fR, then the trace is +removed, so that \fIcommandPrefix\fR will never again be invoked. Returns an empty string. If \fIname\fR does not exist, the command will throw an error. .TP -\fBtrace remove execution\fI name opList command\fR +\fBtrace remove execution\fI name opList commandPrefix\fR If there is a trace set on command \fIname\fR with the operations and -command given by \fIopList\fR and \fIcommand\fR, then the trace is -removed, so that \fIcommand\fR will never again be invoked. Returns +command given by \fIopList\fR and \fIcommandPrefix\fR, then the trace is +removed, so that \fIcommandPrefix\fR will never again be invoked. Returns an empty string. If \fIname\fR does not exist, the command will throw an error. .TP -\fBtrace remove variable\fI name opList command\fR +\fBtrace remove variable\fI name opList commandPrefix\fR If there is a trace set on variable \fIname\fR with the operations and -command given by \fIopList\fR and \fIcommand\fR, then the trace is -removed, so that \fIcommand\fR will never again be invoked. Returns +command given by \fIopList\fR and \fIcommandPrefix\fR, then the trace is +removed, so that \fIcommandPrefix\fR will never again be invoked. Returns an empty string. .RE .TP @@ -319,7 +328,7 @@ Where \fItype\fR is either \fBcommand\fR, \fBexecution\fR or \fBvariable\fR. \fBtrace info command\fI name\fR Returns a list containing one element for each trace currently set on command \fIname\fR. Each element of the list is itself a list -containing two elements, which are the \fIopList\fR and \fIcommand\fR +containing two elements, which are the \fIopList\fR and \fIcommandPrefix\fR associated with the trace. If \fIname\fR does not have any traces set, then the result of the command will be an empty string. If \fIname\fR does not exist, the command will throw an error. @@ -327,7 +336,7 @@ does not exist, the command will throw an error. \fBtrace info execution\fI name\fR Returns a list containing one element for each trace currently set on command \fIname\fR. Each element of the list is itself a list -containing two elements, which are the \fIopList\fR and \fIcommand\fR +containing two elements, which are the \fIopList\fR and \fIcommandPrefix\fR associated with the trace. If \fIname\fR does not have any traces set, then the result of the command will be an empty string. If \fIname\fR does not exist, the command will throw an error. @@ -335,7 +344,7 @@ does not exist, the command will throw an error. \fBtrace info variable\fI name\fR Returns a list containing one element for each trace currently set on variable \fIname\fR. Each element of the list is itself a list -containing two elements, which are the \fIopList\fR and \fIcommand\fR +containing two elements, which are the \fIopList\fR and \fIcommandPrefix\fR associated with the trace. If \fIname\fR does not exist or does not have any traces set, then the result of the command will be an empty string. @@ -349,8 +358,8 @@ This is equivalent to \fBtrace add variable \fIname ops command\fR. .TP \fBtrace vdelete \fIname ops command\fR This is equivalent to \fBtrace remove variable \fIname ops command\fR -.TP -\fBtrace vinfo \fIname\fR +.TP +\fBtrace vinfo \fIname\fR This is equivalent to \fBtrace info variable \fIname\fR .RE .PP @@ -383,6 +392,21 @@ proc doMult args { \fBtrace add\fR variable foo write doMult \fBtrace add\fR variable bar write doMult .CE +.PP +Print a trace of what commands are executed during the processing of a Tcl +procedure: +.CS +proc x {} { y } +proc y {} { z } +proc z {} { puts hello } +proc report args {puts [info level 0]} +\fBtrace add\fR execution x enterstep report +x + \(-> \fIreport y enterstep\fR + \fIreport z enterstep\fR + \fIreport {puts hello} enterstep\fR + \fIhello\fR +.CE .SH "SEE ALSO" set(n), unset(n) .SH KEYWORDS -- cgit v0.12