class CodeMapper::Tracer

Public Class Methods

new(filters: [], output:) click to toggle source
# File lib/code_mapper/tracer.rb, line 3
def initialize(filters: [], output:)
  @filters = filters
  @output = output
end

Public Instance Methods

disable() click to toggle source
# File lib/code_mapper/tracer.rb, line 12
def disable
  tracer.disable
  @output.done
end
enable() click to toggle source
# File lib/code_mapper/tracer.rb, line 8
def enable
  tracer.enable
end

Private Instance Methods

tracer() click to toggle source
# File lib/code_mapper/tracer.rb, line 19
def tracer
  indent = ''

  @tracer ||= TracePoint.new(:call, :c_call, :return, :c_return) do |tp|
    normalized_class_name = tp.defined_class.to_s
      .sub(/\#<Class\:(.*)\>/, '\1')
      .sub(/\#<(.*)\:0x[0-f]+\>/, '\1')

    next if @filters.any?{ |filter| !filter.keep?(tp, normalized_class_name) }

    if tp.event == :call || tp.event == :c_call
      @output.push(tp, normalized_class_name)
    elsif tp.event == :return || tp.event == :c_return
      @output.pop(tp, normalized_class_name)
    end
  end
end