続:ただのループなのにスタックオーバーフロー
http://d.hatena.ne.jp/nishiohirokazu/20080129/1201600506
予想で書いてみますが、コード生成時にdiff * diffの値をスタックからpopする処理が抜け落ちてるのではないでしょうか(多分バグ)。
で、try-catchで囲んだ場合は、正しいコードが生成されているとか。
というわけでディスアセンブラにかけてみました。
L4: 59 label 60 getlocal3 61 getlocal3 62 multiply 63 convert_i 64 dup 65 dup 66 setlocal 4 68 multiply 69 pop 70 inclocal_i 5
あれー。ちゃんとpopしてるなぁ…。これを見る限りでは問題が起きるはずはないのに…。
ちなみにtryで囲った場合、スコープが作成されるのでgetlocalの代わりにgetscopeobjectとgetslotが使われていました。
L4: 92 label 93 getscopeobject 1 95 getscopeobject 1 97 getslot 3 99 getscopeobject 1 101 getslot 3 103 multiply 104 convert_i 105 setslot 4 107 getscopeobject 1 109 getslot 4 111 getscopeobject 1 113 getslot 4 115 multiply 116 pop 117 jump L5 121 getlocal0 122 pushscope 123 getlocal1 124 pushscope 125 newcatch 0 127 dup 128 setlocal2 129 dup 130 pushscope 131 swap 132 setslot 1 134 popscope 135 kill 2