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

ruby-changes:3051

From: ko1@a...
Date: 24 Dec 2007 03:01:42 +0900
Subject: [ruby-changes:3051] matz - Ruby:r14543 (trunk): * io.c (rb_io_check_readable): should not fill fptr->enc always.

matz	2007-12-24 03:01:16 +0900 (Mon, 24 Dec 2007)

  New Revision: 14543

  Modified files:
    trunk/ChangeLog
    trunk/io.c

  Log:
    * io.c (rb_io_check_readable): should not fill fptr->enc always.
      read-write IO (e.g. socket) does not work.  [ruby-dev:32685]
    
    * io.c (io_read_encoding): retrieve reading encoding.

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14543&r2=14542
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/io.c?r1=14543&r2=14542

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 14542)
+++ ChangeLog	(revision 14543)
@@ -1,3 +1,10 @@
+Mon Dec 24 02:59:32 2007  Yukihiro Matsumoto  <matz@r...>
+
+	* io.c (rb_io_check_readable): should not fill fptr->enc always.
+	  read-write IO (e.g. socket) does not work.  [ruby-dev:32685]
+
+	* io.c (io_read_encoding): retrieve reading encoding.
+
 Mon Dec 24 02:06:35 2007  Yukihiro Matsumoto  <matz@r...>
 
 	* io.c (rb_f_open): documentation update.
Index: io.c
===================================================================
--- io.c	(revision 14542)
+++ io.c	(revision 14543)
@@ -347,13 +347,22 @@
     if (fptr->wbuf_len) {
         io_fflush(fptr);
     }
-    if (!fptr->enc) {
-	fptr->enc = (fptr->mode & FMODE_BINMODE)
-	    ? rb_ascii8bit_encoding()
-	    : rb_default_external_encoding();
+    if (!fptr->enc && fptr->fd == 0) {
+	fptr->enc = rb_default_external_encoding();
     }
 }
 
+static rb_encoding*
+io_read_encoding(rb_io_t *fptr)
+{
+    if (fptr->enc) {
+	return fptr->enc;
+    }
+    return (fptr->mode & FMODE_BINMODE)
+	? rb_ascii8bit_encoding()
+	: rb_default_external_encoding();
+}
+
 void
 rb_io_check_writable(rb_io_t *fptr)
 {
@@ -1307,7 +1316,7 @@
 			 rb_enc_from_encoding(fptr->enc),
 			 rb_enc_from_encoding(fptr->enc2));
     }
-    else {
+    else if (fptr->enc) {
 	/* just one encoding, so associate it with the string */
 	rb_enc_associate(str, fptr->enc);
     }
@@ -1800,7 +1809,7 @@
 	if (RSTRING_LEN(str) == 0) return Qnil;
     }
     else if (limit == 0) {
-	return rb_enc_str_new(0, 0, fptr->enc);
+	return rb_enc_str_new(0, 0, io_read_encoding(fptr));
     }
     else if (rs == rb_default_rs) {
 	return rb_io_getline_fast(fptr, '\n', limit);
@@ -2175,7 +2184,7 @@
     GetOpenFile(io, fptr);
     rb_io_check_readable(fptr);
 
-    enc = fptr->enc;
+    enc = io_read_encoding(fptr);
     READ_CHECK(fptr);
     if (io_fillbuf(fptr) < 0) {
 	return Qnil;
@@ -2327,7 +2336,7 @@
     GetOpenFile(io, fptr);
     rb_io_check_readable(fptr);
     if (NIL_P(c)) return Qnil;
-    enc = fptr->enc;
+    enc = io_read_encoding(fptr);
     if (FIXNUM_P(c)) {
 	int cc = FIX2INT(c);
 	char buf[16];
@@ -5854,7 +5863,7 @@
     if (!fptr->enc && fptr->fd == 0) {
 	fptr->enc = rb_default_external_encoding();
     }
-    return rb_enc_from_encoding(fptr->enc);
+    return rb_enc_from_encoding(io_read_encoding(fptr));
 }
 
 /*
@@ -5872,7 +5881,7 @@
 
     GetOpenFile(io, fptr);
     if (!fptr->enc2) return Qnil;
-    return rb_enc_from_encoding(fptr->enc);
+    return rb_enc_from_encoding(io_read_encoding(fptr));
 }
 
 static VALUE

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml

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