Sha256: cfc421719b915c86c3a8e1fa794253f65e172db138817c83a8408537e8229b4b

Contents?: true

Size: 1.86 KB

Versions: 2

Compression:

Stored size: 1.86 KB

Contents

module SourceRoute

  class TpResultChain
    extend Forwardable
    def_delegators :@chain, :each, :index, :first, :last, :size, :push, :values_at, :pop, :[]

    include Enumerable

    def initialize
      @chain = []
    end

    def call_chain
      select { |tpr| tpr[:event] == :call }
    end

    def return_chain
      select { |tpr| tpr[:event] == :return }
    end

    def import_return_value_to_call_chain
      call_chain.each do |ctp|
        matched_return_tp = return_chain.detect do |rtp|
          rtp[:tp_self] == ctp[:tp_self] and rtp[:method_id] == ctp[:method_id] and rtp[:defined_class] == ctp[:defined_class]
        end
        ctp[:return_value] = matched_return_tp[:return_value]
        ctp[:local_var] = matched_return_tp[:local_var] if matched_return_tp.key? :local_var
        ctp[:instance_var] = matched_return_tp[:instance_var] if matched_return_tp.key? :instance_var
      end
    end

    def treeize_call_chain
      init_order_id_and_parent_ids
      call_chain.each do |tpr|
        return_tpr = return_chain.find do |rtpr|
          rtpr[:defined_class] == tpr[:defined_class] and rtpr[:method_id] == tpr[:method_id]
        end

        start_index, end_index = tpr[:order_id], return_tpr[:order_id]
        unless end_index == start_index + 1
          values_at(start_index+1 ... end_index).select { |tpr| tpr[:event] == :call }.each do |tpr|
            tpr[:parent_ids].push start_index
          end
        end
      end

      cal_parent_length
    end

    def parent_length_list
      call_chain.map { |tp| tp[:parent_length] }.uniq.sort
    end

    private
    def init_order_id_and_parent_ids
      each_with_index do |tpr, index|
        tpr[:order_id], tpr[:parent_ids] = index, []
      end
    end

    def cal_parent_length
      each do |tpr|
        tpr[:parent_length] = tpr[:parent_ids].length
      end
    end

  end # END TpResultChain
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
source_route-0.1.4 lib/source_route/tp_result_chain.rb
source_route-0.1.3 lib/source_route/tp_result_chain.rb