diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-05-28 19:40:04 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-05-28 19:40:04 +0000 |
commit | 6abf7938bface30fe562eb612bfb0ed66c6ff8d7 (patch) | |
tree | 2d351f51f9b89b6955e47897215593ae516f1e99 /test/objspace | |
parent | 4d059bf9f5f10f3d3088de49fc87e5555db7770d (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.rb | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/test/objspace/test_objspace.rb b/test/objspace/test_objspace.rb index 329e418008..8845b83c4e 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 |