# module Byebug::Helpers::FrameHelper

Utilities to assist frame navigation

### Public Instance Methods

jump_frames(steps) click to toggle source

    # File lib/byebug/helpers/frame.rb, line 16
    def jump_frames(steps)
      adjust_frame(navigate_to_frame(steps))
    end

switch_to_frame(frame) click to toggle source

    # File lib/byebug/helpers/frame.rb, line 9
    def switch_to_frame(frame)
      new_frame = index_from_start(frame)
      return frame_err("c_frame") if Frame.new(context, new_frame).c_frame?

      adjust_frame(new_frame)
    end

### Private Instance Methods

adjust_frame(new_frame) click to toggle source

    # File lib/byebug/helpers/frame.rb, line 22
    def adjust_frame(new_frame)
      return frame_err("too_low") if new_frame >= context.stack_size
      return frame_err("too_high") if new_frame.negative?

      context.frame = new_frame
      processor.prev_line = nil
    end

direction(step) click to toggle source

@param step [Integer] A positive or negative integer

@return [Integer] +1 if step is positive / -1 if negative

    # File lib/byebug/helpers/frame.rb, line 60
    def direction(step)
      step / step.abs
    end

frame_err(msg) click to toggle source

    # File lib/byebug/helpers/frame.rb, line 51
    def frame_err(msg)
      errmsg(pr("frame.errors.#{msg}"))
    end

index_from_start(index) click to toggle source

Convert a possibly negative index to a positive index from the start of the callstack. -1 is the last position in the stack and so on.

@param i [Integer] Integer to be converted in a proper positive index.

    # File lib/byebug/helpers/frame.rb, line 70
    def index_from_start(index)
      index >= 0 ? index : context.stack_size + index
    end

navigate_to_frame(jump_no) click to toggle source

    # File lib/byebug/helpers/frame.rb, line 30
    def navigate_to_frame(jump_no)
      current_jumps = 0
      current_pos = context.frame.pos

      loop do
        current_pos += direction(jump_no)
        break if out_of_bounds?(current_pos)

        next if Frame.new(context, current_pos).c_frame?

        current_jumps += 1
        break if current_jumps == jump_no.abs
      end

      current_pos
    end

out_of_bounds?(pos) click to toggle source

    # File lib/byebug/helpers/frame.rb, line 47
    def out_of_bounds?(pos)
      !(0...context.stack_size).cover?(pos)
    end