No registered users in community xowiki
in last 10 minutes
in last 10 minutes
Re: [Xotcl] Problem with automatic variable unsetting upon return from an instproc?
From: Jim Russell <Jim.Russell_at_dynetics.com>
Date: Wed, 19 Nov 2003 09:53:35 -0600
Uwe:
Thank you so much for the very lucid explanation. I was hoping that
I could use the trace mechanism to implement a garbage collection
scheme. I was storing the XOTcl object name in an ordinary Tcl variable
upon which I placed the unset trace. When the variable goes out of
scope, the unset callback is called, and I had hoped to dereference the
variable to call the XOTcl object's destroy method. However, this
doesn't appear to be a good approach. Do you have any suggestions?
Jim
Uwe Zdun wrote:
> Jim,
>
> at first glance, the behavior seems ok to me. You're setting 2 traces to the
> local scope variable "f" which get unset in reverse order -> so
> the two "f" outputs should be ok.
>
> The rhs traces "2" and "3" are for the two inner invocations. For the outer
> invocations, the callframe is deleted before the Trace is executed. The
> problem here is that Tcl does not print the error that occurs.
>
> Consider the following plain Tcl example:
>
> proc tracecb { name1 name2 op } {
> if {[catch {
> upvar $name1 var
> puts "tracecb \"$name1\" \"$name2\" \"$op\" \"$var\""
> } err]} {
> puts $err
> }
> }
> proc x {a} {
> ::trace add variable a [list unset] ::tracecb
> if {$a == 0} {return}
> incr a -1
> x $a
> }
>
> x 4
>
> This prints:
> tracecb "a" "" "unset" "0"
> tracecb "a" "" "unset" "1"
> tracecb "a" "" "unset" "2"
> tracecb "a" "" "unset" "3"
> can't read "var": no such variable
>
> so you cannot rely on the "upvar" in the trace to a local scope variable.
>
> You can try to refer to an XOTcl variable (an instance variable)
> with "[self] trace ..." instead.
>
> Uwe
>
>
Date: Wed, 19 Nov 2003 09:53:35 -0600
Uwe:
Thank you so much for the very lucid explanation. I was hoping that
I could use the trace mechanism to implement a garbage collection
scheme. I was storing the XOTcl object name in an ordinary Tcl variable
upon which I placed the unset trace. When the variable goes out of
scope, the unset callback is called, and I had hoped to dereference the
variable to call the XOTcl object's destroy method. However, this
doesn't appear to be a good approach. Do you have any suggestions?
Jim
Uwe Zdun wrote:
> Jim,
>
> at first glance, the behavior seems ok to me. You're setting 2 traces to the
> local scope variable "f" which get unset in reverse order -> so
> the two "f" outputs should be ok.
>
> The rhs traces "2" and "3" are for the two inner invocations. For the outer
> invocations, the callframe is deleted before the Trace is executed. The
> problem here is that Tcl does not print the error that occurs.
>
> Consider the following plain Tcl example:
>
> proc tracecb { name1 name2 op } {
> if {[catch {
> upvar $name1 var
> puts "tracecb \"$name1\" \"$name2\" \"$op\" \"$var\""
> } err]} {
> puts $err
> }
> }
> proc x {a} {
> ::trace add variable a [list unset] ::tracecb
> if {$a == 0} {return}
> incr a -1
> x $a
> }
>
> x 4
>
> This prints:
> tracecb "a" "" "unset" "0"
> tracecb "a" "" "unset" "1"
> tracecb "a" "" "unset" "2"
> tracecb "a" "" "unset" "3"
> can't read "var": no such variable
>
> so you cannot rely on the "upvar" in the trace to a local scope variable.
>
> You can try to refer to an XOTcl variable (an instance variable)
> with "[self] trace ..." instead.
>
> Uwe
>
>