class Dwarftree::TreeVisualizer

Constants

KiB
MiB

Public Class Methods

new(show_size:, sort_size:) click to toggle source

@param [TrueClass,FalseClass] show_size @param [TrueClass,FalseClass] sort_size

# File lib/dwarftree/tree_visualizer.rb, line 7
def initialize(show_size:, sort_size:)
  @show_size = show_size
  @sort_size = sort_size
end

Public Instance Methods

visualize(nodes) click to toggle source

@param [Array<Dwarftree::DIE::*>] nodes

# File lib/dwarftree/tree_visualizer.rb, line 13
def visualize(nodes)
  sort(nodes).each do |node|
    visualize_node(node)
  end
end

Private Instance Methods

human_size(size) click to toggle source
# File lib/dwarftree/tree_visualizer.rb, line 50
def human_size(size)
  if size > MiB
    "%.1fM" % (size.to_f / MiB)
  elsif size > KiB
    "%.1fK" % (size.to_f / KiB)
  else
    size
  end
end
node_attributes(node) click to toggle source
# File lib/dwarftree/tree_visualizer.rb, line 32
def node_attributes(node)
  attrs = node.attributes.map do |attr, value|
    "#{attr}: #{value}"
  end
  return '' if attrs.empty?
  "(#{attrs.join(', ')})"
end
node_code_size(node) click to toggle source
# File lib/dwarftree/tree_visualizer.rb, line 40
def node_code_size(node)
  size = node.merged.map { |n| node_code_size(n) }.compact.sum
  if node.respond_to?(:ranges) && node.ranges
    size += node.ranges.map { |range| range.end - range.begin }.sum
  elsif node.respond_to?(:high_pc) && node.high_pc
    size += node.high_pc.to_i(16) # surprisingly low_pc is not needed to know code size
  end
  size
end
sort(nodes) click to toggle source
# File lib/dwarftree/tree_visualizer.rb, line 60
def sort(nodes)
  if @sort_size
    nodes.sort_by { |node| -(node_code_size(node) || 0) }
  else
    nodes
  end
end
visualize_node(node, depth: 0) click to toggle source

@param [Dwarftree::DIE::*] node

# File lib/dwarftree/tree_visualizer.rb, line 22
def visualize_node(node, depth: 0)
  size = node_code_size(node)
  print "#{'  ' * depth}#{node.type}"
  puts "#{(" size=#{human_size(size)}" if @show_size && size > 0)} #{node_attributes(node)}"

  sort(node.children).each do |child|
    visualize_node(child, depth: depth + 1)
  end
end