class Byebug::Frame

Represents a frame in the stack trace

Attributes

pos[R]

Public Class Methods

new(context, pos) click to toggle source
# File lib/byebug/frame.rb, line 13
def initialize(context, pos)
  @context = context
  @pos = pos
end

Public Instance Methods

_binding() click to toggle source
# File lib/byebug/frame.rb, line 30
def _binding
  @context.frame_binding(pos)
end
_class() click to toggle source
# File lib/byebug/frame.rb, line 34
def _class
  @context.frame_class(pos)
end
_method() click to toggle source
# File lib/byebug/frame.rb, line 38
def _method
  @context.frame_method(pos)
end
_self() click to toggle source
# File lib/byebug/frame.rb, line 26
def _self
  @context.frame_self(pos)
end
args() click to toggle source

Gets current method arguments for the frame.

# File lib/byebug/frame.rb, line 60
def args
  return c_args unless _binding

  ruby_args
end
c_frame?() click to toggle source

Checks whether the frame is a c-frame

# File lib/byebug/frame.rb, line 139
def c_frame?
  _binding.nil?
end
current?() click to toggle source
# File lib/byebug/frame.rb, line 42
def current?
  @context.frame.pos == pos
end
deco_args() click to toggle source

Builds a string containing all available args in the frame number, in a verbose or non verbose way according to the value of the callstyle setting

# File lib/byebug/frame.rb, line 87
def deco_args
  return '' if args.empty?

  my_args = args.map do |arg|
    prefix, default = prefix_and_default(arg[0])

    kls = use_short_style?(arg) ? '' : "##{locals[arg[1]].class}"

    "#{prefix}#{arg[1] || default}#{kls}"
  end

  "(#{my_args.join(', ')})"
end
deco_block() click to toggle source
# File lib/byebug/frame.rb, line 74
def deco_block
  _method[/(?:block(?: \(\d+ levels\))?|rescue) in /] || ''
end
deco_call() click to toggle source

Builds a formatted string containing information about current method call

# File lib/byebug/frame.rb, line 104
def deco_call
  deco_block + deco_class + deco_method + deco_args
end
deco_class() click to toggle source

Returns the current class in the frame or an empty string if the current callstyle setting is 'short'

# File lib/byebug/frame.rb, line 70
def deco_class
  Setting[:callstyle] == 'short' || _class.to_s.empty? ? '' : "#{_class}."
end
deco_file() click to toggle source

Formatted filename in frame

# File lib/byebug/frame.rb, line 111
def deco_file
  Setting[:fullpath] ? File.expand_path(file) : shortpath(file)
end
deco_method() click to toggle source
# File lib/byebug/frame.rb, line 78
def deco_method
  _method[/((?:block(?: \(\d+ levels\))?|rescue) in )?(.*)/]
end
deco_pos() click to toggle source

Properly formatted frame number of frame

# File lib/byebug/frame.rb, line 118
def deco_pos
  format('%-2d', pos)
end
file() click to toggle source
# File lib/byebug/frame.rb, line 18
def file
  @context.frame_file(pos)
end
line() click to toggle source
# File lib/byebug/frame.rb, line 22
def line
  @context.frame_line(pos)
end
locals() click to toggle source

Gets local variables for the frame.

TODO: Use brand new local_variable_{get,set,defined?} for rubies >= 2.1

# File lib/byebug/frame.rb, line 51
def locals
  return [] unless _binding

  _binding.eval('local_variables.inject({}){|h, v| h[v] = eval(v.to_s); h}')
end
mark() click to toggle source

Formatted mark for the frame.

–> marks the current frame ͱ– marks c-frames

marks regular frames
# File lib/byebug/frame.rb, line 129
def mark
  return '-->' if current?
  return '    ͱ--' if c_frame?

  '   '
end
to_hash() click to toggle source
# File lib/byebug/frame.rb, line 143
def to_hash
  {
    mark: mark,
    pos: deco_pos,
    call: deco_call,
    file: deco_file,
    line: line,
    full_path: File.expand_path(deco_file)
  }
end

Private Instance Methods

c_args() click to toggle source
# File lib/byebug/frame.rb, line 156
def c_args
  return [] unless _self.to_s != 'main'

  _self.method(_method).parameters
end
prefix_and_default(arg_type) click to toggle source
# File lib/byebug/frame.rb, line 173
def prefix_and_default(arg_type)
  return ['&', 'block'] if arg_type == :block
  return ['*', 'args'] if arg_type == :rest

  ['', nil]
end
ruby_args() click to toggle source
# File lib/byebug/frame.rb, line 162
def ruby_args
  return [] unless _binding.eval('__method__')
  return [] unless _binding.eval('method(__method__)')

  _binding.eval('method(__method__).parameters')
end
use_short_style?(arg) click to toggle source
# File lib/byebug/frame.rb, line 169
def use_short_style?(arg)
  Setting[:callstyle] == 'short' || arg[1].nil? || locals.empty?
end