mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* 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
This commit is contained in:
parent
4c5171bb17
commit
ef18be2366
3 changed files with 53 additions and 3 deletions
|
@ -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>
|
Sun Jan 15 13:21:50 2012 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
* ext/json/parser/parser.rl (json_string_unescape): workaround fix
|
* ext/json/parser/parser.rl (json_string_unescape): workaround fix
|
||||||
|
|
19
object.c
19
object.c
|
@ -368,12 +368,25 @@ rb_any_to_s(VALUE obj)
|
||||||
return str;
|
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
|
VALUE
|
||||||
rb_inspect(VALUE obj)
|
rb_inspect(VALUE obj)
|
||||||
{
|
{
|
||||||
VALUE s = rb_obj_as_string(rb_funcall(obj, id_inspect, 0, 0));
|
VALUE str = rb_obj_as_string(rb_funcall(obj, id_inspect, 0, 0));
|
||||||
rb_enc_check(rb_enc_default_external(), s);
|
rb_encoding *ext = rb_default_external_encoding();
|
||||||
return s;
|
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
|
static int
|
||||||
|
|
|
@ -271,6 +271,34 @@ class TestM17N < Test::Unit::TestCase
|
||||||
Encoding.default_external = orig_ext
|
Encoding.default_external = orig_ext
|
||||||
end
|
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
|
def test_str_dump
|
||||||
[
|
[
|
||||||
e("\xfe"),
|
e("\xfe"),
|
||||||
|
|
Loading…
Reference in a new issue