Module: Trepan::Disassemble

Defined in:
app/disassemble.rb

Class Method Summary collapse

Class Method Details

.disassemble_split(disassembly_str) ⇒ Object



62
63
64
65
66
67
68
69
# File 'app/disassemble.rb', line 62

def disassemble_split(disassembly_str)
  dis_array = disassembly_str.split(/\n/)
  dis_hash  = {}
  dis_array.each do |line|
    dis_hash[$1.to_i] = line if line =~ /^(\d{4}) /
  end
  dis_hash
end

.mark_disassembly(disassembly_str, iseq_equal, pc_offset, brkpt_offsets = [], max_width = 80, highlight = nil) ⇒ Object

FIXME: turn final optional params into a hash.



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'app/disassemble.rb', line 10

def mark_disassembly(disassembly_str, iseq_equal, pc_offset,
                     brkpt_offsets=[], max_width=80, highlight=nil)

  dis_array = disassembly_str.split(/\n/)
  if highlight
    begin
      require_relative '../app/yarv'
      @highlighter ||= CodeRay::Duo[:yarv, :term]
    rescue LoadError
      dis_array.
        unshift('** Highlighting requested but CodeRay is not installed.')
      highlight = false
    end
  end

  dis_array.map do |line|
    if line =~ /^(.*?)(\s+)(\(\s+\d+\))?$/
      line_begin   = $1
      line_padding = $2
      line_end     = $3 || ''
    else
      line_begin   = line
      line_padding = ''
      line_end     = ''
    end
      
    prefix = 
      if line =~ /^(\d{4}) /
        offset = $1.to_i
        bp = brkpt_offsets && brkpt_offsets.member?(offset) ? 'B' : ' '
        bp + if offset == pc_offset && iseq_equal
          '--> '
        else
          '    '
        end
      else
        ''
      end
    line_size = prefix.size + line.size
    shrink_amount = line_size - max_width
    if (shrink_amount > 0) && line_padding.size > shrink_amount
      line_padding = ' ' * (line_padding.size - shrink_amount)
    end
    if highlight && prefix != ''
      prefix + @highlighter.encode(line_begin + line_padding + line_end)
    else
      prefix + line_begin + line_padding + line_end
    end
  end
end