lib/byebug/breakpoint.rb in byebug-3.5.1 vs lib/byebug/breakpoint.rb in byebug-4.0.0

- old
+ new

@@ -38,9 +38,39 @@ 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, lines = "#{Time.new.to_i}_#{rand(2**31)}", {} + iseq = RubyVM::InstructionSequence.compile(File.read(filename), name) + + 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 + + # + # 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