From: Tietew Date: 2002-08-20T12:14:05+09:00 Subject: [ruby-dev:18038] Kernel::putc ignores $defout Tietew です。 組み込み Ruby (標準入出力がない) で $defout をトラップしていたと きに気がついたのですが,Kernel::putc が $defout を無視して fputc (putc) してしまうために Errno::EBADF になってしまいました。 ソースを見たら何処でもなりそうだったので試したらビンゴ。 tietew@sakura:~$ cat > putc.rb def (io = Object.new).write(s) $stdout.puts s.inspect end $> = io print "print" putc 'p' tietew@sakura:~$ ruby -v putc.rb ruby 1.6.7 (2002-07-11) [i686-linux] "print" putc.rb:10:in `putc': uninitialized stream (IOError) from putc.rb:10 tietew@sakura:~$ ruby-1.7 -v putc.rb ruby 1.7.2 (2002-07-26) [i686-linux] "print" putc.rb:10:in `putc': uninitialized stream (IOError) from putc.rb:10 とりあえず以下のパッチで直るんですけど,putc だけこうなっている 理由は何でしょう。速度? Index: io.c =================================================================== RCS file: /src/ruby/io.c,v retrieving revision 1.144 diff -p -u -2 -r1.144 io.c --- io.c 2002/08/16 07:23:04 1.144 +++ io.c 2002/08/20 03:12:25 @@ -2382,23 +2382,8 @@ rb_io_putc(io, ch) VALUE io, ch; { - OpenFile *fptr; - FILE *f; - int c = NUM2CHR(ch); - - rb_secure(4); - GetOpenFile(io, fptr); - rb_io_check_writable(fptr); - f = GetWriteFile(fptr); - - if (fputc(c, f) == EOF) - rb_sys_fail(fptr->path); - if (fptr->mode & FMODE_SYNC) { - io_fflush(f, fptr); - } - else { - fptr->mode |= FMODE_WBUF; - } - - return ch; + char c[2]; + c[0] = NUM2CHR(ch); + c[1] = '\0'; + return rb_io_write(io, rb_str_new(c, 1)); } —[ Tietew ]—————————————————————————— メ : tietew@tietew.net / tietew@raug.net / tietew@masuclub.net ホペ: http://www.tietew.net/ Tietew Windows Lab. http://www.masuclub.net/ 鱒倶楽部 指紋: 26CB 71BB B595 09C4 0153 81C4 773C 963A D51B 8CAA