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

ruby-changes:9955

From: yugui <ko1@a...>
Date: Tue, 13 Jan 2009 21:52:46 +0900 (JST)
Subject: [ruby-changes:9955] Ruby:r21496 (trunk): * lib/ostruct.rb (OpenStruct#inspect): fixed the recursion check.

yugui	2009-01-13 21:52:23 +0900 (Tue, 13 Jan 2009)

  New Revision: 21496

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

  Log:
    * lib/ostruct.rb (OpenStruct#inspect): fixed the recursion check.
      Patch by Kornelius Kalnbach.  [ruby-core:20992].
    * test/ostruct/test_ostruct.rb: test for inspect.
      Patch by Kornelius Kalnbach.  [ruby-core:20992].

  Modified files:
    trunk/ChangeLog
    trunk/lib/ostruct.rb
    trunk/test/ostruct/test_ostruct.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 21495)
+++ ChangeLog	(revision 21496)
@@ -1,3 +1,11 @@
+Tue Jan 13 21:45:53 2009  Yuki Sonoda (Yugui)  <yugui@y...>
+
+	* lib/ostruct.rb (OpenStruct#inspect): fixed the recursion check.
+	  Patch by Kornelius Kalnbach.  [ruby-core:20992].
+
+	* test/ostruct/test_ostruct.rb: test for inspect.
+	  Patch by Kornelius Kalnbach.  [ruby-core:20992].
+
 Tue Jan 13 21:44:30 2009  NAKAMURA Usaku  <usa@r...>
 
 	* io.c (io_reopen, rb_io_init_copy): should register fptr to pipe_list
@@ -16,7 +24,7 @@
 Tue Jan 13 21:28:14 2009  Yuki Sonoda (Yugui)  <yugui@y...>
 
 	* object.c (rb_obj_not_match): rdoc.
-	  Patch by Kornelius Kalnbach.
+	  Patch by Kornelius Kalnbach.  [ruby-core:20991]
 
 Tue Jan 13 18:21:44 2009  NAKAMURA Usaku  <usa@r...>
 
Index: lib/ostruct.rb
===================================================================
--- lib/ostruct.rb	(revision 21495)
+++ lib/ostruct.rb	(revision 21496)
@@ -112,25 +112,23 @@
   def inspect
     str = "#<#{self.class}"
 
-    Thread.current[InspectKey] ||= []
-    if Thread.current[InspectKey].include?(self) then
-      str << " ..."
-    else
+    ids = (Thread.current[InspectKey] ||= [])
+    if ids.include?(object_id)
+      return str << ' ...>'
+    end
+
+    ids << object_id
+    begin
       first = true
       for k,v in @table
         str << "," unless first
         first = false
-
-        Thread.current[InspectKey] << v
-        begin
-          str << " #{k}=#{v.inspect}"
-        ensure
-          Thread.current[InspectKey].pop
-        end
+        str << " #{k}=#{v.inspect}"
       end
+      return str << '>'
+    ensure
+      ids.pop
     end
-
-    str << ">"
   end
   alias :to_s :inspect
 
Index: test/ostruct/test_ostruct.rb
===================================================================
--- test/ostruct/test_ostruct.rb	(revision 21495)
+++ test/ostruct/test_ostruct.rb	(revision 21496)
@@ -20,4 +20,18 @@
     o2.instance_eval{@table = {:a => 'b'}}
     assert_not_equal(o1, o2)
   end
+  
+  def test_inspect
+    foo = OpenStruct.new
+    assert_equal("#<OpenStruct>", foo.inspect)
+    foo.bar = 1
+    foo.baz = 2
+    assert_equal("#<OpenStruct bar=1, baz=2>", foo.inspect)
+
+    foo = OpenStruct.new
+    foo.bar = OpenStruct.new
+    assert_equal('#<OpenStruct bar=#<OpenStruct>>', foo.inspect)
+    foo.bar.foo = foo
+    assert_equal('#<OpenStruct bar=#<OpenStruct foo=#<OpenStruct ...>>>', foo.inspect)
+  end
 end

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

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