class DEBUGGER__::FrameInfo

Constants

BLOCK_LABL_REGEXP
HOME

Public Class Methods

pretty_path(path) click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 30
def self.pretty_path path
  return '#<none>' unless path
  use_short_path = CONFIG[:use_short_path]

  case
  when use_short_path && path.start_with?(dir = RbConfig::CONFIG["rubylibdir"] + '/')
    path.sub(dir, '$(rubylibdir)/')
  when use_short_path && Gem.path.any? do |gp|
      path.start_with?(dir = gp + '/gems/')
    end
    path.sub(dir, '$(Gem)/')
  when HOME && path.start_with?(HOME)
    path.sub(HOME, '~/')
  else
    path
  end
end

Public Instance Methods

block_identifier() click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 87
def block_identifier
  return unless frame_type == :block
  _, level, block_loc = location.label.match(BLOCK_LABL_REGEXP).to_a
  [level || "", block_loc]
end
c_identifier() click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 98
def c_identifier
  return unless frame_type == :c
  "[C] #{klass_sig}#{location.base_label}"
end
callee() click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 108
def callee
  self._callee ||= begin
                     self.binding&.eval('__callee__')
                   rescue NameError # BasicObject
                     nil
                   end
end
eval_binding() click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 131
def eval_binding
  if b = self.dupped_binding
    b
  else
    b = self.binding || TOPLEVEL_BINDING
    self.dupped_binding = b.dup
  end
end
file_lines() click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 67
def file_lines
  SESSION.source(self.iseq)
end
frame_type() click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 71
def frame_type
  if self.local_variables && iseq
    if iseq.type == :block
      :block
    elsif callee
      :method
    else
      :other
    end
  else
    :c
  end
end
iseq_parameters_info() click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 150
def iseq_parameters_info
  case frame_type
  when :block, :method
    parameters_info
  else
    nil
  end
end
local_variables() click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 140
def local_variables
  if lvars = self._local_variables
    lvars
  elsif b = self.binding
    b.local_variables.map{|var|
      [var, b.local_variable_get(var)]
    }.to_h
  end
end
location_str() click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 127
def location_str
  "#{pretty_path}:#{location.lineno}"
end
matchable_location() click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 122
def matchable_location
  # realpath can sometimes be nil so we can't use it here
  "#{path}:#{location.lineno}"
end
method_identifier() click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 93
def method_identifier
  return unless frame_type == :method
  "#{klass_sig}#{callee}"
end
name() click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 52
def name
  # p frame_type: frame_type, self: self
  case frame_type
  when :block
    level, block_loc = block_identifier
    "block in #{block_loc}#{level}"
  when :method
    method_identifier
  when :c
    c_identifier
  when :other
    other_identifier
  end
end
other_identifier() click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 103
def other_identifier
  return unless frame_type == :other
  location.label
end
parameters_info() click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 159
def parameters_info
  vars = iseq.parameters_symbols
  vars.map{|var|
    begin
      { name: var, value: DEBUGGER__.safe_inspect(local_variable_get(var), short: true) }
    rescue NameError, TypeError
      nil
    end
  }.compact
end
path() click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 22
def path
  location.path
end
pretty_path() click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 48
def pretty_path
  FrameInfo.pretty_path path
end
realpath() click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 26
def realpath
  location.absolute_path
end
return_str() click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 116
def return_str
  if self.binding && iseq && has_return_value
    DEBUGGER__.safe_inspect(return_value, short: true)
  end
end

Private Instance Methods

get_singleton_class(obj) click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 170
        def get_singleton_class obj
  obj.singleton_class # TODO: don't use it
rescue TypeError
  nil
end
klass_sig() click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 180
        def klass_sig
  if self.class == get_singleton_class(self.self)
    "#{self.self}."
  else
    "#{self.class}#"
  end
end
local_variable_get(var) click to toggle source
# File debug-1.9.1/lib/debug/frame_info.rb, line 176
        def local_variable_get var
  local_variables[var]
end