summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--io.c7
-rw-r--r--test/ruby/test_io_m17n.rb41
3 files changed, 27 insertions, 26 deletions
diff --git a/ChangeLog b/ChangeLog
index 1b63e1d1d2..afd4e5d845 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,7 @@
-Thu Oct 15 14:57:58 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Thu Oct 15 15:14:15 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (io_encoding_set): get rid of parsing non-ascii string, and
+ refine messages for invalid name encoding.
* io.c (io_reopen): unread current buffer before telling the
position, for the case of reopening same file. [ruby-dev:39479]
diff --git a/io.c b/io.c
index ccec1601dc..7ef11920ed 100644
--- a/io.c
+++ b/io.c
@@ -7500,8 +7500,7 @@ io_encoding_set(rb_io_t *fptr, VALUE v1, VALUE v2, VALUE opt)
enc2 = rb_to_encoding(v1);
tmp = rb_check_string_type(v2);
if (!NIL_P(tmp)) {
- char *p = StringValueCStr(tmp);
- if (*p == '-' && *(p+1) == '\0') {
+ if (RSTRING_LEN(tmp) == 1 && RSTRING_PTR(tmp)[0] == '-') {
/* Special case - "-" => no transcoding */
enc = enc2;
enc2 = NULL;
@@ -7526,8 +7525,8 @@ io_encoding_set(rb_io_t *fptr, VALUE v1, VALUE v2, VALUE opt)
}
else {
tmp = rb_check_string_type(v1);
- if (!NIL_P(tmp)) {
- parse_mode_enc(StringValueCStr(tmp), &enc, &enc2);
+ if (!NIL_P(tmp) && rb_enc_asciicompat(rb_enc_get(tmp))) {
+ parse_mode_enc(RSTRING_PTR(tmp), &enc, &enc2);
ecflags = rb_econv_prepare_opts(opt, &ecopts);
}
else {
diff --git a/test/ruby/test_io_m17n.rb b/test/ruby/test_io_m17n.rb
index 6f5e686c42..976aae8c2e 100644
--- a/test/ruby/test_io_m17n.rb
+++ b/test/ruby/test_io_m17n.rb
@@ -220,33 +220,27 @@ EOT
end
def test_s_pipe_invalid
- r, w = IO.pipe("utf-8", "euc-jp", :invalid=>:replace)
- w << "\x80"
- w.close
- assert_equal("?", r.read)
- ensure
- r.close if r && !r.closed?
- w.close if w && !w.closed?
+ with_pipe("utf-8", "euc-jp", :invalid=>:replace) {|r, w|
+ w << "\x80"
+ w.close
+ assert_equal("?", r.read)
+ }
end
def test_s_pipe_undef
- r, w = IO.pipe("utf-8:euc-jp", :undef=>:replace)
- w << "\ufffd"
- w.close
- assert_equal("?", r.read)
- ensure
- r.close if r && !r.closed?
- w.close if w && !w.closed?
+ with_pipe("utf-8:euc-jp", :undef=>:replace) {|r, w|
+ w << "\ufffd"
+ w.close
+ assert_equal("?", r.read)
+ }
end
def test_s_pipe_undef_replace_string
- r, w = IO.pipe("utf-8:euc-jp", :undef=>:replace, :replace=>"X")
- w << "\ufffd"
- w.close
- assert_equal("X", r.read)
- ensure
- r.close if r && !r.closed?
- w.close if w && !w.closed?
+ with_pipe("utf-8:euc-jp", :undef=>:replace, :replace=>"X") {|r, w|
+ w << "\ufffd"
+ w.close
+ assert_equal("X", r.read)
+ }
end
def test_dup
@@ -572,6 +566,11 @@ EOT
assert_equal(eucjp, r.read)
}
+ e = assert_raise(ArgumentError) {with_pipe("UTF-8", "UTF-8".encode("UTF-32BE")) {}}
+ assert_match(/invalid name encoding/, e.message)
+ e = assert_raise(ArgumentError) {with_pipe("UTF-8".encode("UTF-32BE")) {}}
+ assert_match(/invalid name encoding/, e.message)
+
ENCS.each {|enc|
with_pipe(enc) {|r, w|
w << "\xc2\xa1"