9 'json!' => \my $opt_json,
18 print " " x $x->{depth};
19 print qq({ "id": "$x->{seqn}", "name": "$x->{name}", "depth":$x->{depth}, "children":[ \n);
26 delete $seqn2node{$x->{seqn}};
27 my $self_size = 0; $self_size += $_ for values %{$x->{leaves}};
28 $x->{self_size} = $self_size;
29 if (my $parent = $stack[-1]) {
31 $x->{parent_seqn} = $parent->{seqn};
32 # accumulate into parent
33 $parent->{kids_node_count} += 1 + ($x->{kids_node_count}||0);
34 $parent->{kids_size} += $self_size + $x->{kids_size};
35 push @{$parent->{child_seqn}}, $x->{seqn};
40 print " " x $x->{depth};
41 my $size = $self_size + $x->{kids_size};
42 print qq(], "data":{ "\$area": $size } },\n);
47 print "memnodes = [" if $opt_json;
51 my ($type, $seqn, $val, $name, $extra) = split / /, $_, 5;
52 if ($type eq "N") { # Node ($val is depth)
53 while ($val < @stack) {
54 leave_node(my $x = pop @stack);
55 warn "N $seqn d$val ends $x->{seqn} d$x->{depth}: size $x->{self_size}+$x->{kids_size}\n";
57 die 1 if $stack[$val];
58 my $node = $stack[$val] = { seqn => $seqn, name => $name, extra => $extra, attr => [], leaves => {}, depth => $val, self_size=>0, kids_size=>0 };
60 $seqn2node{$seqn} = $node;
62 elsif ($type eq "L") { # Leaf name and memory size
63 my $node = $seqn2node{$seqn} || die;
64 $node->{leaves}{$name} += $val;
66 elsif ($type eq "A") { # Attribute name and value
67 my $node = $seqn2node{$seqn} || die;
68 push @{ $node->{attr} }, $name, $val; # pairs
71 warn "Invalid type '$type' on line $. ($_)";
77 leave_node($x = pop @stack) while @stack;
78 warn "EOF ends $x->{seqn} d$x->{depth}: size $x->{self_size}+$x->{kids_size}\n";
80 print " ];\n" if $opt_json;
84 warn Dumper(\%seqn2node);
87 SV(PVAV) fill=1/1 [#1 @0]
94 : : : : SV(PVAV) fill=-1/-1 [#5 @4]
102 N 1 0 SV(PVAV) fill=1/1
109 N 5 4 SV(PVAV) fill=-1/-1