(use-modules (system vm special-variable)) ;; This makes sure to treat s special and not box it (define (g x) (let ((s 0)) (mark-as-special s) (let lp ((i 0)) (if (< i 10000000) (begin (set! s (+ i s)) (lp (+ i 1))) s)))) #| ,x g 0 (assert-nargs-ee/locals 17) ;; 1 arg, 2 locals 2 (make-int8:0) ;; 0 3 (local-set 1) ;; `s' 5 (new-frame) 6 (toplevel-ref 1) ;; `((system vm special-variable) special #f)' 8 (local-ref 1) ;; `s' 10 (mv-call 1 :L583) ;; MV -> 20 15 (drop) 16 (br :L584) ;; -> 23 20 (truncate-values 0 0) 23 (br :L585) ;; -> 56 27 (local-ref 2) ;; `i' 29 (make-int16 3 232) ;; 1000 32 (lt?) 33 (br-if-not :L586) ;; -> 53 37 (local-ref 2) ;; `i' 39 (local-ref 1) ;; `s' 41 (add) 42 (local-set 1) ;; `s' 44 (local-ref 2) ;; `i' 46 (add1) 47 (local-set 2) ;; `i' 49 (br :L587) ;; -> 27 53 (local-ref 1) ;; `s' 55 (return) 56 (make-int8:0) ;; 0 57 (local-set 2) 59 (br :L587) ;; -> 27 |# ;; This makes sure to treat s as special but we cannot box it because it's ;; referenced in closure, set! + closure = boxed (define (g2 x) (let ((s 0)) (mark-as-special s) (let lp ((i 0)) (if (< i 10000000) (begin (set! s (+ i s)) (lp (+ i 1))) (lambda () s))))) #| 0 (assert-nargs-ee/locals 17) ;; 1 arg, 2 locals 2 (make-int8:0) ;; 0 at /home/stis/src/special.scm:45:2 3 (box 1) 5 (new-frame) at /home/stis/src/special.scm:46:4 6 (toplevel-ref 1) ;; `((system vm special-variable) special #f)' 8 (local-boxed-ref 1) ;; `s' 10 (mv-call 1 :L824) ;; MV -> 20 15 (drop) 16 (br :L825) ;; -> 23 20 (truncate-values 0 0) 23 (br :L826) ;; -> 67 at /home/stis/src/special.scm:47:4 27 (local-ref 2) ;; `i' 29 (make-uint64 0 0 0 0 0 152 150 128);; 10000000 38 (lt?) at /home/stis/src/special.scm:48:10 39 (br-if-not :L827) ;; -> 59 at /home/stis/src/special.scm:48:6 43 (local-ref 2) ;; `i' 45 (local-boxed-ref 1) ;; `s' 47 (add) at /home/stis/src/special.scm:49:25 48 (local-boxed-set 1) ;; `s' at /home/stis/src/special.scm:49:17 50 (local-ref 2) ;; `i' 52 (add1) at /home/stis/src/special.scm:50:21 53 (local-set 2) ;; `i' 55 (br :L828) ;; -> 27 at /home/stis/src/special.scm:50:17 59 (object-ref 2) ;; # 61 (local-ref 1) ;; `s' 63 (make-closure 0 1) 66 (return) at /home/stis/src/special.scm:47:4 67 (make-int8:0) ;; 0 68 (local-set 2) 70 (br :L828) ;; -> 27 |#