Garbage-collection of objects (Was: [Xotcl] poll for opinions)

Zoran Vasiljevic zoran@archiware.com
Fri, 22 Feb 2002 11:11:54 +0100


Hallo !

The problem of automatic object garbage collection was itching me
for some time now. So I did spend some time and here is the solution.

The basic idea is to auto-destroy objects created within a procedure
when the procedure goes out of context. I would like to hear some
comments from Uwe/Gustaf and/or other experienced XOTcl'ers.
Similar might even be included in 1.0 if people need such thing.
I definitely do.

The below depends on the array "__gc" created in the calling's procedure
context, one class proc "__gc" and one new costructor, "volatile" 
as shown below.

Attached is a piece of test-code to verify the operation.

Cheer's
Zoran

#------- CUT HERE -------

#
# Gets invoked from variable unset callbacks.
#
Class proc __gc {n1 n2 op} {
  set l [::expr {[::info level] > 0}]
  if {![::uplevel $l ::info exists __gc($n1)]} {
      ::incr l
  }
  ::uplevel $l \$__gc($n1) destroy
}

#
# Used to instantiate "volatile" objects. 
# These get auto-destroyed when the procedure goes out of context.
#
Class instproc volatile {n args} {
  ::upvar $n v
  ::trace variable v u [list Class __gc]
  ::set v [[self] autoname -instance [self]]
  ::uplevel [::expr {[::info level]<2?1:2}] ::set __gc($n) $v
  ::eval [self] create $v $args
}

#
# Test routines
#
proc aa {} {
  _foo_ volatile obj
  $obj test
  bb
}
proc bb {} {
  _foo_ volatile obj 
  $obj test
  cc
}
proc cc {} {
  _foo_ volatile obj
  $obj test
  unset obj
  dd
}
proc dd {} {
  _foo_ volatile obj
  $obj test
}
proc gctest {} {
  Class _foo_
  _foo_ instproc test {} {puts stderr [self]}
  set cmds [info comm _foo_*]
  aa
  if {[info comm _foo_*] == $cmds} {
     puts stderr ok    
  } else {
     puts stderr fail
  }
}

#------- CUT HERE -------