Add memnodes.pl script to process output stream.
[p5sagit/Devel-Size.git] / memnodes.pl
CommitLineData
2c631ee0 1#!/bin/env perl
2
3use strict;
4use warnings;
5
6my @stack;
7my %seqn2node;
8
9sub pop_stack {
10 my $x = pop @stack;
11 delete $seqn2node{$x->{seqn}};
12 my $size = 0; $size += $_ for values %{$x->{leaves}};
13 $x->{self_size} = $size;
14 if (my $parent = $stack[-1]) {
15 # link to parent
16 $x->{parent_seqn} = $parent->{seqn};
17 # accumulate into parent
18 $parent->{kids_node_count} += 1 + ($x->{kids_node_count}||0);
19 $parent->{kids_size} += $size + $x->{kids_size};
20 push @{$parent->{child_seqn}}, $x->{seqn};
21 }
22 # output
23 # ...
24 return $x;
25}
26
27while (<>) {
28 chomp;
29 my ($type, $seqn, $val, $name, $extra) = split / /, $_, 5;
30 if ($type eq "N") { # Node ($val is depth)
31 while ($val < @stack) {
32 my $x = pop_stack();
33 warn "N $seqn d$val ends $x->{seqn} d$x->{depth}: size $x->{self_size}+$x->{kids_size}\n";
34 }
35 die 1 if $stack[$val];
36 my $node = $stack[$val] = { seqn => $seqn, name => $name, extra => $extra, attr => [], leaves => {}, depth => $val, self_size=>0, kids_size=>0 };
37 $seqn2node{$seqn} = $node;
38 }
39 elsif ($type eq "L") { # Leaf name and memory size
40 my $node = $seqn2node{$seqn} || die;
41 $node->{leaves}{$name} += $val;
42 }
43 elsif ($type eq "A") { # Attribute name and value
44 my $node = $seqn2node{$seqn} || die;
45 push @{ $node->{attr} }, $name, $val; # pairs
46 }
47 else {
48 warn "Invalid type '$type' on line $. ($_)";
49 }
50}
51
52my $x;
53while (@stack > 1) {
54 $x = pop_stack() while @stack;
55 warn "EOF ends $x->{seqn} d$x->{depth}: size $x->{self_size}+$x->{kids_size}\n";
56}
57use Data::Dumper;
58warn Dumper(\$x);
59warn Dumper(\%seqn2node);
60
61=for
62SV(PVAV) fill=1/1 [#1 @0]
63: +64 sv =64
64: +16 av_max =80
65: AVelem-> [#2 @1]
66: : SV(RV) [#3 @2]
67: : : +24 sv =104
68: : : RV-> [#4 @3]
69: : : : SV(PVAV) fill=-1/-1 [#5 @4]
70: : : : : +64 sv =168
71: AVelem-> [#6 @1]
72: : SV(IV) [#7 @2]
73: : : +24 sv =192
74192 at -e line 1.
75=cut
76__DATA__
77N 1 0 SV(PVAV) fill=1/1
78L 1 64 sv
79L 1 16 av_max
80N 2 1 AVelem->
81N 3 2 SV(RV)
82L 3 24 sv
83N 4 3 RV->
84N 5 4 SV(PVAV) fill=-1/-1
85L 5 64 sv
86N 6 1 AVelem->
87N 7 2 SV(IV)
88L 7 24 sv