From: Tietew Date: 2008-11-21T18:02:28+09:00 Subject: [ruby-dev:37136] Re: [Bug:1.9] 1+1+1+...+1 dumps core On Fri, 21 Nov 2008 15:12:37 +0900 In article <20081121144608.C08F.C613B076@garbagecollect.jp> [[ruby-dev:37133] Re: [Bug:1.9] 1+1+1+...+1 dumps core] "U.Nakamura" wrote: > > Windowsで代替スタックを使えないのかと思って調べたらこんなのが見つかりま > > した。 > > http://www.nminoru.jp/~nminoru/programming/stackoverflow_handling.html#winnt > > > > もしかしてcall_cfuncで構造化例外を捕まえてSystemStackErrorに変換したりで > > きます? > > call_cfuncじゃなくてrb_iseq_evalの中身あたりをくくるのがいい > んじゃないかと思いますが、まあそうです。 > > しかしこれ代替スタック領域なのかな。単に今ぶっ壊したスタック > 領域をなかったことにして__try〜__except節の深さにまで巻き戻さ > れてるされてるだけのような気が... SEHはCPUがトラップした例外を通知する仕組みなので、STATUS_STACK_OVERFLOW が発生してもスタックは(まだ)ぶっ壊れていません。 __except( ... ) の括弧内を実行中は、元のスタックの続き(代替スタック)を 使っています。そうじゃないと EXCEPTION_CONTINUE_EXECUTION で再実行できな いから。 EXCEPTION_EXECUTE_HANDLER を返すと、そこから __finally を実行しつつスタッ クを巻き戻します。 ただ、ここで SystemStackError を生成して実行を継続できるかというと疑問で す。CPUがトラップするので、たとえば malloc が帰ってきた次の命令がトラッ プされるとそのメモリ領域はリークします。 abort() か、fatal を投げて終了、くらいが関の山かなあと。 -- Tietew Blog: http://www.tietew.jp/ PGP: 26CB 71BB B595 09C4 0153 81C4 773C 963A D51B 8CAA