~ chicken-core (chicken-5) /tests/test-finalizers.scm
Trap1;;;; test-finalizers.scm23;; NOTE: This may fail, reopen #1426 if it does45(import (chicken format))6(import (chicken gc))78(##sys#eval-debug-level 0) ; disable keeping trace-buffer with frameinfo910(define x (list 1 2 3))11(define y (list 4 5 6))12(define x-f #f)13(define y-f #f)1415(begin16 (set-finalizer!17 x18 (lambda (o)19 (format #t "Delete: ~A (y: ~a)~%" o y-f)20 (set! x-f #t)))21 #t)22(begin23 (set-finalizer!24 y25 (let ((p x))26 (lambda (o)27 (format #t "Delete: ~A: ~A~%" o p)28 (set! y-f #t))))29 #t)30(gc #t)31(assert (not x-f))3233#|3435This ought to work, see patches/finalizer.closures.diff for36a fix that unfortunately disables finalizers in the interpreter37(probably due to the different closure representation).3839(assert (not y-f))40(set! x #f)41(gc #t)42(assert (not x-f))43(assert (not y-f))44(set! y #f)45(gc #t)46(assert y-f)47(assert x-f)48|#4950(define foo-f #f)5152(let ((foo (vector 1 2 3)))53 (set-finalizer! foo (lambda _ (set! foo-f #t)))54 #t)5556(gc #t)57(assert foo-f)585960;; double finalizer6162(define n 0)63(define (bump . _) (set! n (add1 n)))64(define x (vector 1))65(set-finalizer! x bump)66(set-finalizer! x bump)67(set! x #f)68(gc #t)69(print n)70(assert (= 2 n))7172;; Finalizers on constants are ignored in compiled mode (because73;; they're never GCed). Reported by "Pluijzer".7475#| this doesn't always work in csi, for some unknown reason,76 depending on unrelated factors (command-line options,77 memory usage patterns, etc.)7879(set! n 0)80(define bar "constant string")81(set-finalizer! bar bump)82(set! bar #f)83(gc #t)84(print n)85(cond-expand86 (compiling (assert (= 0 n)))87 (else (assert (= 1 n))))88|#