Project

General

Profile

Feature #10038

Extend ObjectSpace.dump to expose buffer addresses for String and Array

Added by ko1 (Koichi Sasada) over 6 years ago. Updated about 3 years ago.

Status:
Assigned
Priority:
Normal
Target version:
-
[ruby-core:63725]

Description

ObjectSpace.dump() expose internal information in JSON.
How about to expose buffer addresses for String and Array?

Index: ext/objspace/objspace_dump.c
===================================================================
--- ext/objspace/objspace_dump.c    (revision 46821)
+++ ext/objspace/objspace_dump.c    (working copy)
@@ -178,12 +178,16 @@ dump_object(VALUE obj, struct dump_confi
        dump_append(dc, ", \"broken\":true");
    if (FL_TEST(obj, RSTRING_FSTR))
        dump_append(dc, ", \"fstring\":true");
-   if (STR_SHARED_P(obj))
+
+   if (STR_SHARED_P(obj)) {
        dump_append(dc, ", \"shared\":true");
+   }
    else {
        dump_append(dc, ", \"bytesize\":%ld", RSTRING_LEN(obj));
-       if (!STR_EMBED_P(obj) && !STR_SHARED_P(obj) && (long)rb_str_capacity(obj) != RSTRING_LEN(obj))
+       if (!STR_EMBED_P(obj) && !STR_SHARED_P(obj) && (long)rb_str_capacity(obj) != RSTRING_LEN(obj)) {
        dump_append(dc, ", \"capacity\":%ld", rb_str_capacity(obj));
+       dump_append(dc, ", \"ptr\":\"%p\"", RSTRING_PTR(obj));
+       }

        if (is_ascii_string(obj)) {
        dump_append(dc, ", \"value\":");
@@ -205,8 +209,14 @@ dump_object(VALUE obj, struct dump_confi
    dump_append(dc, ", \"length\":%ld", RARRAY_LEN(obj));
    if (RARRAY_LEN(obj) > 0 && FL_TEST(obj, ELTS_SHARED))
        dump_append(dc, ", \"shared\":true");
-   if (RARRAY_LEN(obj) > 0 && FL_TEST(obj, RARRAY_EMBED_FLAG))
+   if (RARRAY_LEN(obj) > 0) {
+       if (FL_TEST(obj, RARRAY_EMBED_FLAG)) {
        dump_append(dc, ", \"embedded\":true");
+       }
+       else {
+       dump_append(dc, ", \"ptr\":\"%p\"", RARRAY_PTR(obj));
+       }
+   }
    break;

       case T_CLASS:

With this hack, we can know the real memory address of them and cooperate with other native tools.

BTW, ObjectSpace.dump() should support T_SYMBOL.

Also available in: Atom PDF