On Monday 04 March 2002 18:21, Zoran Vasiljevic wrote:
suggestion implemented in C. Actually there is no need in general for using tcl-variables to implement volatile objects (we could handle this on a pop of stack frames), but at least for pure tcl-procs, var traces are the simplest implementation. The current implementation (purely in C)
It is not clear: does the C implementation use internal stack for garbage collection or the Tcl-trace variable mechansim?
the var-trace mechanism
It is important to know when doing (or not doing!) such constructs:
Class foo foo instproc test args {}
[foo new -volatile] test ; # object leak ?
this sets as a side effect a tcl variable in the current scope. if the scope is e.g. a tcl proc, it will be automatially unset, when the scope is left.
In case of volatile implementation with var traces, one should do:
set bar [foo new -volatile] $bar test
Note, that this is essentially the same as above. the call of [foo new] cannot set a vartrace on the "bar" variable. The result of the "new" is a tcl_obj, and not a variable. the tcl_obj is bound to the variable bar... so, the magic of the object deletion happens via another variable, that is set as a side effect. these magic variables are named similarly to the object name: in the example
set bar [foo new -volatile]
the objname will be ::xotcl::__#1 (or ...__#2, etc), the magic variable is __#1. therefore, one can refer from the object name to the variable name via
set vn [namespace tail $bar] unset $vn
will trigger the deletion of the object created with new. There is a potential danger of name conflics, but if one follows the rule: don't start user-variable names with "__", everyting will be safe.
I have used this example with the manual unset for explanatory purposes. Under most conditions you will not need to unset the magic variable by hand....
hope that this explains the details.
best regrads -gustaf