Skip to content

Commit

Permalink
* object.c (rb_inspect): raise the result is not compatible with
Browse files Browse the repository at this point in the history
  the default external encoding. [ruby-core:42095] [Bug ruby#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
  • Loading branch information
nurse committed Jan 15, 2012
1 parent 4c5171b commit ef18be2
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 3 deletions.
9 changes: 9 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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
Expand Down
19 changes: 16 additions & 3 deletions object.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
28 changes: 28 additions & 0 deletions test/ruby/test_m17n.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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"),
Expand Down

0 comments on commit ef18be2

Please sign in to comment.