[前][次][番号順一覧][スレッド一覧]

ruby-changes:24648

From: eregon <ko1@a...>
Date: Tue, 14 Aug 2012 19:22:25 +0900 (JST)
Subject: [ruby-changes:24648] eregon:r36699 (trunk): Kernel#inspect: improve consistency and do not call #to_s.

eregon	2012-08-14 19:20:44 +0900 (Tue, 14 Aug 2012)

  New Revision: 36699

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=36699

  Log:
    Kernel#inspect: improve consistency and do not call #to_s.
    
    A class can now benefit from the nice default #inspect even if it
    defines #to_s. Also, there is no more unexpected change in #inspect
    result. Internal structures have been adapted so they don't rely
    on the removed behavior (#inspect calling overridden #to_s).
    
    * object.c (rb_obj_inspect): Kernel#inspect: do not call #to_s.
    * test/ruby/test_object.rb (test_inspect): add tests for Kernel#inspect.
    * bignum.c, io.c, numeric.c, object.c, proc.c, vm.c (Init_*):
      alias #inspect to #to_s where it was expected.
      [ruby-core:43238][Feature #6130]

  Modified files:
    trunk/ChangeLog
    trunk/bignum.c
    trunk/io.c
    trunk/numeric.c
    trunk/object.c
    trunk/proc.c
    trunk/test/ruby/test_object.rb
    trunk/vm.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 36698)
+++ ChangeLog	(revision 36699)
@@ -1,3 +1,18 @@
+Tue Aug 14 19:09:38 2012  Benoit Daloze  <eregontp@g...>
+
+	Kernel#inspect: improve consistency and do not call #to_s.
+
+	A class can now benefit from the nice default #inspect even if it
+	defines #to_s. Also, there is no more unexpected change in #inspect
+	result. Internal structures have been adapted so they don't rely
+	on the removed behavior (#inspect calling overridden #to_s).
+
+	* object.c (rb_obj_inspect): Kernel#inspect: do not call #to_s.
+	* test/ruby/test_object.rb (test_inspect): add tests for Kernel#inspect.
+	* bignum.c, io.c, numeric.c, object.c, proc.c, vm.c (Init_*):
+	  alias #inspect to #to_s where it was expected.
+	  [ruby-core:43238][Feature #6130]
+
 Tue Aug 14 16:25:46 2012  Shugo Maeda  <shugo@r...>
 
 	* test/erb/test_erb.rb (test_html_escape): add assertions for the
Index: object.c
===================================================================
--- object.c	(revision 36698)
+++ object.c	(revision 36699)
@@ -450,11 +450,8 @@
  *     obj.inspect   -> 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 variable.
- * Otherwise uses the <i>to_s</i> method to generate the string.
- * If the <i>to_s</i> method is overridden, uses it.
+ * By default, show the class name and the list of the instance variables and
+ * their values (by calling #inspect on each of them).
  * 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
@@ -479,35 +476,21 @@
  *         "baz"
  *       end
  *     end
- *     Baz.new.inspect                  #=> "baz"
+ *     Baz.new.inspect                  #=> "#<Baz:0x0300c868>"
  */
 
 static VALUE
 rb_obj_inspect(VALUE obj)
 {
-    if (RB_TYPE_P(obj, T_OBJECT) && rb_obj_basic_to_s_p(obj)) {
-        int has_ivar = 0;
-        VALUE *ptr = ROBJECT_IVPTR(obj);
-        long len = ROBJECT_NUMIV(obj);
-        long i;
+    if (rb_ivar_count(obj) > 0) {
+	VALUE str;
+	const char *c = rb_obj_classname(obj);
 
-        for (i = 0; i < len; i++) {
-            if (ptr[i] != Qundef) {
-                has_ivar = 1;
-                break;
-            }
-        }
-
-        if (has_ivar) {
-            VALUE str;
-            const char *c = rb_obj_classname(obj);
-
-            str = rb_sprintf("-<%s:%p", c, (void*)obj);
-            return rb_exec_recursive(inspect_obj, obj, str);
-        }
+	str = rb_sprintf("-<%s:%p", c, (void*)obj);
+	return rb_exec_recursive(inspect_obj, obj, str);
+    } else {
 	return rb_any_to_s(obj);
     }
-    return rb_funcall(obj, rb_intern("to_s"), 0, 0);
 }
 
 static VALUE
@@ -2951,6 +2934,7 @@
     rb_define_method(rb_cModule, ">=", rb_mod_ge, 1);
     rb_define_method(rb_cModule, "initialize_copy", rb_mod_init_copy, 1); /* in class.c */
     rb_define_method(rb_cModule, "to_s", rb_mod_to_s, 0);
+    rb_define_alias(rb_cModule, "inspect", "to_s");
     rb_define_method(rb_cModule, "included_modules", rb_mod_included_modules, 0); /* in class.c */
     rb_define_method(rb_cModule, "include?", rb_mod_include_p, 1); /* in class.c */
     rb_define_method(rb_cModule, "name", rb_mod_name, 0);  /* in variable.c */
@@ -3003,6 +2987,7 @@
 
     rb_cTrueClass = rb_define_class("TrueClass", rb_cObject);
     rb_define_method(rb_cTrueClass, "to_s", true_to_s, 0);
+    rb_define_alias(rb_cTrueClass, "inspect", "to_s");
     rb_define_method(rb_cTrueClass, "&", true_and, 1);
     rb_define_method(rb_cTrueClass, "|", true_or, 1);
     rb_define_method(rb_cTrueClass, "^", true_xor, 1);
@@ -3015,6 +3000,7 @@
 
     rb_cFalseClass = rb_define_class("FalseClass", rb_cObject);
     rb_define_method(rb_cFalseClass, "to_s", false_to_s, 0);
+    rb_define_alias(rb_cFalseClass, "inspect", "to_s");
     rb_define_method(rb_cFalseClass, "&", false_and, 1);
     rb_define_method(rb_cFalseClass, "|", false_or, 1);
     rb_define_method(rb_cFalseClass, "^", false_xor, 1);
Index: io.c
===================================================================
--- io.c	(revision 36698)
+++ io.c	(revision 36699)
@@ -11505,6 +11505,7 @@
     rb_define_method(rb_cARGF, "initialize", argf_initialize, -2);
     rb_define_method(rb_cARGF, "initialize_copy", argf_initialize_copy, 1);
     rb_define_method(rb_cARGF, "to_s", argf_to_s, 0);
+    rb_define_alias(rb_cARGF, "inspect", "to_s");
     rb_define_method(rb_cARGF, "argv", argf_argv, 0);
 
     rb_define_method(rb_cARGF, "fileno", argf_fileno, 0);
Index: proc.c
===================================================================
--- proc.c	(revision 36698)
+++ proc.c	(revision 36699)
@@ -2217,6 +2217,7 @@
     rb_define_method(rb_cProc, "eql?", proc_eq, 1);
     rb_define_method(rb_cProc, "hash", proc_hash, 0);
     rb_define_method(rb_cProc, "to_s", proc_to_s, 0);
+    rb_define_alias(rb_cProc, "inspect", "to_s");
     rb_define_method(rb_cProc, "lambda?", rb_proc_lambda_p, 0);
     rb_define_method(rb_cProc, "binding", proc_binding, 0);
     rb_define_method(rb_cProc, "curry", proc_curry, -1);
Index: numeric.c
===================================================================
--- numeric.c	(revision 36698)
+++ numeric.c	(revision 36699)
@@ -3660,6 +3660,7 @@
     rb_cFixnum = rb_define_class("Fixnum", rb_cInteger);
 
     rb_define_method(rb_cFixnum, "to_s", fix_to_s, -1);
+    rb_define_alias(rb_cFixnum, "inspect", "to_s");
 
     rb_define_method(rb_cFixnum, "-@", fix_uminus, 0);
     rb_define_method(rb_cFixnum, "+", fix_plus, 1);
@@ -3720,6 +3721,7 @@
     rb_define_const(rb_cFloat, "NAN", DBL2NUM(NAN));
 
     rb_define_method(rb_cFloat, "to_s", flo_to_s, 0);
+    rb_define_alias(rb_cFloat, "inspect", "to_s");
     rb_define_method(rb_cFloat, "coerce", flo_coerce, 1);
     rb_define_method(rb_cFloat, "-@", flo_uminus, 0);
     rb_define_method(rb_cFloat, "+", flo_plus, 1);
Index: vm.c
===================================================================
--- vm.c	(revision 36698)
+++ vm.c	(revision 36699)
@@ -2229,6 +2229,7 @@
 
     vm->top_self = rb_obj_alloc(rb_cObject);
     rb_define_singleton_method(rb_vm_top_self(), "to_s", main_to_s, 0);
+    rb_define_alias(rb_singleton_class(rb_vm_top_self()), "inspect", "to_s");
 
     /* initialize mark object array */
     vm->mark_object_ary = rb_ary_tmp_new(1);
Index: bignum.c
===================================================================
--- bignum.c	(revision 36698)
+++ bignum.c	(revision 36699)
@@ -3835,6 +3835,7 @@
     rb_cBignum = rb_define_class("Bignum", rb_cInteger);
 
     rb_define_method(rb_cBignum, "to_s", rb_big_to_s, -1);
+    rb_define_alias(rb_cBignum, "inspect", "to_s");
     rb_define_method(rb_cBignum, "coerce", rb_big_coerce, 1);
     rb_define_method(rb_cBignum, "-@", rb_big_uminus, 0);
     rb_define_method(rb_cBignum, "+", rb_big_plus, 1);
Index: test/ruby/test_object.rb
===================================================================
--- test/ruby/test_object.rb	(revision 36698)
+++ test/ruby/test_object.rb	(revision 36699)
@@ -690,6 +690,31 @@
     assert_equal(true, s.tainted?)
   end
 
+  def test_inspect
+    x = Object.new
+    assert_match(/\A#<Object:0x\h+>\z/, x.inspect)
+
+    x.instance_variable_set(:@ivar, :value)
+    assert_match(/\A#<Object:0x\h+ @ivar=:value>\z/, x.inspect)
+
+    x = Object.new
+    x.instance_variable_set(:@recur, x)
+    assert_match(/\A#<Object:0x\h+ @recur=#<Object:0x\h+ \.\.\.>>\z/, x.inspect)
+
+    x = Object.new
+    x.instance_variable_set(:@foo, "value")
+    x.instance_variable_set(:@bar, 42)
+    assert_match(/\A#<Object:0x\h+ (?:@foo="value", @bar=42|@bar=42, @foo="value")>\z/, x.inspect)
+
+    # #inspect does not call #to_s anymore
+    feature6130 = '[ruby-core:43238]'
+    x = Object.new
+    def x.to_s
+      "to_s"
+    end
+    assert_match(/\A#<Object:0x\h+>\z/, x.inspect, feature6130)
+  end
+
   def test_exec_recursive
     Thread.current[:__recursive_key__] = nil
     a = [[]]

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]