[Xotcl] full trace support for XOTcl methods/procs

Eckhard Lehmann eckhardnospam at gmx.de
Wed Jan 2 22:46:26 CET 2008


Kristoffer Lawson schrieb:
> You could just wrap it in a package that sets a Tcl [trace] for normal 
> commands combined with filters for the XOTcl stuff, just checking to 
> see if the command names match, if necessary. Or maybe I've missed 
> something here and I'm thinking to simple :-)
The problem is that I need something that is like enterstep/leavestep 
for [trace], but for XOTcl. Filters do only intercept calls to XOTcl 
objects but not to Tcl proc's.
Consider the example from Gustaf above. I have extended it a little bit:

B instproc doit {args} {
 my set x 1
 my foo
 set l {a b c d}                                        ;# <------
 for {set i 0} {$i < 10} {incr i} {           ;# <------
     puts $i                                               ;# <------
 }                                                            ;# <------
 next
 my set y 4
}

The whole script is below, you can paste it into a file and run it. If 
you do so, the output is:
-----
Call: ::b1 set x 1
Exit: ::b1 set x 1 => 1
Call: ::b1 foo
Exit: ::b1 foo  => 2
0
1
2
3
4
5
6
7
8
9
Call: ::b1 set a 3
Exit: ::b1 set a 3 => 3
Call: ::b1 set y 4
Exit: ::b1 set y 4 => 4
-----
As you can see, the calls to [my set x 1] and [my foo] are intercepted 
("Call"/"Exit"), but the calls to [set l {a b c d}] and to the [for] 
loop are not. Therefore it is only partially useful, if yo want to 
intercept *every* statement in a method (which is what I want).


Eckhard


#----------------- Script --------------
Class A
A instproc foo {} {
 my set f 2
}
A instproc doit {args} {
 my set a 3
}
Class B -superclass A
B instproc doit {args} {
 my set x 1
 my foo
 set l {a b c d}
 for {set i 0} {$i < 10} {incr i} {
     puts $i
 }
 next
 my set y 4
}
B b1

Class F
F instproc traceFilter args {
 if {[self callingproc] eq "doit"} {
   puts "Call: [self] [self calledproc] $args"
   set r [next]
   puts "Exit: [self] [self calledproc] $args => $r"
   return $r
 } else {
   next
 }
}

B instmixin F
B instfilter {{traceFilter}}
b1 doit



More information about the Xotcl mailing list