home *** CD-ROM | disk | FTP | other *** search
- '\"
- '\" Copyright (c) 1993 The Regents of the University of California.
- '\" All rights reserved.
- '\"
- '\" Permission is hereby granted, without written agreement and without
- '\" license or royalty fees, to use, copy, modify, and distribute this
- '\" documentation for any purpose, provided that the above copyright
- '\" notice and the following two paragraphs appear in all copies.
- '\"
- '\" IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
- '\" FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- '\" ARISING OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
- '\" CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- '\"
- '\" THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
- '\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- '\" AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- '\" ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
- '\" PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- '\"
- '\" $Header: /user6/ouster/tcl/man/RCS/trace.n,v 1.3 93/06/16 16:36:39 ouster Exp $ SPRITE (Berkeley)
- '\"
- .so man.macros
- .HS trace tcl
- .BS
- '\" Note: do not modify the .SH NAME line immediately below!
- .SH NAME
- trace \- Monitor variable accesses
- .SH SYNOPSIS
- \fBtrace \fIoption\fR ?\fIarg arg ...\fR?
- .BE
-
- .SH DESCRIPTION
- .PP
- This command causes Tcl commands to be executed whenever certain operations are
- invoked. At present, only variable tracing is implemented. The
- legal \fIoption\fR's (which may be abbreviated) are:
- .TP
- \fBtrace variable \fIname ops command\fR
- Arrange for \fIcommand\fR to be executed whenever variable \fIname\fR
- is accessed in one of the ways given by \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
- manipulated.
- .RS
- .LP
- \fIOps\fR indicates which operations are of interest, and consists of
- one or more of the following letters:
- .RS
- .TP
- \fBr\fR
- Invoke \fIcommand\fR whenever the variable is read.
- .TP
- \fBw\fR
- Invoke \fIcommand\fR whenever the variable is written.
- .TP
- \fBu\fR
- Invoke \fIcommand\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
- deleted, but traces will not be invoked because there is no
- interpreter in which to execute them.
- .RE
- .LP
- When the trace triggers, three arguments are appended to
- \fIcommand\fR so that the actual command is as follows:
- .DS C
- \fIcommand name1 name2 op\fR
- .DE
- \fIName1\fR and \fIname2\fR give the name(s) for the variable
- being accessed: if the variable is a scalar then \fIname1\fR
- gives the variable's name and \fIname2\fR is an empty string;
- if the variable is an array element then \fIname1\fR gives the
- name of the array and name2 gives the index into the array;
- if an entire array is being deleted and the trace was registered
- on the overall array, rather than a single element, then \fIname1\fR
- gives the array name and \fIname2\fR is an empty string.
- \fIOp\fR indicates what operation is being performed on the
- variable, and is one of \fBr\fR, \fBw\fR, or \fBu\fR as
- defined above.
- .LP
- \fICommand\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 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 \fBupvar\fR or \fBuplevel\fR if it
- wishes to access the traced variable.
- Note also that \fIname1\fR may not necessarily be 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.
- .LP
- For read and write traces, \fIcommand\fR can modify
- the variable to affect the result of the traced operation.
- If \fIcommand\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 an error of any sort then the traced operation
- also returns an error with
- .VS
- the same error message returned by the trace command
- .VE
- (this mechanism can be used to implement read-only variables, for
- example).
- For write traces, \fIcommand\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 old value of the variable.
- .LP
- While \fIcommand\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.
- .VS
- However, if \fIcommand\fR unsets the variable then unset traces
- will be invoked.
- .VE
- .LP
- 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 because of a procedure return, then the
- trace will be invoked in the variable context of the procedure
- being returned to: the stack frame of the returning procedure
- will no longer exist.
- Traces are not disabled during unset traces, so if an unset trace
- command creates a new trace and accesses the variable, the
- trace will be invoked.
- .VS
- Any errors in unset traces are ignored.
- .VE
- .LP
- If there are multiple traces on a variable they are invoked
- in order of creation, most-recent first.
- If one trace returns an error, then no further traces are
- invoked for the variable.
- If an array element has a trace set, and there is also a trace
- set on the array as a whole, the trace on the overall array
- is invoked before the one on the element.
- .LP
- Once created, the trace remains in effect either until the
- trace is removed with the \fBtrace vdelete\fR command described
- below, until the variable is unset, or until the interpreter
- is deleted.
- Unsetting an element of array will remove any traces on that
- element, but will not remove traces on the overall array.
- .LP
- This command returns an empty string.
- .RE
- .TP
- \fBtrace vdelete \fIname ops command\fR
- If there is a trace set on variable \fIname\fR with the
- operations and command given by \fIops\fR and \fIcommand\fR,
- then the trace is removed, so that \fIcommand\fR will never
- again be invoked.
- Returns an empty string.
- .TP
- \fBtrace vinfo \fIname\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 \fIops\fR and \fIcommand\fR associated
- with the trace.
- If \fIname\fR doesn't exist or doesn't have any traces set, then
- the result of the command will be an empty string.
-
- .SH KEYWORDS
- read, variable, write, trace, unset
-