From ef18be23664d105954a2685a28e5deb868fa6a8e Mon Sep 17 00:00:00 2001 From: naruse Date: Sun, 15 Jan 2012 07:28:50 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@34308 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 9 +++++++++ object.c | 19 ++++++++++++++++--- test/ruby/test_m17n.rb | 28 ++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 882e7a3a6035d7..6aaa59bdfa427b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Sun Jan 15 14:09:48 2012 NARUSE, Yui + + * 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 * ext/json/parser/parser.rl (json_string_unescape): workaround fix diff --git a/object.c b/object.c index 09b399923166f3..e3302d153ed1c7 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 7c261138ba0eda..3bfb540b1356ab 100644 --- a/test/ruby/test_m17n.rb +++ b/test/ruby/test_m17n.rb @@ -271,6 +271,34 @@ def test_object_utf16_32_inspect 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"),