summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--object.c19
-rw-r--r--test/ruby/test_m17n.rb28
3 files changed, 53 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 882e7a3a60..6aaa59bdfa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Sun Jan 15 14:09:48 2012 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * object.c (rb_inspect): raise the result is not compatible with
+ the default external encoding. [ruby-core:42095] [Bug #5848]
+ If the default external encoding is ASCII compatible, the encoding of
+ inspected result must be compatible with it.
+ If the default external encoding is ASCII incomapatible,
+ the result must be ASCII only.
+
Sun Jan 15 13:21:50 2012 NARUSE, Yui <naruse@ruby-lang.org>
* ext/json/parser/parser.rl (json_string_unescape): workaround fix
diff --git a/object.c b/object.c
index 09b3999231..e3302d153e 100644
--- a/object.c
+++ b/object.c
@@ -368,12 +368,25 @@ rb_any_to_s(VALUE obj)
return str;
}
+/*
+ * If the default external encoding is ASCII compatible, the encoding of
+ * inspected result must be compatible with it.
+ * If the default external encoding is ASCII incomapatible,
+ * the result must be ASCII only.
+ */
VALUE
rb_inspect(VALUE obj)
{
- VALUE s = rb_obj_as_string(rb_funcall(obj, id_inspect, 0, 0));
- rb_enc_check(rb_enc_default_external(), s);
- return s;
+ VALUE str = rb_obj_as_string(rb_funcall(obj, id_inspect, 0, 0));
+ rb_encoding *ext = rb_default_external_encoding();
+ if (!rb_enc_asciicompat(ext)) {
+ if (!rb_enc_str_asciionly_p(str))
+ rb_raise(rb_eEncCompatError, "inspected result must be ASCII only if default external encoding is ASCII incompatible");
+ return str;
+ }
+ if (rb_enc_get(str) != ext && !rb_enc_str_asciionly_p(str))
+ rb_raise(rb_eEncCompatError, "inspected result must be ASCII only or use the same encoding with default external");
+ return str;
}
static int
diff --git a/test/ruby/test_m17n.rb b/test/ruby/test_m17n.rb
index 7c261138ba..3bfb540b13 100644
--- a/test/ruby/test_m17n.rb
+++ b/test/ruby/test_m17n.rb
@@ -271,6 +271,34 @@ class TestM17N < Test::Unit::TestCase
Encoding.default_external = orig_ext
end
+ def test_object_inspect_external
+ orig_v, $VERBOSE = $VERBOSE, false
+ orig_int, Encoding.default_internal = Encoding.default_internal, nil
+ orig_ext = Encoding.default_external
+ o = Object.new
+
+ Encoding.default_external = Encoding::UTF_16BE
+ def o.inspect
+ "abc"
+ end
+ assert_nothing_raised(Encoding::CompatibilityError) { [o].inspect }
+
+ def o.inspect
+ "abc".encode(Encoding.default_external)
+ end
+ assert_raise(Encoding::CompatibilityError) { [o].inspect }
+
+ Encoding.default_external = Encoding::US_ASCII
+ def o.inspect
+ "\u3042"
+ end
+ assert_raise(Encoding::CompatibilityError) { [o].inspect }
+ ensure
+ Encoding.default_internal = orig_int
+ Encoding.default_external = orig_ext
+ $VERBOSE = orig_v
+ end
+
def test_str_dump
[
e("\xfe"),