From: headius@... Date: 2014-07-17T17:04:58+00:00 Subject: [ruby-core:63802] [ruby-trunk - Feature #10038] Extend ObjectSpace.dump to expose buffer addresses for String and Array Issue #10038 has been updated by Charles Nutter. -1 from me, mostly because exposing actual memory addresses will *further* limit what Ruby can do with object references. In the presence of RGenGC, some objects are already being relocated in memory, so those objects would either have to become "shady" or not expose their addresses. As MRI's GC improves further, this will become more and more common. And another (perhaps minor) reason: other implementations that already have fully generational GCs won't be able to support this feature at all. If a feature like this must be added, put it in an MRI-specific namespace like RubyVM. And I'd still recommend not adding another feature that limits Ruby's (and MRI's) evolution. ---------------------------------------- Feature #10038: Extend ObjectSpace.dump to expose buffer addresses for String and Array https://bugs.ruby-lang.org/issues/10038#change-47834 * Author: Koichi Sasada * Status: Open * Priority: Normal * Assignee: Aman Gupta * Category: ext * Target version: current: 2.2.0 ---------------------------------------- ObjectSpace.dump() expose internal information in JSON. How about to expose buffer addresses for String and Array? ```diff 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. -- https://bugs.ruby-lang.org/