class RubyProf::CallInfo

Attributes

recursive[RW]

Public Instance Methods

call_sequence() click to toggle source
# File lib/ruby-prof/call_info.rb, line 25
def call_sequence
  @call_sequence ||= begin
    stack.map {|method| method.full_name}.join('->')
  end
end
children_time() click to toggle source
# File lib/ruby-prof/call_info.rb, line 6
def children_time
  children.inject(0) do |sum, call_info|
    sum += call_info.total_time
  end
end
eliminate!() click to toggle source

eliminate call info from the call tree. adds self and wait time to parent and attaches called methods to parent. merges call trees for methods called from both praent end self.

# File lib/ruby-prof/call_info.rb, line 42
def eliminate!
  # puts "eliminating #{self}"
  return unless parent
  parent.add_self_time(self)
  parent.add_wait_time(self)
  children.each do |kid|
    if call = parent.find_call(kid)
      call.merge_call_tree(kid)
    else
      parent.children << kid
      # $stderr.puts "setting parent of #{kid}\nto #{parent}"
      kid.parent = parent
    end
  end
  parent.children.delete(self)
end
find_call(other) click to toggle source

find a specific call in list of children. returns nil if not found. note: there can't be more than one child with a given target method. in other words: x.children.grep{|y|y.target==m}.size <= 1 for all method infos m and call infos x

# File lib/ruby-prof/call_info.rb, line 62
def find_call(other)
  matching = children.select { |kid| kid.target == other.target }
  raise "inconsistent call tree" unless matching.size <= 1
  matching.first
end
merge_call_tree(other) click to toggle source

merge two call trees. adds self, wait, and total time of other to self and merges children of other into children of self.

# File lib/ruby-prof/call_info.rb, line 69
def merge_call_tree(other)
  # $stderr.puts "merging #{self}\nand #{other}"
  self.called += other.called
  add_self_time(other)
  add_wait_time(other)
  add_total_time(other)
  other.children.each do |other_kid|
    if kid = find_call(other_kid)
      # $stderr.puts "merging kids"
      kid.merge_call_tree(other_kid)
    else
      other_kid.parent = self
      children << other_kid
    end
  end
  other.children.clear
  other.target.call_infos.delete(other)
end
root?() click to toggle source
# File lib/ruby-prof/call_info.rb, line 31
def root?
  self.parent.nil?
end
stack() click to toggle source
# File lib/ruby-prof/call_info.rb, line 12
def stack
  @stack ||= begin
    methods = Array.new
    call_info = self

    while call_info
      methods << call_info.target
      call_info = call_info.parent
    end
    methods.reverse
  end
end
to_s() click to toggle source
# File lib/ruby-prof/call_info.rb, line 35
def to_s
  "#{self.target.full_name} (c: #{self.called}, tt: #{self.total_time}, st: #{self.self_time}, ct: #{self.children_time})"
end