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