まつもと ゆきひろです

In message "[ruby-dev:10120] [mswin32] Ruby 1.4.5 make test failure"
    on 00/06/23, Katsuyuki Komatsu <komatsu / sarion.co.jp> writes:

|落ちているところは、bignum.cのrb_big_lshift()の*xdsの参照で、
|numeric.cのfix_lshift()から呼ばれています。
|
|落ちる原因は、bignew()を呼ぶ前にxの参照がなくなるので、VC 6.0SP3で
|-Oxだとoptimizerがスタック上のxをlenとして再利用するコードを生成し、
|fix_lshift()がスタックに積んだrb_int2big(val)の参照がなくなって、
|bignew()から呼ばれるGCで回収されてしまうからでした。
|
|ということで、xdsを操作する前にxが再利用されて回収されないように
|    xds = BDIGITS(x);
|を*xdsを参照する直前に持ってきたいのですが、いかがでしょうか?

なるほどねえ。volatileを付けるという手もありますが、xdsへの
代入の位置を動かす方がスマートかも。取り込みます。