Issue #11599 has been updated by Yosi Attias.


Nobuyoshi Nakada wrote:
> That distinction makes no sense.
> Non-special-const objects (including `String`) are always shown in pointer reference form.
> That `"0x007f8f3c8baf88"` is the content of a string but not the pointer, then it never appears with your patch.

Oh.. I understand what you are saying, I will fix that!
Just to make sure I understand your position, you say this distinction is not needed, and in case of this hash:

~~~

    str_key = "Hello world".freeze
    hash = {}
    hash[:a] = 1
    hash[str_key] = -1
~~~

You want the result to be:

~~~

{
    "address": "0x007fa3d28c2dc8",
    "type": "HASH",
    "class": "0x007fa3d30af400",
    "size": 2,
    "entries": [
        {
            "key": ":a",
            "value": "0x00000000000003"
        },
        {
            "key": "\"Hello world\"",
            "value": "0xffffffffffffffff"
        }
    ],
    "references": [
        "0x007fa3d28b1230"
    ],
    "memsize": 232,
    "flags": {
        "wb_protected": true
    }
}
~~~

If so, I have one question:
The addresses of the values - "0x00000000000003" / "0xffffffffffffffff", dosen't exist in the dump result - because we don't dump numerics in the dump, and how I can know what is the dump result?

Or you want the value logic to be:
1. If this is special const: write the inspected value of it
2. If this is not a special const: write it's address 

----------------------------------------
Feature #11599: Dump entries of hash in ObjectSpace
https://bugs.ruby-lang.org/issues/11599#change-54486

* Author: Yosi Attias
* Status: Open
* Priority: Normal
* Assignee: 
----------------------------------------
Hi,

*This is my first c code contribution :)*

I am helping developing heap-analyzer (github.com/tenderlove/heap-analyzer), and currently the dumps lacks of "type metadata" information, like:

* Hash entries - the keys and value
* Array items - the items of the array

etc.

In the included patch, I have changed the dump of hash to add entries of hash.
For example, given the next hash:

~~~ruby
hash = {
    int_key: 1,
    str_key: "This is my string",
    inner_hash: { b: 2 }
}
~~~

The dump result (ObjectSpace.dump(hash)) will be:

~~~json
{
    "address": "0x007fbc01110340",
    "type": "HASH",
    "class": "0x007fbc0109b400",
    "size": 3,
    "entries": [
        {
            "is_key_address": false,
            "key": ":int_key",
            "is_value_address": false,
            "value": "1"
        },
        {
            "is_key_address": false,
            "key": ":str_key",
            "is_value_address": true,
            "value": "0x007fbc01110390"
        },
        {
            "is_key_address": false,
            "key": ":inner_hash",
            "is_value_address": true,
            "value": "0x007fbc01110368"
        }
    ],
    "references": [
        "0x007fbc01110390",
        "0x007fbc01110368"
    ],
    "memsize": 232,
    "flags": {
        "wb_protected": true
    }
}
~~~

As you can see, I have the "entries" array, where each entry contains:  "is_key_address", "is_value_address" - if the key/value are special consts the inspected value will be printed in the "key"/"value" properties, other their address will be print. 


Hope you will accept the patch (and I can submit another one for arrays),
Yosi.


---Files--------------------------------
objspace_dump_hash_entries.patch (4.8 KB)


-- 
https://bugs.ruby-lang.org/