# 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