module TraceLineNumbers

$Id$

Public Class Methods

lnums_for_file(file) click to toggle source
# File lib/tracelines19.rb, line 23
def lnums_for_file(file)
  lnums_for_str(File.read(file))
end
lnums_for_str(src) click to toggle source

Return an array of lines numbers that could be stopped at given a file name of a Ruby program.

# File lib/tracelines19.rb, line 7
def self.lnums_for_str src
  name = "#{Time.new.to_i}_#{rand(2**31)}"
  iseq = RubyVM::InstructionSequence.compile(src, name)
  lines = {}
  iseq.disasm.each_line{|line|
    if /^\d+ (\w+)\s+.+\(\s*(\d+)\)$/ =~ line
      insn = $1
      lineno = $2.to_i
      next unless insn == 'trace'
      lines[lineno] = true
      # p [lineno, line]
    end
  }
  lines.keys
end
lnums_for_str_array(string_array, newline='') click to toggle source

Return an array of lines numbers that could be stopped at given a file name of a Ruby program. We assume the each line has n at the end. If not set the newline parameters to n.

# File lib/tracelines19.rb, line 32
def lnums_for_str_array(string_array, newline='')
  lnums_for_str(string_array.join(newline))
end

Private Instance Methods

lnums_for_file(file) click to toggle source
# File lib/tracelines19.rb, line 23
def lnums_for_file(file)
  lnums_for_str(File.read(file))
end
lnums_for_str_array(string_array, newline='') click to toggle source

Return an array of lines numbers that could be stopped at given a file name of a Ruby program. We assume the each line has n at the end. If not set the newline parameters to n.

# File lib/tracelines19.rb, line 32
def lnums_for_str_array(string_array, newline='')
  lnums_for_str(string_array.join(newline))
end