From ed15422759aef6f0fa17fb9595b799b6aa487a73 Mon Sep 17 00:00:00 2001 From: yugui Date: Tue, 13 Jan 2009 12:52:23 +0000 Subject: * 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]. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21496 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 10 +++++++++- lib/ostruct.rb | 24 +++++++++++------------- test/ostruct/test_ostruct.rb | 14 ++++++++++++++ 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2e03f7459e..661adffb92 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Tue Jan 13 21:45:53 2009 Yuki Sonoda (Yugui) + + * 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 * io.c (io_reopen, rb_io_init_copy): should register fptr to pipe_list @@ -16,7 +24,7 @@ Tue Jan 13 21:38:07 2009 Tanaka Akira Tue Jan 13 21:28:14 2009 Yuki Sonoda (Yugui) * 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 diff --git a/lib/ostruct.rb b/lib/ostruct.rb index f3ed01524b..35a14b4920 100644 --- a/lib/ostruct.rb +++ b/lib/ostruct.rb @@ -112,25 +112,23 @@ class OpenStruct 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 diff --git a/test/ostruct/test_ostruct.rb b/test/ostruct/test_ostruct.rb index 24ed17f800..79662c6437 100644 --- a/test/ostruct/test_ostruct.rb +++ b/test/ostruct/test_ostruct.rb @@ -20,4 +20,18 @@ class TC_OpenStruct < Test::Unit::TestCase o2.instance_eval{@table = {:a => 'b'}} assert_not_equal(o1, o2) end + + def test_inspect + foo = OpenStruct.new + assert_equal("#", foo.inspect) + foo.bar = 1 + foo.baz = 2 + assert_equal("#", foo.inspect) + + foo = OpenStruct.new + foo.bar = OpenStruct.new + assert_equal('#>', foo.inspect) + foo.bar.foo = foo + assert_equal('#>>', foo.inspect) + end end -- cgit v1.2.3