From: nobu.nakada@... Date: 2003-01-10T13:51:59+09:00 Subject: [ruby-dev:19349] Re: [BUG] errno == 0 なかだです。 At Fri, 10 Jan 2003 12:24:02 +0900, U.Nakamura wrote: > | > | | しかし、これはひょっとしてFMODE_SYNCだとseekされてないんじゃな > | > | | いでしょうか。フラグを流用した無理が出たような。別のフラグを使 > | > | | うべきか、それともFMODE_SYNCだったらついでにseekするか。 > | > | > | > | # ただ、bccの場合はW -> Rもflushじゃだめなんじゃないか疑惑が > | > | # あるので、結局なんとかしないといけないのかも。 > | > | # 後で確認してみます。 > | > > | > 予想通り、 > | > ruby 1.8.0 (2003-01-09) [i386-bccwin32] > | > では、FMODE_SYNCなときはW -> Rで落ちました。 > | > | 1.8.0だけですか? > > 1.6にはbccwin32はまだマージされてないので... そりゃそうでした。 > で、今回のパッチですが、1.8 on bccwin32ではminirubyが発狂し > ました。 > D:/ruby/src/mkconfig.rb:1668: yacc stack overflow > とか言われてしまったので、どうも普通にファイルを読むだけで > おかしくなってるみたいです [ruby-dev:19347]はカッコが抜けてました。これで連続する読み込み でseekすることはないはずです。 というか、改行コードがLFのファイルをテキストモードで開いてseek すると、msvcrtでもおかしくなりませんか。バッファに読み込んだ時 点でCRが削られたのか最初からなかったのか分からないはずなので、 どうしようもない話なのかも知れませんが。 > 話をbccだけに限ると、下記のパッチぐらいで誤魔化せるみたいで > はありますが... うーん、bccでもNEED_IO_FLUSH_BEFORE_SEEKは必要ないようなので、 fseek()の中でfflush()してるような気がします。とすれば、これは実 際には、(エラーを無視するということを除いて)flushの後は必ずseek するというのと等価なのでしょうか。 Index: io.c =================================================================== RCS file: /cvs/ruby/src/ruby/io.c,v retrieving revision 1.178 diff -u -2 -p -r1.178 io.c --- io.c 9 Jan 2003 08:20:32 -0000 1.178 +++ io.c 10 Jan 2003 04:36:42 -0000 @@ -214,4 +214,6 @@ flush_before_seek(fptr) #endif +#define FMODE_SYNCWRITE (FMODE_SYNC|FMODE_WRITABLE) + void rb_io_check_readable(fptr) @@ -222,5 +224,7 @@ rb_io_check_readable(fptr) } #if NEED_IO_SEEK_BETWEEN_RW - if ((fptr->mode & FMODE_WBUF) && !fptr->f2) { + if (((fptr->mode & FMODE_WBUF) || + (fptr->mode & (FMODE_SYNCWRITE|FMODE_RBUF)) == FMODE_SYNCWRITE) && + !fptr->f2) { io_seek(fptr, 0, SEEK_CUR); } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦