class StackProf::Report

def print_graphviz(filter = nil, f = STDOUT)

def print_graphviz(filter = nil, f = STDOUT)
  if filter
    mark_stack = []
    list = frames
    list.each{ |addr, frame| mark_stack << addr if frame[:name] =~ filter }
    while addr = mark_stack.pop
      frame = list[addr]
      unless frame[:marked]
        $stderr.puts frame[:edges].inspect
        mark_stack += frame[:edges].map{ |addr, weight| addr.to_s if list[addr.to_s][:total_samples] <= weight*1.2 }.compact if frame[:edges]
        frame[:marked] = true
      end
    end
    list = list.select{ |addr, frame| frame[:marked] }
    list.each{ |addr, frame| frame[:edges] && frame[:edges].delete_if{ |k,v| list[k.to_s].nil? } }
    list
  else
    list = frames
  end
  f.puts "digraph profile {"
  list.each do |frame, info|
    call, total = info.values_at(:samples, :total_samples)
    sample = ''
    sample << "#{call} (%2.1f%%)\\rof " % (call*100.0/overall_samples) if call < total
    sample << "#{total} (%2.1f%%)\\r" % (total*100.0/overall_samples)
    fontsize = (1.0 * call / max_samples) * 28 + 10
    size = (1.0 * total / overall_samples) * 2.0 + 0.5
    f.puts "  #{frame} [size=#{size}] [fontsize=#{fontsize}] [penwidth=\"#{size}\"] [shape=box] [label=\"#{info[:name]}\\n#{sample}\"];"
    if edges = info[:edges]
      edges.each do |edge, weight|
        size = (1.0 * weight / overall_samples) * 2.0 + 0.5
        f.puts "  #{frame} -> #{edge} [label=\"#{weight}\"] [weight=\"#{weight}\"] [penwidth=\"#{size}\"];"
      end
    end
  end
  f.puts "}"
end