diff options
-rw-r--r-- | ext/objspace/objspace_dump.c | 7 | ||||
-rw-r--r-- | test/objspace/test_objspace.rb | 27 |
2 files changed, 32 insertions, 2 deletions
diff --git a/ext/objspace/objspace_dump.c b/ext/objspace/objspace_dump.c index 95bd8ac8dd..2659404556 100644 --- a/ext/objspace/objspace_dump.c +++ b/ext/objspace/objspace_dump.c @@ -268,8 +268,11 @@ dump_object(VALUE obj, struct dump_config *dc) case T_CLASS: case T_MODULE: - if (dc->cur_obj_klass) - dump_append(dc, ", \"name\":\"%s\"", rb_class2name(obj)); + if (dc->cur_obj_klass) { + VALUE mod_name = rb_mod_name(obj); + if (!NIL_P(mod_name)) + dump_append(dc, ", \"name\":\"%s\"", RSTRING_PTR(mod_name)); + } break; case T_DATA: diff --git a/test/objspace/test_objspace.rb b/test/objspace/test_objspace.rb index 336b30f75a..de270583c1 100644 --- a/test/objspace/test_objspace.rb +++ b/test/objspace/test_objspace.rb @@ -503,4 +503,31 @@ class TestObjSpace < Test::Unit::TestCase assert_equal h[:immortal_symbol], h[:immortal_dynamic_symbol] + h[:immortal_static_symbol], m ;;; end + + def test_dump_allocations + object = Object.new + assert_allocations_count(3) { ObjectSpace.dump(object) } + end + + def test_anonymous_class_name + klass = Class.new + assert_allocations_count(4) { ObjectSpace.dump(klass) } + assert_allocations_count(3) { ObjectSpace.dump(klass) } + + mod = Module.new + assert_allocations_count(3) { ObjectSpace.dump(mod) } + + assert_not_include ObjectSpace.dump(Class.new), '"name"' + assert_not_include ObjectSpace.dump(Module.new), '"name"' + end + + private + + def assert_allocations_count(count) + ObjectSpace.dump(Object.new) # warming up + + before = GC.stat(:total_allocated_objects) + yield + assert_equal count, GC.stat(:total_allocated_objects) - before + end end |