Sha256: 2fc6cb4eea7339270557866f70905d5daa386192fe89e5dffd2e80a3a7636730

Contents?: true

Size: 1.75 KB

Versions: 4

Compression:

Stored size: 1.75 KB

Contents

# Copyright (C) 2011 Rocky Bernstein <rockyb@rubyforge.net>
require 'rubygems'; require 'require_relative'
require_relative '../app/iseq'
require_relative 'virtual'

class Trepan::CmdProcessor < Trepan::VirtualCmdProcessor

  def show_bytecode(line=@frame.vm_location.line, ip=@frame.next_ip)
    meth = @frame.method
    if 0 == line 
      start, fin = Trepan::ISeq::ip_ranges_for_ip(@frame.method.lines, ip)[0]
    else
      start = meth.first_ip_on_line(line)
      unless start
        errmsg "Can't find bytecode for line #{line}"
        return
      end
      fin = meth.first_ip_on_line(line+1)
    end
    
    if !fin || fin == -1
      fin = meth.iseq.size
    end
    
    start += 1 if start == -1
    suffix = 
      if 0 == line 
        "tail code before line #{Trepan::ISeq::tail_code_line(meth, ip)}"
      else
        "line #{line}"
      end
    section "Bytecode between #{start} and #{fin-1} for line #{suffix}"
    
    iseq_decoder = Rubinius::InstructionDecoder.new(meth.iseq)
    partial = iseq_decoder.decode_between(start, fin)
    
    ip = start
    
    prefixes = []
    disasm = partial.inject('') do |result, ins|
      inst = Rubinius::CompiledMethod::Instruction.new(ins, meth, ip)
      prefixes << Trepan::ISeq::disasm_prefix(ip, frame.next_ip, meth)
      ip += ins.size
      result += "#{inst}\n"
    end
    
    # FIXME DRY with command/disassemble.rb
    if @settings[:highlight]
      require_relative '../app/rbx-llvm'
      @llvm_highlighter = CodeRay::Duo[:llvm, :term]
      # llvm_scanner = CodeRay.scanner :llvm
      # p llvm_scanner.tokenize(disasm)
      disasm = @llvm_highlighter.encode(disasm)
    end
    disasm.split("\n").each_with_index do |inst, i|
      msg "#{prefixes[i]} #{inst}", :unlimited => true
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
rbx-trepanning-0.2.1-universal-rubinius-2.0 processor/disassemble.rb
rbx-trepanning-0.2.1-universal-rubinius-1.2 processor/disassemble.rb
rbx-trepanning-0.2.0-universal-rubinius-2.0 processor/disassemble.rb
rbx-trepanning-0.1.0-universal-rubinius-1.2 processor/disassemble.rb