summaryrefslogtreecommitdiff
path: root/test/objspace
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-05-28 19:40:04 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-05-28 19:40:04 +0000
commit6abf7938bface30fe562eb612bfb0ed66c6ff8d7 (patch)
tree2d351f51f9b89b6955e47897215593ae516f1e99 /test/objspace
parent4d059bf9f5f10f3d3088de49fc87e5555db7770d (diff)
* ext/objspace/objspace.c: add two methods to debug internals.
* ObjectSpace.internal_class_of: return RBASIC_CLASS(obj). * ObjectSpace.internal_super_of: return RCLASS_SUPER(cls). * NEWS: add information about both methods. * test/objspace/test_objspace.rb: add tests for both methods. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50662 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/objspace')
-rw-r--r--test/objspace/test_objspace.rb51
1 files changed, 51 insertions, 0 deletions
diff --git a/test/objspace/test_objspace.rb b/test/objspace/test_objspace.rb
index 329e418..8845b83 100644
--- a/test/objspace/test_objspace.rb
+++ b/test/objspace/test_objspace.rb
@@ -285,4 +285,55 @@ class TestObjSpace < Test::Unit::TestCase
assert_not_match /"fd":/, output
end
end
+
+ def traverse_classes klass
+ h = {}
+ while klass && !h.has_key?(klass)
+ h[klass] = true
+ klass = ObjectSpace.internal_class_of(klass)
+ end
+ end
+
+ def test_internal_class_of
+ i = 0
+ ObjectSpace.each_object{|o|
+ traverse_classes ObjectSpace.internal_class_of(o)
+ i += 1
+ }
+ assert_operator i, :>, 0
+ end
+
+ def traverse_super_classes klass
+ while klass
+ klass = ObjectSpace.internal_super_of(klass)
+ end
+ end
+
+ def all_super_classes klass
+ klasses = []
+ while klass
+ klasses << klass
+ klass = ObjectSpace.internal_super_of(klass)
+ end
+ klasses
+ end
+
+ def test_internal_super_of
+ klasses = all_super_classes(String)
+ String.ancestors.each{|k|
+ case k
+ when Class
+ assert_equal(true, klasses.include?(k), k.inspect)
+ when Module
+ assert_equal(false, klasses.include?(k), k.inspect) # Internal object (T_ICLASS)
+ end
+ }
+
+ i = 0
+ ObjectSpace.each_object(Module){|o|
+ traverse_super_classes ObjectSpace.internal_super_of(o)
+ i += 1
+ }
+ assert_operator i, :>, 0
+ end
end