123456789_123456789_123456789_123456789_123456789_

Class: DEBUGGER__::Tracer

Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Subclasses:
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
Inherits: Object
Defined in: lib/debug/tracer.rb

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(ui, pattern: nil, into: nil) ⇒ Tracer

[ GitHub ]

  
# File 'lib/debug/tracer.rb', line 19

def initialize ui, pattern: nil, into: nil
  if /\ADEBUGGER__::(([A-Z][a-z]?)[A-Z][a-z])/ =~ self.class.name
    @name = $1
    @type = $2.downcase
  end

  setup

  if pattern
    @pattern = Regexp.compile(pattern)
  else
    @pattern = nil
  end

  if @into = into
    @output = File.open(into, 'w')
    @output.puts "PID:#{Process.pid} #{self}"
  else
    @output = ui
  end

  @key = [@type, @pattern, @into].freeze

  enable
end

Instance Attribute Details

#enabled?Boolean (readonly)

[ GitHub ]

  
# File 'lib/debug/tracer.rb', line 57

def enabled?
  @tracer.enabled?
end

#key (readonly)

[ GitHub ]

  
# File 'lib/debug/tracer.rb', line 17

attr_reader :type, :key

#type (readonly)

[ GitHub ]

  
# File 'lib/debug/tracer.rb', line 17

attr_reader :type, :key

Instance Method Details

#colorize(str, color)

[ GitHub ]

  
# File 'lib/debug/tracer.rb', line 8

def colorize(str, color)
  # don't colorize trace sent into a file
  if @into
    str
  else
    super
  end
end

#description

[ GitHub ]

  
# File 'lib/debug/tracer.rb', line 61

def description
  nil
end

#disable

[ GitHub ]

  
# File 'lib/debug/tracer.rb', line 53

def disable
  @tracer.disable
end

#enable

[ GitHub ]

  
# File 'lib/debug/tracer.rb', line 49

def enable
  @tracer.enable
end

#header(depth)

[ GitHub ]

  
# File 'lib/debug/tracer.rb', line 45

def header depth
  "DEBUGGER (trace/#{@type}) \#th:#{Thread.current.instance_variable_get(:@__thread_client_id)} \#depth:#{'%-2d'%depth}"
end

#minfo(tp)

[ GitHub ]

  
# File 'lib/debug/tracer.rb', line 92

def minfo tp
  return "block{}" if tp.event == :b_call

  klass = tp.defined_class

  if klass.singleton_class?
    "#{tp.self}.#{tp.method_id}"
  else
    "#{klass}\##{tp.method_id}"
  end
end

#out(tp, msg = nil, depth = caller.size - 1)

[ GitHub ]

  
# File 'lib/debug/tracer.rb', line 80

def out tp, msg = nil, depth = caller.size - 1
  location_str = colorize("#{FrameInfo.pretty_path(tp.path)}:#{tp.lineno}", [:GREEN])
  buff = "#{header(depth)}#{msg} at #{location_str}"

  if false # TODO: Ractor.main?
    ThreadClient.current.on_trace self.object_id, buff
  else
    @output.puts buff
    @output.flush
  end
end

#skip?(tp) ⇒ Boolean

[ GitHub ]

  
# File 'lib/debug/tracer.rb', line 72

def skip? tp
  ThreadClient.current.management? || skip_path?(tp.path) || skip_with_pattern?(tp)
end

#skip_with_pattern?(tp) ⇒ Boolean

[ GitHub ]

  
# File 'lib/debug/tracer.rb', line 76

def skip_with_pattern?(tp)
  @pattern && !tp.path.match?(@pattern)
end

#to_s

[ GitHub ]

  
# File 'lib/debug/tracer.rb', line 65

def to_s
  s = "#{@name}#{description} (#{@tracer.enabled? ? 'enabled' : 'disabled'})"
  s += " with pattern #{@pattern.inspect}" if @pattern
  s += " into: #{@into}" if @into
  s
end