Hello,

I'm trying to write a finalizer for an object that is also used as the key 
in a WeakKeyDict{k,v}, and I'm having a bit of trouble getting it to work. 

The context is that I need to use the WeakKeyDict to handle a bunch of 
additional cleanup before the WeakKeyDict's deleter handles the removal of 
the key. So I have to run my program-specific finalizer before the 
WeakKeyDict's finalizer. 

A couple questions:

   1. Are finalizers "stackable" on the same object? if not, should it? if 
   they are, is the order LIFO (the last function fed into finalizer(x,f) gets 
   called first), FIFO or random (no guarantee)?
   2. There's another approach which may avoid answering #1 altogether, 
   which is to add a deleter_wrapper field (::Function, default identity) to 
   WeakKeyDict during set up, like so: 
   
function add_weak_key(t::Dict, k, v)
    if is(t.deleter, identity)
        if t.delete_wrapper != identity
            t.deleter = x->(t.deleter_wrapper(x); weak_key_delete!(t,x))
        else
            t.deleter = x->weak_key_delete!(t, x)
        end
    end
    t[WeakRef(k)] = v
    # TODO: it might be better to avoid the finalizer, allow
    # wiped WeakRefs to remain in the table, and delete them as
    # they are discovered by getindex and setindex!.
    finalizer(k, t.deleter)
    return t
end

Thanks for your consideration.

T

Reply via email to