summaryrefslogtreecommitdiff
path: root/ext/objspace/objspace_dump.c
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2021-01-21 09:45:11 +0100
committerAaron Patterson <aaron.patterson@gmail.com>2021-02-04 09:53:31 -0800
commit3a888398a661d7dc3cbcc21b8983809905b07adb (patch)
treeb9db76eaed412f47f7028dd1e85edd4f8b785ceb /ext/objspace/objspace_dump.c
parent365326a09e55cacbf6677105db12aa79de9c4404 (diff)
objspace_dump.c: tag singleton classes and reference the superclass
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/4104
Diffstat (limited to 'ext/objspace/objspace_dump.c')
-rw-r--r--ext/objspace/objspace_dump.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/ext/objspace/objspace_dump.c b/ext/objspace/objspace_dump.c
index 544d11e254..c3619a9656 100644
--- a/ext/objspace/objspace_dump.c
+++ b/ext/objspace/objspace_dump.c
@@ -419,14 +419,37 @@ dump_object(VALUE obj, struct dump_config *dc)
dump_append(dc, ", \"embedded\":true");
break;
+ case T_ICLASS:
+ if (rb_class_get_superclass(obj)) {
+ dump_append(dc, ", \"superclass\":");
+ dump_append_ref(dc, rb_class_get_superclass(obj));
+ }
+ break;
+
case T_CLASS:
case T_MODULE:
+ if (rb_class_get_superclass(obj)) {
+ dump_append(dc, ", \"superclass\":");
+ dump_append_ref(dc, rb_class_get_superclass(obj));
+ }
+
if (dc->cur_obj_klass) {
VALUE mod_name = rb_mod_name(obj);
if (!NIL_P(mod_name)) {
dump_append(dc, ", \"name\":\"");
dump_append(dc, RSTRING_PTR(mod_name));
dump_append(dc, "\"");
+ } else {
+ VALUE real_mod_name = rb_mod_name(rb_class_real(obj));
+ if (RTEST(real_mod_name)) {
+ dump_append(dc, ", \"real_class_name\":\"");
+ dump_append(dc, RSTRING_PTR(real_mod_name));
+ dump_append(dc, "\"");
+ }
+ }
+
+ if (FL_TEST(obj, FL_SINGLETON)) {
+ dump_append(dc, ", \"singleton\":true");
}
}
break;