aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--lib/ostruct.rb24
-rw-r--r--test/ostruct/test_ostruct.rb14
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) <yugui@yugui.jp>
+
+ * 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@ruby-lang.org>
* 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 <akr@fsij.org>
Tue Jan 13 21:28:14 2009 Yuki Sonoda (Yugui) <yugui@yugui.jp>
* 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@ruby-lang.org>
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("#<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