#include <tcl.h> Tcl_Trace Tcl_CreateTrace(interp, level, proc, clientData) Tcl_Trace Tcl_CreateObjTrace(interp, level, flags, objProc, clientData, deleteProc) Tcl_DeleteTrace(interp, trace)
Tcl_CreateObjTrace arranges for command tracing. After it is called, objProc will be invoked before the Tcl interpreter calls any command procedure when evaluating commands in interp. The return value from Tcl_CreateObjTrace is a token for the trace, which may be passed to Tcl_DeleteTrace to remove the trace. There may be many traces in effect simultaneously for the same interpreter.
objProc should have arguments and result that match the type, Tcl_CmdObjTraceProc:
typedef int Tcl_CmdObjTraceProc( ClientData clientData, Tcl_Interp* interp, int level, const char *command, Tcl_Command commandToken, int objc, Tcl_Obj *const objv[] );
The objProc callback is expected to return a standard Tcl status return code. If this code is TCL_OK (the normal case), then the Tcl interpreter will invoke the command. Any other return code is treated as if the command returned that status, and the command is not invoked.
The objProc callback must not modify objv in any way. It is, however, permissible to change the command by calling Tcl_SetCommandTokenInfo prior to returning. Any such change takes effect immediately, and the command is invoked with the new information.
Tracing will only occur for commands at nesting level less than or equal to the level parameter (i.e. the level parameter to objProc will always be less than or equal to the level parameter to Tcl_CreateTrace).
Tracing has a significant effect on runtime performance because it causes the bytecode compiler to refrain from generating in-line code for Tcl commands such as if and while in order that they may be traced. If traces for the built-in commands are not required, the flags parameter may be set to the constant value TCL_ALLOW_INLINE_COMPILATION. In this case, traces on built-in commands may or may not result in trace callbacks, depending on the state of the interpreter, but run-time performance will be improved significantly. (This functionality is desirable, for example, when using Tcl_CreateObjTrace to implement an execution time profiler.)
Calls to objProc will be made by the Tcl parser immediately before it calls the command procedure for the command (cmdProc). This occurs after argument parsing and substitution, so tracing for substituted commands occurs before tracing of the commands containing the substitutions. If there is a syntax error in a command, or if there is no command procedure associated with a command name, then no tracing will occur for that command. If a string passed to Tcl_Eval contains multiple commands (bracketed, or on different lines) then multiple calls to objProc will occur, one for each command.
Tcl_DeleteTrace removes a trace, so that no future calls will be made to the procedure associated with the trace. After Tcl_DeleteTrace returns, the caller should never again use the trace token.
When Tcl_DeleteTrace is called, the interpreter invokes the deleteProc that was passed as a parameter to Tcl_CreateObjTrace. The deleteProc must match the type, Tcl_CmdObjTraceDeleteProc:
typedef void Tcl_CmdObjTraceDeleteProc( ClientData clientData);
Tcl_CreateTrace is an alternative interface for command tracing, not recommended for new applications. It is provided for backward compatibility with code that was developed for older versions of the Tcl interpreter. It is similar to Tcl_CreateObjTrace, except that its proc parameter should have arguments and result that match the type Tcl_CmdTraceProc:
typedef void Tcl_CmdTraceProc( ClientData clientData, Tcl_Interp *interp, int level, char *command, Tcl_CmdProc *cmdProc, ClientData cmdClientData, int argc, const char *argv[]);
If a trace created with Tcl_CreateTrace is in effect, inline compilation of Tcl commands such as if and while is always disabled. There is no notification when a trace created with Tcl_CreateTrace is deleted. There is no way to be notified when the trace created by Tcl_CreateTrace is deleted. There is no way for the proc associated with a call to Tcl_CreateTrace to abort execution of command.