diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | object.c | 38 | ||||
-rw-r--r-- | test/ruby/test_m17n.rb | 15 |
3 files changed, 53 insertions, 6 deletions
@@ -1,3 +1,9 @@ +Fri Jan 6 12:24:11 2012 NARUSE, Yui <naruse@ruby-lang.org> + + * 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 <usa@ruby-lang.org> * win32/win32.c (check_valid_dir): strict checking of root. @@ -14,6 +14,7 @@ #include "ruby/ruby.h" #include "ruby/st.h" #include "ruby/util.h" +#include "ruby/encoding.h" #include <stdio.h> #include <errno.h> #include <ctype.h> @@ -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 - * <i>obj</i>. If not overridden and no instance variables, uses the - * <code>to_s</code> method to generate the string. - * <i>obj</i>. If not overridden, uses the <code>to_s</code> method to - * generate the string. + * Returns a string containing a human-readable representation of <i>obj</i>. + * By default, if the <i>obj</i> has instance variables, show the class name + * and instance variable details which is the list of the name and the result + * of <i>inspect</i> method for each instance variables. + * Otherwise uses the <i>to_s</i> method to generate the string. + * If the <i>to_s</i> mthoed is overridden, uses it. + * User defined classes should override this method to make better + * representation of <i>obj</i>. 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 #=> "#<Foo:0x0300c868>" + * + * class Bar + * def initialize + * @bar = 1 + * end + * end + * Bar.new.inspect #=> "#<Bar:0x0300c868 @bar=1>" + * + * 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 cc42514da2..fffcab3def 100644 --- a/test/ruby/test_m17n.rb +++ b/test/ruby/test_m17n.rb @@ -256,6 +256,21 @@ class TestM17N < Test::Unit::TestCase 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"), |