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 61
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 140
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 88
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 75
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 105
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 71
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 112
def deco_file
  Setting[:fullpath] ? File.expand_path(file) : shortpath(file)
end
deco_method() click to toggle source
# File lib/byebug/frame.rb, line 79
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 119
def deco_pos
  format("%-2<pos>d", pos: 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.

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

  _binding.local_variables.each_with_object({}) do |e, a|
    a[e] = _binding.local_variable_get(e)
    a
  end
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 130
def mark
  return "-->" if current?
  return "    ͱ--" if c_frame?

  "   "
end
to_hash() click to toggle source
# File lib/byebug/frame.rb, line 144
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 157
def c_args
  return [] unless _self.to_s != "main"

  _class.instance_method(_method).parameters
end
prefix_and_default(arg_type) click to toggle source
# File lib/byebug/frame.rb, line 177
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 163
def ruby_args
  meth_name = _binding.eval("__method__")
  return [] unless meth_name

  meth_obj = _class.instance_method(meth_name)
  return [] unless meth_obj

  meth_obj.parameters
end
use_short_style?(arg) click to toggle source
# File lib/byebug/frame.rb, line 173
def use_short_style?(arg)
  Setting[:callstyle] == "short" || arg[1].nil? || locals.empty?
end