# Tracer (Class)

In: | tracer.rb
Parent: | Object

tracer main class

## Methods

add_filter add_filter get_line get_thread_no new off off on on set_get_line_procs set_get_line_procs stdout trace_func

## 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

new()

[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

on() {|}| ...}

[Source]

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

off()

[Source]

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

set_get_line_procs(file_name, p = proc)

[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

add_filter(p = proc)

[Source]

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

## Public Instance methods

stdout()

[Source]

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

on() {|| ...}

[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

off()

[Source]

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

add_filter(p = proc)

[Source]

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

set_get_line_procs(file, p = proc)

[Source]

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

get_line(file, line)

[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

get_thread_no()

[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

trace_func(event, file, line, id, binding, klass, *)

[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]