diff --git a/ChangeLog b/ChangeLog index e00cebfb91..c0c07dab84 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,6 @@ -Thu Nov 11 21:56:10 2010 Nobuyoshi Nakada +Thu Nov 11 23:03:12 2010 Nobuyoshi Nakada + + * io.c (argf_close): untie tied io before closing. * io.c (argf_write): add ARGF.write and so on. diff --git a/io.c b/io.c index 12c1884660..b668688821 100644 --- a/io.c +++ b/io.c @@ -315,10 +315,15 @@ rb_io_set_write_io(VALUE io, VALUE w) { VALUE write_io; rb_io_check_initialized(RFILE(io)->fptr); - GetWriteIO(w); + if (!RTEST(w)) { + w = 0; + } + else { + GetWriteIO(w); + } write_io = RFILE(io)->fptr->tied_io_for_writing; RFILE(io)->fptr->tied_io_for_writing = w; - return write_io; + return write_io ? write_io : Qnil; } /* @@ -6781,6 +6786,9 @@ argf_forward(int argc, VALUE *argv, VALUE argf) static void argf_close(VALUE file) { + if (RB_TYPE_P(file, T_FILE)) { + rb_io_set_write_io(file, Qnil); + } rb_funcall3(file, rb_intern("close"), 0, 0); }