class RubyVM::RJIT::JITState
Public Class Methods
new(side_exits: {}, record_boundary_patch_point: false, **)
click to toggle source
Calls superclass method
# File lib/ruby_vm/rjit/jit_state.rb, line 10 def initialize(side_exits: {}, record_boundary_patch_point: false, **) = super def insn Compiler.decode_insn(C.VALUE.new(pc).*) end def operand(index, signed: false, ruby: false) addr = pc + (index + 1) * Fiddle::SIZEOF_VOIDP value = Fiddle::Pointer.new(addr)[0, Fiddle::SIZEOF_VOIDP].unpack(signed ? 'q' : 'Q')[0] if ruby value = C.to_ruby(value) end value end def at_current_insn? pc == cfp.pc.to_i end def peek_at_stack(depth_from_top) raise 'not at current insn' unless at_current_insn? offset = -(1 + depth_from_top) # rb_rjit_branch_stub_hit updates SP, so you don't need to worry about sp_offset value = (cfp.sp + offset).* C.to_ruby(value) end def peek_at_self C.to_ruby(cfp.self) end def peek_at_block_handler(level) ep = ep_at_level(cfp, level:) ep[C::VM_ENV_DATA_INDEX_SPECVAL] end private def ep_at_level(cfp, level:) ep = cfp.ep level.times do # VM_ENV_PREV_EP ep = C.VALUE.new(ep[C::VM_ENV_DATA_INDEX_SPECVAL] & ~0x03) end ep end end
Public Instance Methods
at_current_insn?()
click to toggle source
# File lib/ruby_vm/rjit/jit_state.rb, line 25 def at_current_insn? pc == cfp.pc.to_i end
ep_at_level(cfp, level:)
click to toggle source
# File lib/ruby_vm/rjit/jit_state.rb, line 48 def ep_at_level(cfp, level:) ep = cfp.ep level.times do # VM_ENV_PREV_EP ep = C.VALUE.new(ep[C::VM_ENV_DATA_INDEX_SPECVAL] & ~0x03) end ep end
insn()
click to toggle source
# File lib/ruby_vm/rjit/jit_state.rb, line 12 def insn Compiler.decode_insn(C.VALUE.new(pc).*) end
operand(index, signed: false, ruby: false)
click to toggle source
# File lib/ruby_vm/rjit/jit_state.rb, line 16 def operand(index, signed: false, ruby: false) addr = pc + (index + 1) * Fiddle::SIZEOF_VOIDP value = Fiddle::Pointer.new(addr)[0, Fiddle::SIZEOF_VOIDP].unpack(signed ? 'q' : 'Q')[0] if ruby value = C.to_ruby(value) end value end
peek_at_block_handler(level)
click to toggle source
# File lib/ruby_vm/rjit/jit_state.rb, line 41 def peek_at_block_handler(level) ep = ep_at_level(cfp, level:) ep[C::VM_ENV_DATA_INDEX_SPECVAL] end
peek_at_self()
click to toggle source
# File lib/ruby_vm/rjit/jit_state.rb, line 37 def peek_at_self C.to_ruby(cfp.self) end
peek_at_stack(depth_from_top)
click to toggle source
# File lib/ruby_vm/rjit/jit_state.rb, line 29 def peek_at_stack(depth_from_top) raise 'not at current insn' unless at_current_insn? offset = -(1 + depth_from_top) # rb_rjit_branch_stub_hit updates SP, so you don't need to worry about sp_offset value = (cfp.sp + offset).* C.to_ruby(value) end