class Byebug::Breakpoint

Implements breakpoints

Public Class Methods

add(file, line, expr = nil) click to toggle source

Adds a new breakpoint

@param [String] file @param [Fixnum] line @param [String] expr

# File lib/byebug/breakpoint.rb, line 28
def self.add(file, line, expr = nil)
  breakpoint = Breakpoint.new(file, line, expr)
  Byebug.breakpoints << breakpoint
  breakpoint
end
first() click to toggle source

First breakpoint, in order of creation

# File lib/byebug/breakpoint.rb, line 10
def self.first
  Byebug.breakpoints.first
end
last() click to toggle source

Last breakpoint, in order of creation

# File lib/byebug/breakpoint.rb, line 17
def self.last
  Byebug.breakpoints.last
end
none?() click to toggle source

True if there's no breakpoints

# File lib/byebug/breakpoint.rb, line 97
def self.none?
  Byebug.breakpoints.empty?
end
potential_line?(filename, lineno) click to toggle source

Returns true if a breakpoint could be set in line number lineno in file name +filename.

# File lib/byebug/breakpoint.rb, line 90
def self.potential_line?(filename, lineno)
  potential_lines(filename).member?(lineno)
end
potential_lines(filename) click to toggle source

Returns an array of line numbers in file named filename where breakpoints could be set. The list will contain an entry for each distinct line event call so it is possible (and possibly useful) for a line number appear more than once.

@param filename [String] File name to inspect for possible breakpoints

# File lib/byebug/breakpoint.rb, line 51
def self.potential_lines(filename)
  name = "#{Time.new.to_i}_#{rand(2**31)}"
  iseq = RubyVM::InstructionSequence.compile(File.read(filename), name)

  if iseq.respond_to?(:each_child)
    potential_lines_with_trace_points(iseq, {})
  else
    potential_lines_without_trace_points(iseq, {})
  end
end
remove(id) click to toggle source

Removes a breakpoint

@param id [integer] breakpoint number

# File lib/byebug/breakpoint.rb, line 39
def self.remove(id)
  Byebug.breakpoints.reject! { |b| b.id == id }
end

Private Class Methods

potential_lines_with_trace_points(iseq, lines) click to toggle source
# File lib/byebug/breakpoint.rb, line 62
def self.potential_lines_with_trace_points(iseq, lines)
  iseq.trace_points.each { |(line, _)| lines[line] = true }
  iseq.each_child do |child|
    potential_lines_with_trace_points(child, lines)
  end

  lines.keys.sort
end
potential_lines_without_trace_points(iseq, lines) click to toggle source
# File lib/byebug/breakpoint.rb, line 73
def self.potential_lines_without_trace_points(iseq, lines)
  iseq.disasm.each_line do |line|
    res = /^\d+ (?<insn>\w+)\s+.+\(\s*(?<lineno>\d+)\)$/.match(line)
    next unless res && res[:insn] == "trace"

    lines[res[:lineno].to_i] = true
  end

  lines.keys
end

Public Instance Methods

inspect() click to toggle source

Prints all information associated to the breakpoint

# File lib/byebug/breakpoint.rb, line 104
def inspect
  meths = %w[id pos source expr hit_condition hit_count hit_value enabled?]
  values = meths.map { |field| "#{field}: #{send(field)}" }.join(", ")
  "#<Byebug::Breakpoint #{values}>"
end