From: matz@... (Yukihiro Matsumoto) Date: 2004-03-09T13:04:16+09:00 Subject: [ruby-dev:23182] Re: test/scanf/test_scanf.rbで[BUG] まつもと ゆきひろです In message "[ruby-dev:23181] test/scanf/test_scanf.rbで[BUG]" on 04/03/09, "U.Nakamura" writes: |しばらく前から、mswin32版でtest/scanf/test_scanf.rbが | [BUG] rb_sys_fail(iotest.dat) - errno == 0 |で落ちてしまうのでいろいろ調べていましたが、ANSI(ISO/JIS) Cの |範囲においては、 | |(1) lib/scanf.rb内のIO#soak_up_spacesで、パターンによっては複 | 数回ungetc(3)が呼び出されるが、そもそも間にfseek,fsetpos, | rewideを挟まずに複数回ungetcを呼び出した場合は成功するこ | とは保証されておらず、 |(2) また、ungetc(3)がerrnoをセットするという規定はない(しても | いいけどする必要はない) | |というわけで、scanf.rbのIO#soak_up_spacesがこのままでいいかど |うか、という問題と、io.cのrb_io_ungetcの中でrb_sys_failを呼ん |でいる部分をどうするか、という問題があります。 なるほど。前者はdblackに話すしかないですが、ungetcについては rb_sys_fail()を呼ぶのでなくIOErrorを出すようにしましょう。 --- io.c 2 Mar 2004 07:30:34 -0000 1.262 +++ io.c 9 Mar 2004 04:04:05 -0000 @@ -1698,4 +1698,5 @@ rb_io_ungetc(io, c) - if (ungetc(cc, fptr->f) == EOF && cc != EOF) - rb_sys_fail(fptr->path); + if (ungetc(cc, fptr->f) == EOF && cc != EOF) { + rb_raise(rb_eIOError, "ungetc failed"); + } return Qnil;