Re:pass2/$local-assign をデバッグ中
pass2/$local-assign をデバッグ中の続き。原因判明。
直接的な原因は lambda-node である iform の iform-copy 時に、lambda-node.lvars.ref-count がコピーされていないのが原因だった。(iform-copy-zip-lvs)
(define path 3) (let ((add (lambda (s) (set! path s)))) (add #f) (add #f))
上の add の call 2カ所を inline 展開する際に
(let1 (s #f) (set! path s)) (let1 (s #f) (set! path s))
となるのだが、上の方の let1 の s 参照カウンタが 1 のはずなのに 0 になってしまっている。そのため let1 が最適化で消え、(set! path s) だけになってた。
これで s の参照先がなくてエラー。
Gauche でこれが問題になっていないのは、どこかでうまいこと回避しているのだろうなあ。(深追いしていません)