1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
# frozen_string_literal: true
module Byebug
#
# Implements breakpoints
#
class Breakpoint
#
# First breakpoint, in order of creation
#
def self.first
Byebug.breakpoints.first
end
#
# Last breakpoint, in order of creation
#
def self.last
Byebug.breakpoints.last
end
#
# Adds a new breakpoint
#
# @param [String] file
# @param [Fixnum] line
# @param [String] expr
#
def self.add(file, line, expr = nil)
breakpoint = Breakpoint.new(file, line, expr)
Byebug.breakpoints << breakpoint
breakpoint
end
#
# Removes a breakpoint
#
# @param id [integer] breakpoint number
#
def self.remove(id)
Byebug.breakpoints.reject! { |b| b.id == id }
end
#
# 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
#
def self.potential_lines(filename)
name = "#{Time.new.to_i}_#{rand(2**31)}"
iseq = RubyVM::InstructionSequence.compile(File.read(filename), name)
potential_lines_with_trace_points(iseq, {})
end
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
private_class_method :potential_lines_with_trace_points
#
# Returns true if a breakpoint could be set in line number +lineno+ in file
# name +filename.
#
def self.potential_line?(filename, lineno)
potential_lines(filename).member?(lineno)
end
#
# True if there's no breakpoints
#
def self.none?
Byebug.breakpoints.empty?
end
#
# Prints all information associated to the breakpoint
#
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
end
end
|