diff --git a/ChangeLog b/ChangeLog index e55a01c6aac6b9..2ba02766980a6f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Fri Jan 6 12:24:11 2012 NARUSE, Yui + + * object.c (rb_inspect): raises Encoding::CompatibilityError if the + result is incompatible with the default external encoding. + [ruby-core:41931] [Bug #5848] + Thu Jan 5 15:26:15 2012 NAKAMURA Usaku * win32/win32.c (check_valid_dir): strict checking of root. diff --git a/object.c b/object.c index 82fab4a812b680..4146586a215671 100644 --- a/object.c +++ b/object.c @@ -14,6 +14,7 @@ #include "ruby/ruby.h" #include "ruby/st.h" #include "ruby/util.h" +#include "ruby/encoding.h" #include #include #include @@ -370,7 +371,9 @@ rb_any_to_s(VALUE obj) VALUE rb_inspect(VALUE obj) { - return rb_obj_as_string(rb_funcall(obj, id_inspect, 0, 0)); + VALUE s = rb_obj_as_string(rb_funcall(obj, id_inspect, 0, 0)); + rb_enc_check(rb_enc_default_external(), s); + return s; } static int @@ -419,14 +422,37 @@ inspect_obj(VALUE obj, VALUE str, int recur) * call-seq: * obj.inspect -> string * - * Returns a string containing a human-readable representation of - * obj. If not overridden and no instance variables, uses the - * to_s method to generate the string. - * obj. If not overridden, uses the to_s method to - * generate the string. + * Returns a string containing a human-readable representation of obj. + * By default, if the obj has instance variables, show the class name + * and instance variable details which is the list of the name and the result + * of inspect method for each instance variables. + * Otherwise uses the to_s method to generate the string. + * If the to_s mthoed is overridden, uses it. + * User defined classes should override this method to make better + * representation of obj. When overriding this method, it should + * return a string whose encoding is compatible with the default external + * encoding. * * [ 1, 2, 3..4, 'five' ].inspect #=> "[1, 2, 3..4, \"five\"]" * Time.new.inspect #=> "2008-03-08 19:43:39 +0900" + * + * class Foo + * end + * Foo.new.inspect #=> "#" + * + * class Bar + * def initialize + * @bar = 1 + * end + * end + * Bar.new.inspect #=> "#" + * + * class Baz + * def to_s + * "baz" + * end + * end + * Baz.new.inspect #=> "baz" */ static VALUE diff --git a/test/ruby/test_m17n.rb b/test/ruby/test_m17n.rb index cc42514da277e3..fffcab3deffbae 100644 --- a/test/ruby/test_m17n.rb +++ b/test/ruby/test_m17n.rb @@ -256,6 +256,21 @@ def test_utf_16_32_inspect end end + def test_object_utf16_32_inspect + orig_int = Encoding.default_internal + orig_ext = Encoding.default_external + Encoding.default_internal = nil + Encoding.default_external = Encoding::UTF_8 + o = Object.new + [Encoding::UTF_16BE, Encoding::UTF_16LE, Encoding::UTF_32BE, Encoding::UTF_32LE].each do |e| + o.instance_eval "def inspect;'abc'.encode('#{e}');end" + assert_raise(Encoding::CompatibilityError) { [o].inspect } + end + ensure + Encoding.default_internal = orig_int + Encoding.default_external = orig_ext + end + def test_str_dump [ e("\xfe"),