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