In gsi, a will that has become unreachable will still execute when its testator is about to become unreachable.
What's more, if the will's action is a closure upon some other object, and if we make that other object unreachable too (such that a different will with that other object as a testator executes), when the action executes it will still be able to access that other object. This is probably clearer in code:
(define o1 (cons 'o 1)) (define o2 (cons 'o 2)) (define w1 (make-will o1 (let ((o2_ o2)) (lambda (x) (println "w1 says
bye to " x " but it can still reach " o2_)))))
(define w2 (make-will o2 (lambda (x) (println "w2 says bye to o2")))) (define w3 (make-will w1 (lambda (x) (println "w3 says bye to w1")))) (set! w1
#f)
(gc)
w3 says bye to w1
(set! o2 #f) (gc)
w2 says bye to o2
(set! o1 #f) (gc)
w1 says bye to o1 but it can still reach o2
Is this expected semantics, or just accidental behavior that shouldn't be relied upon?
If o2 was a foreign object with a finalizer, would it have been released by the time w1 executed, or would w1's closure reference have kept it alive?