summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--io.c13
-rw-r--r--test/ruby/test_io_m17n.rb26
3 files changed, 43 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index beafb794e9..231aca8b8e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Mar 13 12:37:53 2012 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * io.c (io_encoding_set): always warn if external encoding and internal
+ encoding are identical. [ruby-core:40727] [Bug #5568]
+
Tue Mar 13 12:37:03 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
Bug #5350
diff --git a/io.c b/io.c
index 169a5897a5..3fb9f1af02 100644
--- a/io.c
+++ b/io.c
@@ -8743,11 +8743,22 @@ io_encoding_set(rb_io_t *fptr, VALUE v1, VALUE v2, VALUE opt)
enc = find_encoding(v2);
if (enc == enc2) {
/* Special case - "-" => no transcoding */
+ VALUE tmp1 = rb_check_string_type(v1);
+ rb_warn("Ignoring internal encoding %s: it is identical to external encoding %s",
+ StringValueCStr(tmp), NIL_P(tmp1) ? rb_enc_name(enc) : StringValueCStr(tmp1));
enc2 = NULL;
}
}
- else
+ else {
enc = find_encoding(v2);
+ if (enc == enc2) {
+ /* Special case - "-" => no transcoding */
+ VALUE tmp1 = rb_check_string_type(v1);
+ rb_warn("Ignoring internal encoding %s: it is identical to external encoding %s",
+ rb_enc_name(enc), NIL_P(tmp1) ? rb_enc_name(enc) : StringValueCStr(tmp1));
+ enc2 = NULL;
+ }
+ }
SET_UNIVERSAL_NEWLINE_DECORATOR_IF_ENC2(enc2, ecflags);
ecflags = rb_econv_prepare_options(opt, &ecopts, ecflags);
}
diff --git a/test/ruby/test_io_m17n.rb b/test/ruby/test_io_m17n.rb
index 4f01a82674..8c71c2c871 100644
--- a/test/ruby/test_io_m17n.rb
+++ b/test/ruby/test_io_m17n.rb
@@ -984,6 +984,32 @@ EOT
end)
end
+ def test_set_encoding_identical
+ bug5568 = '[ruby-core:40727]'
+ open(__FILE__, "r") do |f|
+ assert_warn(/Ignoring internal encoding euc-jp: it is identical to external encoding eucjp/, bug5568) {
+ f.set_encoding("eucjp:euc-jp")
+ }
+ assert_warn(/Ignoring internal encoding euc-jp: it is identical to external encoding eucjp/, bug5568) {
+ f.set_encoding("eucjp", "euc-jp")
+ }
+ assert_warn(/Ignoring internal encoding euc-jp: it is identical to external encoding EUC-JP/, bug5568) {
+ f.set_encoding(Encoding::EUC_JP, "euc-jp")
+ }
+ assert_warn(/Ignoring internal encoding EUC-JP: it is identical to external encoding eucjp/, bug5568) {
+ f.set_encoding("eucjp", Encoding::EUC_JP)
+ }
+ assert_warn(/Ignoring internal encoding EUC-JP: it is identical to external encoding EUC-JP/, bug5568) {
+ f.set_encoding(Encoding::EUC_JP, Encoding::EUC_JP)
+ }
+ nonstr = Object.new
+ def nonstr.to_str; "eucjp"; end
+ assert_warn(/Ignoring internal encoding eucjp: it is identical to external encoding eucjp/, bug5568) {
+ f.set_encoding(nonstr, nonstr)
+ }
+ end
+ end
+
def test_set_encoding_undef
pipe(proc do |w|
w << "\ufffd"