summaryrefslogtreecommitdiff
diff options
-rw-r--r--ext/objspace/objspace_dump.c7
-rw-r--r--test/objspace/test_objspace.rb27
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