class MrbParser::DebugInfo

Constants

LINE_TYPE
MRB_DEBUG_LINE_ARY
MRB_DEBUG_LINE_FLAT_MAP

Attributes

debug_section[RW]
files[RW]
infos[R]
irep_record[RW]
pc_count[RW]

Public Class Methods

new(debug_section, irep_record) click to toggle source
# File lib/mrb_parser/debug_info.rb, line 15
def initialize(debug_section, irep_record)
  @debug_section = debug_section
  @irep_record = irep_record
  irep_record.debug_info = self
  @infos = []
end

Public Instance Methods

dump(n = 2) click to toggle source
# File lib/mrb_parser/debug_info.rb, line 65
def dump(n = 2)
  printf_indent n, "*** DEBUG INFO ***\n"
  printf_indent n, "count: %d\n", @pc_count
  printf_indent n, "files: %d\n", @files.size
  @files.map{|file| file.dump(n+2)}
  @infos.each do |debug_info|
    debug_info.dump(n + 2)
  end
  printf_indent n, "*** ***\n"
end
parse_record(parser) click to toggle source
# File lib/mrb_parser/debug_info.rb, line 22
def parse_record(parser)
  @pc_count = parser.read_uint32
  flen = parser.read_uint16
  @files = []
  flen.times do
    file = DebugInfoFile.new
    @files << file
    file.start_pos = parser.read_uint32
    filename_idx = parser.read_uint16
    file.filename = @debug_section.filenames[filename_idx]

    file.line_entry_count = parser.read_uint32
    file.line_type = parser.read_uint8
    case file.line_type
    when MRB_DEBUG_LINE_ARY ## 0
      file.line_ary = []
      file.line_entry_count.times do
        file.line_ary << parser.read_uint16
      end
    when MRB_DEBUG_LINE_FLAT_MAP ## 1
      file.line_flat_map = []
      file.line_entry_count.times do
        start_pos = parser.read_uint32
        line = parser.read_uint16
        file.line_flat_map << {start_pos: start_pos, line: line}
      end
    else
      raise
    end
  end
  @irep_record.recs.each do |irep_record|
    info = MrbParser::DebugInfo.new(@debug_section, irep_record)
    @infos << info
    info.parse_record(parser)
  end
  self
end
printf_indent(n, *args) click to toggle source
# File lib/mrb_parser/debug_info.rb, line 60
def printf_indent(n, *args)
  print " "*n
  printf *args
end