digraph {
rankdir=LR;
node [shape=plaintext];
subgraph cluster__ruby_marshal {
label="RubyMarshal";
graph[style=dotted];
ruby_marshal__seq [label=<
pos | size | type | id |
0 | 2 | | version |
2 | ... | Record | records |
>];
subgraph cluster__ruby_array {
label="RubyMarshal::RubyArray";
graph[style=dotted];
ruby_array__seq [label=<
pos | size | type | id |
0 | ... | PackedInt | num_elements |
... | ... | Record | elements |
repeat num_elements.value times |
>];
}
subgraph cluster__bignum {
label="RubyMarshal::Bignum";
graph[style=dotted];
bignum__seq [label=<
pos | size | type | id |
0 | 1 | u1 | sign |
1 | ... | PackedInt | len_div_2 |
... | (len_div_2.value * 2) | | body |
>];
}
subgraph cluster__ruby_struct {
label="RubyMarshal::RubyStruct";
graph[style=dotted];
ruby_struct__seq [label=<
pos | size | type | id |
0 | ... | Record | name |
... | ... | PackedInt | num_members |
... | ... | Pair | members |
repeat num_members.value times |
>];
}
subgraph cluster__ruby_symbol {
label="RubyMarshal::RubySymbol";
graph[style=dotted];
ruby_symbol__seq [label=<
pos | size | type | id |
0 | ... | PackedInt | len |
... | len.value | str(UTF-8) | name |
>];
}
subgraph cluster__packed_int {
label="RubyMarshal::PackedInt";
graph[style=dotted];
packed_int__seq [label=<
pos | size | type | id |
0 | 1 | u1 | code |
1 | ... | switch (code) | encoded |
... | ... | switch (code) | encoded2 |
>];
packed_int__inst__is_immediate [label=<
id | value |
is_immediate | ((code > 4) && (code < 252)) |
>];
packed_int__inst__value [label=<
id | value |
value | (is_immediate ? (code < 128 ? (code - 5) : (4 - (~(code) & 127))) : (code == 0 ? 0 : (code == 255 ? (encoded - 256) : (code == 254 ? (encoded - 65536) : (code == 253 ? (((encoded2 << 16) | encoded) - 16777216) : (code == 3 ? ((encoded2 << 16) | encoded) : encoded)))))) |
>];
packed_int__seq_encoded_switch [label=<>];
packed_int__seq_encoded2_switch [label=<>];
}
subgraph cluster__pair {
label="RubyMarshal::Pair";
graph[style=dotted];
pair__seq [label=<
pos | size | type | id |
0 | ... | Record | key |
... | ... | Record | value |
>];
}
subgraph cluster__instance_var {
label="RubyMarshal::InstanceVar";
graph[style=dotted];
instance_var__seq [label=<
pos | size | type | id |
0 | ... | Record | obj |
... | ... | PackedInt | num_vars |
... | ... | Pair | vars |
repeat num_vars.value times |
>];
}
subgraph cluster__record {
label="RubyMarshal::Record";
graph[style=dotted];
record__seq [label=<
pos | size | type | id |
0 | 1 | u1→Codes | code |
1 | ... | switch (code) | body |
>];
record__seq_body_switch [label=<
case | type |
:codes_packed_int | PackedInt |
:codes_bignum | Bignum |
:codes_ruby_array | RubyArray |
:codes_ruby_symbol_link | PackedInt |
:codes_ruby_struct | RubyStruct |
:codes_ruby_string | RubyString |
:codes_instance_var | InstanceVar |
:codes_ruby_hash | RubyHash |
:codes_ruby_symbol | RubySymbol |
:codes_ruby_object_link | PackedInt |
>];
}
subgraph cluster__ruby_hash {
label="RubyMarshal::RubyHash";
graph[style=dotted];
ruby_hash__seq [label=<
pos | size | type | id |
0 | ... | PackedInt | num_pairs |
... | ... | Pair | pairs |
repeat num_pairs.value times |
>];
}
subgraph cluster__ruby_string {
label="RubyMarshal::RubyString";
graph[style=dotted];
ruby_string__seq [label=<
pos | size | type | id |
0 | ... | PackedInt | len |
... | len.value | | body |
>];
}
}
ruby_marshal__seq:records_type -> record__seq [style=bold];
ruby_array__seq:num_elements_type -> packed_int__seq [style=bold];
ruby_array__seq:elements_type -> record__seq [style=bold];
packed_int__inst__value:value_type -> ruby_array__seq:elements__repeat [color="#404040"];
bignum__seq:len_div_2_type -> packed_int__seq [style=bold];
packed_int__inst__value:value_type -> bignum__seq:body_size [color="#404040"];
ruby_struct__seq:name_type -> record__seq [style=bold];
ruby_struct__seq:num_members_type -> packed_int__seq [style=bold];
ruby_struct__seq:members_type -> pair__seq [style=bold];
packed_int__inst__value:value_type -> ruby_struct__seq:members__repeat [color="#404040"];
ruby_symbol__seq:len_type -> packed_int__seq [style=bold];
packed_int__inst__value:value_type -> ruby_symbol__seq:name_size [color="#404040"];
packed_int__seq:encoded_type -> packed_int__seq_encoded_switch [style=bold];
packed_int__seq:code_type -> packed_int__seq:encoded_type [color="#404040"];
packed_int__seq:encoded2_type -> packed_int__seq_encoded2_switch [style=bold];
packed_int__seq:code_type -> packed_int__seq:encoded2_type [color="#404040"];
packed_int__seq:code_type -> packed_int__inst__is_immediate [color="#404040"];
packed_int__seq:code_type -> packed_int__inst__is_immediate [color="#404040"];
packed_int__inst__is_immediate:is_immediate_type -> packed_int__inst__value [color="#404040"];
packed_int__seq:code_type -> packed_int__inst__value [color="#404040"];
packed_int__seq:code_type -> packed_int__inst__value [color="#404040"];
packed_int__seq:code_type -> packed_int__inst__value [color="#404040"];
packed_int__seq:code_type -> packed_int__inst__value [color="#404040"];
packed_int__seq:code_type -> packed_int__inst__value [color="#404040"];
packed_int__seq:encoded_type -> packed_int__inst__value [color="#404040"];
packed_int__seq:code_type -> packed_int__inst__value [color="#404040"];
packed_int__seq:encoded_type -> packed_int__inst__value [color="#404040"];
packed_int__seq:code_type -> packed_int__inst__value [color="#404040"];
packed_int__seq:encoded2_type -> packed_int__inst__value [color="#404040"];
packed_int__seq:encoded_type -> packed_int__inst__value [color="#404040"];
packed_int__seq:code_type -> packed_int__inst__value [color="#404040"];
packed_int__seq:encoded2_type -> packed_int__inst__value [color="#404040"];
packed_int__seq:encoded_type -> packed_int__inst__value [color="#404040"];
packed_int__seq:encoded_type -> packed_int__inst__value [color="#404040"];
pair__seq:key_type -> record__seq [style=bold];
pair__seq:value_type -> record__seq [style=bold];
instance_var__seq:obj_type -> record__seq [style=bold];
instance_var__seq:num_vars_type -> packed_int__seq [style=bold];
instance_var__seq:vars_type -> pair__seq [style=bold];
packed_int__inst__value:value_type -> instance_var__seq:vars__repeat [color="#404040"];
record__seq:body_type -> record__seq_body_switch [style=bold];
record__seq_body_switch:case0 -> packed_int__seq [style=bold];
record__seq_body_switch:case1 -> bignum__seq [style=bold];
record__seq_body_switch:case2 -> ruby_array__seq [style=bold];
record__seq_body_switch:case3 -> packed_int__seq [style=bold];
record__seq_body_switch:case4 -> ruby_struct__seq [style=bold];
record__seq_body_switch:case5 -> ruby_string__seq [style=bold];
record__seq_body_switch:case6 -> instance_var__seq [style=bold];
record__seq_body_switch:case7 -> ruby_hash__seq [style=bold];
record__seq_body_switch:case8 -> ruby_symbol__seq [style=bold];
record__seq_body_switch:case9 -> packed_int__seq [style=bold];
record__seq:code_type -> record__seq:body_type [color="#404040"];
ruby_hash__seq:num_pairs_type -> packed_int__seq [style=bold];
ruby_hash__seq:pairs_type -> pair__seq [style=bold];
packed_int__inst__value:value_type -> ruby_hash__seq:pairs__repeat [color="#404040"];
ruby_string__seq:len_type -> packed_int__seq [style=bold];
packed_int__inst__value:value_type -> ruby_string__seq:body_size [color="#404040"];
}