[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]