続:ただのループなのにスタックオーバーフロー

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