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
95
|
# File 'lib/ruby-debug/commands/breakpoints.rb', line 16
def execute
if @match[1]
line, _, _, expr = @match.captures
else
_, file, line, expr = @match.captures
end
if expr
if expr !~ /^\s*if\s+(.+)/
if file or line
errmsg "Expecting 'if' in breakpoint condition; got: #{expr}.\n"
else
errmsg "Invalid breakpoint location: #{expr}.\n"
end
return
else
expr = $1
end
end
brkpt_filename = nil
if file.nil?
unless @state.context
errmsg "We are not in a state that has an associated file.\n"
return
end
brkpt_filename = @state.file
file = File.basename(@state.file)
if line.nil?
line = @state.line.to_s
end
elsif line !~ /^\d+$/
klass = debug_silent_eval(file)
if klass && klass.kind_of?(Module)
class_name = klass.name if klass
else
errmsg "Unknown class #{file}.\n"
throw :debug_error
end
else
file = File.expand_path(file) if file.index(File::SEPARATOR) || \
File::ALT_SEPARATOR && file.index(File::ALT_SEPARATOR)
brkpt_filename = file
end
if line =~ /^\d+$/
line = line.to_i
if LineCache.cache(brkpt_filename, Command.settings[:reload_source_on_change])
last_line = LineCache.size(brkpt_filename)
if line > last_line
errmsg("There are only %d lines in file \"%s\".\n", last_line, file)
return
end
unless LineCache.trace_line_numbers(brkpt_filename).member?(line)
errmsg("Line %d is not a stopping point in file \"%s\".\n", line, file)
return
end
else
errmsg("No source file named %s\n" % file)
return unless confirm("Set breakpoint anyway? (y/n) ")
end
unless @state.context
errmsg "We are not in a state we can add breakpoints.\n"
return
end
b = Debugger.add_breakpoint brkpt_filename, line, expr
print "Breakpoint %d file %s, line %s\n", b.id, brkpt_filename, line.to_s
unless syntax_valid?(expr)
errmsg("Expression \"#{expr}\" syntactically incorrect; breakpoint disabled.\n")
b.enabled = false
end
else
method = line.intern.id2name
b = Debugger.add_breakpoint class_name, method, expr
print "Breakpoint %d at %s::%s\n", b.id, class_name, method.to_s
end
end
|