Class Tracer
In: tracer.rb
Parent: Object

tracer main class

Methods

Constants

MY_FILE_NAME = caller(0)[0].scan(/^(.*):[0-9]+$/)[0][0]
EVENT_SYMBOL = { "line" => "-", "call" => ">", "return" => "<", "class" => "C", "end" => "E", "c-call" => ">", "c-return" => "<", }
Single = new

External Aliases

verbose -> verbose?

Attributes

stdout  [RW] 
verbose  [RW] 

Public Class methods

[Source]

# File tracer.rb, line 151
  def Tracer.add_filter(p = proc)
    Single.add_filter(p)
  end

[Source]

# File tracer.rb, line 39
  def initialize
    @threads = Hash.new
    if defined? Thread.main
      @threads[Thread.main.object_id] = 0
    else
      @threads[Thread.current.object_id] = 0
    end

    @get_line_procs = {}

    @filters = []
  end

[Source]

# File tracer.rb, line 143
  def Tracer.off
    Single.off
  end

[Source]

# File tracer.rb, line 135
  def Tracer.on
    if block_given?
      Single.on{yield}
    else
      Single.on
    end
  end

[Source]

# File tracer.rb, line 147
  def Tracer.set_get_line_procs(file_name, p = proc)
    Single.set_get_line_procs(file_name, p)
  end

Public Instance methods

[Source]

# File tracer.rb, line 75
  def add_filter(p = proc)
    @filters.push p
  end

[Source]

# File tracer.rb, line 83
  def get_line(file, line)
    if p = @get_line_procs[file]
      return p.call(line)
    end

    unless list = SCRIPT_LINES__[file]
      begin
        f = open(file)
        begin 
          SCRIPT_LINES__[file] = list = f.readlines
        ensure
          f.close
        end
      rescue
        SCRIPT_LINES__[file] = list = []
      end
    end
    if l = list[line - 1]
      l
    else
      "-\n"
    end
  end

[Source]

# File tracer.rb, line 107
  def get_thread_no
    if no = @threads[Thread.current.object_id]
      no
    else
      @threads[Thread.current.object_id] = @threads.size
    end
  end

[Source]

# File tracer.rb, line 70
  def off
    set_trace_func nil
    stdout.print "Trace off\n" if Tracer.verbose?
  end

[Source]

# File tracer.rb, line 56
  def on
    if block_given?
      on
      begin
        yield
      ensure
        off
      end
    else
      set_trace_func method(:trace_func).to_proc
      stdout.print "Trace on\n" if Tracer.verbose?
    end
  end

[Source]

# File tracer.rb, line 79
  def set_get_line_procs(file, p = proc)
    @get_line_procs[file] = p
  end

[Source]

# File tracer.rb, line 52
  def stdout
    Tracer.stdout
  end

[Source]

# File tracer.rb, line 115
  def trace_func(event, file, line, id, binding, klass, *)
    return if file == MY_FILE_NAME
    
    for p in @filters
      return unless p.call event, file, line, id, binding, klass
    end
    
    saved_crit = Thread.critical
    Thread.critical = true
    stdout.printf("#%d:%s:%d:%s:%s: %s",
      get_thread_no,
      file,
      line,
      klass || '',
      EVENT_SYMBOL[event],
      get_line(file, line))
    Thread.critical = saved_crit
  end

[Validate]