ruby-changes:22169
From: naruse <ko1@a...>
Date: Fri, 6 Jan 2012 16:06:33 +0900 (JST)
Subject: [ruby-changes:22169] naruse:r34218 (trunk): * object.c (rb_inspect): raises Encoding::CompatibilityError if the
naruse 2012-01-06 16:06:22 +0900 (Fri, 06 Jan 2012) New Revision: 34218 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=34218 Log: * object.c (rb_inspect): raises Encoding::CompatibilityError if the result is incompatible with the default external encoding. [ruby-core:41931] [Bug #5848] Modified files: trunk/ChangeLog trunk/object.c trunk/test/ruby/test_m17n.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 34217) +++ ChangeLog (revision 34218) @@ -1,3 +1,9 @@ +Fri Jan 6 12:24:11 2012 NARUSE, Yui <naruse@r...> + + * 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@r...> * win32/win32.c (check_valid_dir): strict checking of root. Index: object.c =================================================================== --- object.c (revision 34217) +++ object.c (revision 34218) @@ -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 @@ 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 @@ * 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 Index: test/ruby/test_m17n.rb =================================================================== --- test/ruby/test_m17n.rb (revision 34217) +++ test/ruby/test_m17n.rb (revision 34218) @@ -256,6 +256,21 @@ 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"), -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/