ruby-changes:3862
From: ko1@a...
Date: Thu, 31 Jan 2008 06:24:48 +0900 (JST)
Subject: [ruby-changes:3862] nobu - Ruby:r15351 (trunk): * io.c (rb_io_close_read): replaces fptr with the tied writer if
nobu 2008-01-31 06:24:24 +0900 (Thu, 31 Jan 2008) New Revision: 15351 Modified files: trunk/ChangeLog trunk/io.c Log: * io.c (rb_io_close_read): replaces fptr with the tied writer if duplex. * io.c (rb_io_close_write): unties the tied IO for writing if duplex. [ruby-dev:33532] http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15351&r2=15350&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/io.c?r1=15351&r2=15350&diff_format=u Index: ChangeLog =================================================================== --- ChangeLog (revision 15350) +++ ChangeLog (revision 15351) @@ -1,3 +1,11 @@ +Thu Jan 31 06:24:22 2008 Nobuyoshi Nakada <nobu@r...> + + * io.c (rb_io_close_read): replaces fptr with the tied writer if + duplex. + + * io.c (rb_io_close_write): unties the tied IO for writing if duplex. + [ruby-dev:33532] + Thu Jan 31 02:22:04 2008 Yukihiro Matsumoto <matz@r...> * io.c (open_key_args): allow encoding key to take two encoding Index: io.c =================================================================== --- io.c (revision 15350) +++ io.c (revision 15351) @@ -2298,7 +2298,7 @@ else if (MBCLEN_NEEDMORE_P(r)) { str = rb_str_new(fptr->rbuf+fptr->rbuf_off, fptr->rbuf_len); fptr->rbuf_len = 0; -getc_needmore: + getc_needmore: if (io_fillbuf(fptr) != -1) { rb_str_cat(str, fptr->rbuf+fptr->rbuf_off, 1); fptr->rbuf_off++; @@ -2784,7 +2784,14 @@ write_io = GetWriteIO(io); if (io != write_io) { + rb_io_t *wfptr; fptr_finalize(fptr, Qfalse); + GetOpenFile(write_io, wfptr); + if (fptr->refcnt < LONG_MAX) { + wfptr->refcnt++; + RFILE(io)->fptr = wfptr; + rb_io_fptr_finalize(fptr); + } return Qnil; } @@ -2817,12 +2824,13 @@ rb_io_close_write(VALUE io) { rb_io_t *fptr; + VALUE write_io; if (rb_safe_level() >= 4 && !OBJ_TAINTED(io)) { rb_raise(rb_eSecurityError, "Insecure: can't close"); } - io = GetWriteIO(io); - GetOpenFile(io, fptr); + write_io = GetWriteIO(io); + GetOpenFile(write_io, fptr); if (is_socket(fptr->fd, fptr->path)) { #ifndef SHUT_WR # define SHUT_WR 1 @@ -2831,14 +2839,21 @@ rb_sys_fail(fptr->path); fptr->mode &= ~FMODE_WRITABLE; if (!(fptr->mode & FMODE_READABLE)) - return rb_io_close(io); + return rb_io_close(write_io); return Qnil; } if (fptr->mode & FMODE_READABLE) { rb_raise(rb_eIOError, "closing non-duplex IO for writing"); } - return rb_io_close(io); + + rb_io_close(write_io); + if (io != write_io) { + GetOpenFile(io, fptr); + fptr->tied_io_for_writing = 0; + fptr->mode &= ~FMODE_DUPLEX; + } + return Qnil; } /* -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/