module Byebug::FrameFunctions

def adjust_frame(frame, absolute)

def adjust_frame(frame, absolute)
  if absolute
    abs_frame = switch_to_frame(frame)
    return errmsg(pr('frame.errors.c_frame')) if @state.c_frame?(abs_frame)
  else
    abs_frame = navigate_to_frame(frame)
  end
  if abs_frame >= @state.context.stack_size
    return errmsg(pr('frame.errors.too_low'))
  elsif abs_frame < 0
    return errmsg(pr('frame.errors.too_high'))
  end
  @state.frame = abs_frame
  @state.file = @state.context.frame_file(@state.frame)
  @state.line = @state.context.frame_line(@state.frame)
  @state.prev_line = nil
  ListCommand.new(@state).execute if Setting[:autolist]
end

def get_pr_arguments(frame_no)

def get_pr_arguments(frame_no)
  file = @state.frame_file(frame_no)
  line = @state.frame_line(frame_no)
  call = @state.frame_call(frame_no)
  mark = @state.frame_mark(frame_no)
  pos = @state.frame_pos(frame_no)
  { mark: mark, pos: pos, call: call, file: file, line: line }
end

def navigate_to_frame(jump_no)

def navigate_to_frame(jump_no)
  return if jump_no == 0
  total_jumps, current_jumps, new_pos = jump_no.abs, 0, @state.frame
  step = jump_no / total_jumps # +1 (up) or -1 (down)
  loop do
    new_pos += step
    break if new_pos < 0 || new_pos >= @state.context.stack_size
    next if @state.c_frame?(new_pos)
    current_jumps += 1
    break if current_jumps == total_jumps
  end
  new_pos
end

def switch_to_frame(frame_no)

def switch_to_frame(frame_no)
  frame_no >= 0 ? frame_no : @state.context.stack_size + frame_no
end