byebug 3.2.0 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +125 -99
- data/CONTRIBUTING.md +4 -6
- data/GUIDE.md +42 -20
- data/Gemfile +5 -3
- data/README.md +2 -3
- data/Rakefile +11 -7
- data/bin/byebug +2 -252
- data/byebug.gemspec +7 -4
- data/ext/byebug/byebug.c +17 -18
- data/ext/byebug/byebug.h +4 -5
- data/ext/byebug/context.c +37 -39
- data/ext/byebug/threads.c +39 -18
- data/lib/byebug.rb +2 -110
- data/lib/byebug/attacher.rb +23 -0
- data/lib/byebug/breakpoint.rb +60 -0
- data/lib/byebug/command.rb +62 -70
- data/lib/byebug/commands/break.rb +24 -24
- data/lib/byebug/commands/catchpoint.rb +18 -10
- data/lib/byebug/commands/condition.rb +18 -17
- data/lib/byebug/commands/continue.rb +17 -9
- data/lib/byebug/commands/delete.rb +19 -13
- data/lib/byebug/commands/display.rb +19 -53
- data/lib/byebug/commands/edit.rb +7 -4
- data/lib/byebug/commands/enable_disable.rb +130 -0
- data/lib/byebug/commands/eval.rb +40 -22
- data/lib/byebug/commands/finish.rb +13 -4
- data/lib/byebug/commands/frame.rb +65 -45
- data/lib/byebug/commands/help.rb +17 -18
- data/lib/byebug/commands/history.rb +14 -8
- data/lib/byebug/commands/info.rb +160 -182
- data/lib/byebug/commands/interrupt.rb +4 -1
- data/lib/byebug/commands/irb.rb +30 -0
- data/lib/byebug/commands/kill.rb +7 -8
- data/lib/byebug/commands/list.rb +71 -66
- data/lib/byebug/commands/method.rb +14 -6
- data/lib/byebug/commands/pry.rb +35 -0
- data/lib/byebug/commands/quit.rb +9 -6
- data/lib/byebug/commands/reload.rb +5 -2
- data/lib/byebug/commands/restart.rb +13 -9
- data/lib/byebug/commands/save.rb +17 -17
- data/lib/byebug/commands/set.rb +16 -15
- data/lib/byebug/commands/show.rb +10 -11
- data/lib/byebug/commands/source.rb +11 -5
- data/lib/byebug/commands/stepping.rb +38 -24
- data/lib/byebug/commands/threads.rb +45 -31
- data/lib/byebug/commands/trace.rb +22 -9
- data/lib/byebug/commands/undisplay.rb +45 -0
- data/lib/byebug/commands/variables.rb +83 -27
- data/lib/byebug/context.rb +25 -22
- data/lib/byebug/core.rb +82 -0
- data/lib/byebug/helper.rb +37 -28
- data/lib/byebug/history.rb +8 -4
- data/lib/byebug/interface.rb +12 -17
- data/lib/byebug/interfaces/local_interface.rb +11 -8
- data/lib/byebug/interfaces/remote_interface.rb +11 -8
- data/lib/byebug/interfaces/script_interface.rb +9 -6
- data/lib/byebug/options.rb +46 -0
- data/lib/byebug/processor.rb +7 -1
- data/lib/byebug/processors/command_processor.rb +135 -125
- data/lib/byebug/processors/control_command_processor.rb +23 -23
- data/lib/byebug/remote.rb +17 -26
- data/lib/byebug/runner.rb +100 -0
- data/lib/byebug/setting.rb +33 -8
- data/lib/byebug/settings/autoeval.rb +5 -15
- data/lib/byebug/settings/autoirb.rb +4 -1
- data/lib/byebug/settings/autolist.rb +5 -2
- data/lib/byebug/settings/autoreload.rb +5 -2
- data/lib/byebug/settings/autosave.rb +6 -2
- data/lib/byebug/settings/basename.rb +7 -2
- data/lib/byebug/settings/callstyle.rb +4 -1
- data/lib/byebug/settings/forcestep.rb +6 -3
- data/lib/byebug/settings/fullpath.rb +5 -2
- data/lib/byebug/settings/histfile.rb +5 -3
- data/lib/byebug/settings/histsize.rb +5 -3
- data/lib/byebug/settings/linetrace.rb +4 -1
- data/lib/byebug/settings/listsize.rb +5 -1
- data/lib/byebug/settings/post_mortem.rb +21 -13
- data/lib/byebug/settings/stack_on_error.rb +6 -2
- data/lib/byebug/settings/testing.rb +6 -1
- data/lib/byebug/settings/tracing_plus.rb +5 -1
- data/lib/byebug/settings/verbose.rb +13 -2
- data/lib/byebug/settings/width.rb +4 -1
- data/lib/byebug/version.rb +1 -1
- data/test/{break_test.rb → commands/break_test.rb} +41 -53
- data/test/{condition_test.rb → commands/condition_test.rb} +14 -14
- data/test/{continue_test.rb → commands/continue_test.rb} +0 -0
- data/test/{delete_test.rb → commands/delete_test.rb} +2 -2
- data/test/commands/display_test.rb +37 -0
- data/test/{edit_test.rb → commands/edit_test.rb} +0 -0
- data/test/{eval_test.rb → commands/eval_test.rb} +1 -0
- data/test/{finish_test.rb → commands/finish_test.rb} +11 -1
- data/test/{frame_test.rb → commands/frame_test.rb} +12 -16
- data/test/{help_test.rb → commands/help_test.rb} +21 -4
- data/test/{history_test.rb → commands/history_test.rb} +0 -0
- data/test/{info_test.rb → commands/info_test.rb} +5 -55
- data/test/{interrupt_test.rb → commands/interrupt_test.rb} +0 -0
- data/test/commands/irb_test.rb +28 -0
- data/test/{kill_test.rb → commands/kill_test.rb} +1 -1
- data/test/{list_test.rb → commands/list_test.rb} +1 -1
- data/test/{method_test.rb → commands/method_test.rb} +0 -0
- data/test/{post_mortem_test.rb → commands/post_mortem_test.rb} +6 -10
- data/test/{pry_test.rb → commands/pry_test.rb} +4 -13
- data/test/{quit_test.rb → commands/quit_test.rb} +4 -4
- data/test/{reload_test.rb → commands/reload_test.rb} +0 -0
- data/test/{restart_test.rb → commands/restart_test.rb} +6 -0
- data/test/{save_test.rb → commands/save_test.rb} +2 -2
- data/test/{set_test.rb → commands/set_test.rb} +9 -2
- data/test/{show_test.rb → commands/show_test.rb} +1 -1
- data/test/{source_test.rb → commands/source_test.rb} +3 -3
- data/test/{stepping_test.rb → commands/stepping_test.rb} +44 -35
- data/test/{thread_test.rb → commands/thread_test.rb} +0 -0
- data/test/{trace_test.rb → commands/trace_test.rb} +0 -0
- data/test/{display_test.rb → commands/undisplay_test.rb} +7 -45
- data/test/{variables_test.rb → commands/variables_test.rb} +10 -1
- data/test/debugger_alias_test.rb +2 -2
- data/test/runner_test.rb +127 -0
- data/test/support/matchers.rb +27 -25
- data/test/support/test_interface.rb +9 -5
- data/test/support/utils.rb +96 -101
- data/test/test_helper.rb +32 -20
- metadata +93 -68
- data/lib/byebug/commands/enable.rb +0 -154
- data/lib/byebug/commands/repl.rb +0 -126
- data/test/irb_test.rb +0 -47
- data/test/support/breakpoint.rb +0 -13
@@ -1,4 +1,7 @@
|
|
1
1
|
module Byebug
|
2
|
+
#
|
3
|
+
# Show information about every line that is executed.
|
4
|
+
#
|
2
5
|
class TraceCommand < Command
|
3
6
|
def regexp
|
4
7
|
/^\s* tr(?:acevar)? (?: \s+ (\S+))? # (variable-name)?
|
@@ -7,20 +10,24 @@ module Byebug
|
|
7
10
|
end
|
8
11
|
|
9
12
|
def execute
|
10
|
-
|
11
|
-
if global_variables.include?("$#{
|
13
|
+
var = @match[1]
|
14
|
+
if global_variables.include?("$#{var}".to_sym)
|
12
15
|
if @match[2] && @match[2] !~ /(:?no)?stop/
|
13
|
-
errmsg "expecting \"stop\" or \"nostop\"; got \"#{@match[2]}\"
|
16
|
+
errmsg "expecting \"stop\" or \"nostop\"; got \"#{@match[2]}\""
|
14
17
|
else
|
15
|
-
dbg_cmd =
|
18
|
+
dbg_cmd = if @match[2] && @match[2] !~ /nostop/
|
19
|
+
'byebug(1, false)'
|
20
|
+
else
|
21
|
+
''
|
22
|
+
end
|
16
23
|
end
|
17
|
-
eval("trace_var(:\"\$#{
|
18
|
-
|
24
|
+
eval("trace_var(:\"\$#{var}\") do |val|
|
25
|
+
puts \"traced global variable '#{var}' has value '\#{val}'\"
|
19
26
|
#{dbg_cmd}
|
20
27
|
end")
|
21
|
-
|
28
|
+
puts "Tracing global variable \"#{var}\"."
|
22
29
|
else
|
23
|
-
errmsg "'#{
|
30
|
+
errmsg "'#{var}' is not a global variable."
|
24
31
|
end
|
25
32
|
end
|
26
33
|
|
@@ -30,7 +37,13 @@ module Byebug
|
|
30
37
|
end
|
31
38
|
|
32
39
|
def description
|
33
|
-
%
|
40
|
+
%(tr[acevar] <variable> [[no]stop]
|
41
|
+
|
42
|
+
Start tracing variable <variable>.
|
43
|
+
|
44
|
+
If "stop" is specified, execution will stop every time the variable
|
45
|
+
changes its value. If nothing or "nostop" is specified, execution
|
46
|
+
won't stop, changes will just be logged in byebug's output.)
|
34
47
|
end
|
35
48
|
end
|
36
49
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Byebug
|
2
|
+
#
|
3
|
+
# Remove expressions from display list.
|
4
|
+
#
|
5
|
+
class UndisplayCommand < Command
|
6
|
+
self.allow_in_post_mortem = false
|
7
|
+
|
8
|
+
def regexp
|
9
|
+
/^\s* undisp(?:lay)? (?:\s+(\S+))? \s*$/x
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute
|
13
|
+
if @match[1]
|
14
|
+
pos, err = get_int(@match[1], 'Undisplay')
|
15
|
+
return errmsg(err) unless pos
|
16
|
+
|
17
|
+
unless @state.display[pos - 1]
|
18
|
+
return errmsg("Display expression #{pos} is not defined.")
|
19
|
+
end
|
20
|
+
|
21
|
+
@state.display[pos - 1][0] = nil
|
22
|
+
else
|
23
|
+
return unless confirm('Clear all expressions? (y/n) ')
|
24
|
+
|
25
|
+
@state.display.each { |d| d[0] = false }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class << self
|
30
|
+
def names
|
31
|
+
%w(undisplay)
|
32
|
+
end
|
33
|
+
|
34
|
+
def description
|
35
|
+
%(undisp[lay][ nnn]
|
36
|
+
|
37
|
+
Cancel some expressions to be displayed when program stops. Arguments
|
38
|
+
are the code numbers of the expressions to stop displaying. No
|
39
|
+
argument means cancel all automatic-display expressions. "delete
|
40
|
+
display" has the same effect as this command. Do "info display" to see
|
41
|
+
the current list of code numbers.)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -1,20 +1,23 @@
|
|
1
1
|
module Byebug
|
2
|
+
#
|
3
|
+
# Utilities for the var command.
|
4
|
+
#
|
2
5
|
module VarFunctions
|
3
6
|
def var_list(ary, b = get_binding)
|
4
7
|
ary.sort!
|
5
|
-
|
8
|
+
ary.each do |v|
|
6
9
|
begin
|
7
10
|
s = bb_eval(v.to_s, b).inspect
|
8
11
|
rescue
|
9
12
|
begin
|
10
13
|
s = bb_eval(v.to_s, b).to_s
|
11
14
|
rescue
|
12
|
-
s =
|
15
|
+
s = '*Error in evaluation*'
|
13
16
|
end
|
14
17
|
end
|
15
18
|
s = "#{v} = #{s}"
|
16
|
-
s[Setting[:width]-3..-1] =
|
17
|
-
|
19
|
+
s[Setting[:width] - 3..-1] = '...' if s.size > Setting[:width]
|
20
|
+
puts s
|
18
21
|
end
|
19
22
|
end
|
20
23
|
|
@@ -24,20 +27,65 @@ module Byebug
|
|
24
27
|
end
|
25
28
|
|
26
29
|
def var_global
|
27
|
-
|
30
|
+
globals = global_variables.reject do |v|
|
31
|
+
[:$IGNORECASE, :$=, :$KCODE, :$-K].include?(v)
|
32
|
+
end
|
33
|
+
|
34
|
+
var_list(globals)
|
35
|
+
end
|
36
|
+
|
37
|
+
def var_instance(where)
|
38
|
+
obj = bb_eval(where)
|
39
|
+
var_list(obj.instance_variables, obj.instance_eval { binding })
|
40
|
+
end
|
41
|
+
|
42
|
+
def var_local
|
43
|
+
_self = @state.context.frame_self(@state.frame_pos)
|
44
|
+
locals = @state.context.frame_locals
|
45
|
+
locals.keys.sort.each do |name|
|
46
|
+
puts format(' %s => %p', name, locals[name])
|
47
|
+
end
|
28
48
|
end
|
29
49
|
end
|
30
50
|
|
51
|
+
#
|
52
|
+
# Show all variables and its values.
|
53
|
+
#
|
54
|
+
class VarAllCommand < Command
|
55
|
+
def regexp
|
56
|
+
/^\s* v(?:ar)? \s+ a(?:ll)? \s*$/x
|
57
|
+
end
|
58
|
+
|
59
|
+
def execute
|
60
|
+
var_class_self
|
61
|
+
var_global
|
62
|
+
var_instance('self')
|
63
|
+
var_local
|
64
|
+
end
|
65
|
+
|
66
|
+
class << self
|
67
|
+
def names
|
68
|
+
%w(var)
|
69
|
+
end
|
70
|
+
|
71
|
+
def description
|
72
|
+
%(v[ar] a[ll]
|
73
|
+
|
74
|
+
Show local, global and instance & class variables of self.)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
#
|
80
|
+
# Show class variables and its values.
|
81
|
+
#
|
31
82
|
class VarClassCommand < Command
|
32
83
|
def regexp
|
33
84
|
/^\s* v(?:ar)? \s+ cl(?:ass)? \s*/x
|
34
85
|
end
|
35
86
|
|
36
87
|
def execute
|
37
|
-
unless @state.context
|
38
|
-
errmsg "can't get class variables here.\n"
|
39
|
-
return
|
40
|
-
end
|
88
|
+
return errmsg "can't get class variables here.\n" unless @state.context
|
41
89
|
var_class_self
|
42
90
|
end
|
43
91
|
|
@@ -47,11 +95,14 @@ module Byebug
|
|
47
95
|
end
|
48
96
|
|
49
97
|
def description
|
50
|
-
%
|
98
|
+
%(v[ar] cl[ass] Show class variables of self.)
|
51
99
|
end
|
52
100
|
end
|
53
101
|
end
|
54
102
|
|
103
|
+
#
|
104
|
+
# Show constants and its values.
|
105
|
+
#
|
55
106
|
class VarConstantCommand < Command
|
56
107
|
def regexp
|
57
108
|
/^\s* v(?:ar)? \s+ co(?:nst(?:ant)?)? \s+/x
|
@@ -59,16 +110,15 @@ module Byebug
|
|
59
110
|
|
60
111
|
def execute
|
61
112
|
obj = bb_eval(@match.post_match)
|
62
|
-
if obj.
|
113
|
+
if obj.is_a? Module
|
63
114
|
constants = bb_eval("#{@match.post_match}.constants")
|
64
115
|
constants.sort!
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
print " %s => %p\n", c, value
|
116
|
+
constants.each do |c|
|
117
|
+
value = obj.const_get(c)
|
118
|
+
puts format(' %s => %p', c, value)
|
69
119
|
end
|
70
120
|
else
|
71
|
-
|
121
|
+
puts "Should be Class/Module: #{@match.post_match}"
|
72
122
|
end
|
73
123
|
end
|
74
124
|
|
@@ -78,11 +128,14 @@ module Byebug
|
|
78
128
|
end
|
79
129
|
|
80
130
|
def description
|
81
|
-
%
|
131
|
+
%(v[ar] co[nst] <object> Show constants of <object>.)
|
82
132
|
end
|
83
133
|
end
|
84
134
|
end
|
85
135
|
|
136
|
+
#
|
137
|
+
# Show global variables and its values.
|
138
|
+
#
|
86
139
|
class VarGlobalCommand < Command
|
87
140
|
def regexp
|
88
141
|
/^\s* v(?:ar)? \s+ g(?:lobal)? \s*$/x
|
@@ -98,19 +151,21 @@ module Byebug
|
|
98
151
|
end
|
99
152
|
|
100
153
|
def description
|
101
|
-
%
|
154
|
+
%(v[ar] g[lobal] Show global variables.)
|
102
155
|
end
|
103
156
|
end
|
104
157
|
end
|
105
158
|
|
159
|
+
#
|
160
|
+
# Show instance variables and its values.
|
161
|
+
#
|
106
162
|
class VarInstanceCommand < Command
|
107
163
|
def regexp
|
108
164
|
/^\s* v(?:ar)? \s+ ins(?:tance)? \s*/x
|
109
165
|
end
|
110
166
|
|
111
167
|
def execute
|
112
|
-
|
113
|
-
var_list(obj.instance_variables, obj.instance_eval { binding() })
|
168
|
+
var_instance(@match.post_match.empty? ? 'self' : @match.post_match)
|
114
169
|
end
|
115
170
|
|
116
171
|
class << self
|
@@ -119,22 +174,23 @@ module Byebug
|
|
119
174
|
end
|
120
175
|
|
121
176
|
def description
|
122
|
-
%
|
177
|
+
%(v[ar] i[nstance] <object>
|
178
|
+
|
179
|
+
Show instance variables of <object>.)
|
123
180
|
end
|
124
181
|
end
|
125
182
|
end
|
126
183
|
|
184
|
+
#
|
185
|
+
# Show local variables and its values.
|
186
|
+
#
|
127
187
|
class VarLocalCommand < Command
|
128
188
|
def regexp
|
129
189
|
/^\s* v(?:ar)? \s+ l(?:ocal)? \s*$/x
|
130
190
|
end
|
131
191
|
|
132
192
|
def execute
|
133
|
-
|
134
|
-
locals = @state.context.frame_locals
|
135
|
-
locals.keys.sort.each do |name|
|
136
|
-
print " %s => %p\n", name, locals[name]
|
137
|
-
end
|
193
|
+
var_local
|
138
194
|
end
|
139
195
|
|
140
196
|
class << self
|
@@ -143,7 +199,7 @@ module Byebug
|
|
143
199
|
end
|
144
200
|
|
145
201
|
def description
|
146
|
-
%
|
202
|
+
%(v[ar] l[ocal] Sow local variables.)
|
147
203
|
end
|
148
204
|
end
|
149
205
|
end
|
data/lib/byebug/context.rb
CHANGED
@@ -1,19 +1,22 @@
|
|
1
1
|
module Byebug
|
2
|
-
|
2
|
+
#
|
3
|
+
# Mantains context information for the debugger and it's the main
|
4
|
+
# communication point between the library and the C-extension through the
|
5
|
+
# at_breakpoint, at_catchpoint, at_tracing, at_line and at_return callbacks
|
6
|
+
#
|
3
7
|
class Context
|
4
|
-
|
5
8
|
class << self
|
6
9
|
def stack_size(byebug_frames = false)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
else
|
15
|
-
0
|
10
|
+
backtrace = Thread.current.backtrace_locations(0)
|
11
|
+
return 0 unless backtrace
|
12
|
+
|
13
|
+
unless byebug_frames
|
14
|
+
backtrace = backtrace.drop_while { |l| !ignored(l.path) }
|
15
|
+
.drop_while { |l| ignored(l.path) }
|
16
|
+
.take_while { |l| !ignored(l.path) }
|
16
17
|
end
|
18
|
+
|
19
|
+
backtrace.size
|
17
20
|
end
|
18
21
|
|
19
22
|
def ignored(path)
|
@@ -23,32 +26,32 @@ module Byebug
|
|
23
26
|
end
|
24
27
|
|
25
28
|
def interrupt
|
26
|
-
|
29
|
+
step_into 1
|
27
30
|
end
|
28
31
|
|
29
|
-
def frame_locals
|
32
|
+
def frame_locals(frame_no = 0)
|
30
33
|
bind = frame_binding frame_no
|
31
|
-
eval
|
34
|
+
eval 'local_variables.inject({}){|h, v| h[v] = eval(v.to_s); h}', bind
|
32
35
|
end
|
33
36
|
|
34
|
-
def c_frame_args
|
37
|
+
def c_frame_args(frame_no)
|
35
38
|
myself = frame_self frame_no
|
36
39
|
return [] unless myself.to_s != 'main'
|
37
40
|
myself.send(:method, frame_method(frame_no)).parameters
|
38
41
|
end
|
39
42
|
|
40
|
-
def ruby_frame_args
|
43
|
+
def ruby_frame_args(bind)
|
41
44
|
return [] unless eval '__method__', bind
|
42
45
|
begin
|
43
|
-
eval
|
46
|
+
eval 'self.method(__method__).parameters', bind
|
44
47
|
rescue NameError => e
|
45
|
-
|
46
|
-
|
48
|
+
puts "WARNING: Got exception #{e.class}: \"#{e.message}\" " \
|
49
|
+
'while retreving parameters from frame'
|
47
50
|
return []
|
48
51
|
end
|
49
52
|
end
|
50
53
|
|
51
|
-
def frame_args
|
54
|
+
def frame_args(frame_no = 0)
|
52
55
|
bind = frame_binding frame_no
|
53
56
|
if bind.nil?
|
54
57
|
c_frame_args frame_no
|
@@ -58,7 +61,7 @@ module Byebug
|
|
58
61
|
end
|
59
62
|
|
60
63
|
def handler
|
61
|
-
Byebug.handler
|
64
|
+
Byebug.handler || fail('No interface loaded')
|
62
65
|
end
|
63
66
|
|
64
67
|
def at_breakpoint(brkpnt)
|
@@ -74,7 +77,7 @@ module Byebug
|
|
74
77
|
end
|
75
78
|
|
76
79
|
def at_line(file, line)
|
77
|
-
handler.at_line(self, file, line)
|
80
|
+
handler.at_line(self, file, line) unless IGNORED_FILES.include?(file)
|
78
81
|
end
|
79
82
|
|
80
83
|
def at_return(file, line)
|
data/lib/byebug/core.rb
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'byebug/byebug'
|
2
|
+
require 'byebug/version'
|
3
|
+
require 'byebug/context'
|
4
|
+
require 'byebug/breakpoint'
|
5
|
+
require 'byebug/interface'
|
6
|
+
require 'byebug/processor'
|
7
|
+
require 'byebug/setting'
|
8
|
+
require 'byebug/remote'
|
9
|
+
|
10
|
+
require 'stringio'
|
11
|
+
require 'tracer'
|
12
|
+
require 'linecache19'
|
13
|
+
|
14
|
+
module Byebug
|
15
|
+
# List of files byebug will ignore while debugging
|
16
|
+
IGNORED_FILES = Dir.glob(File.expand_path('../**/*.rb', __FILE__))
|
17
|
+
|
18
|
+
# Configuration file used for startup commands. Default value is .byebugrc
|
19
|
+
INITFILE = '.byebugrc' unless defined?(INITFILE)
|
20
|
+
|
21
|
+
class << self
|
22
|
+
attr_accessor :handler
|
23
|
+
end
|
24
|
+
|
25
|
+
Byebug.handler = CommandProcessor.new
|
26
|
+
|
27
|
+
def self.source_reload
|
28
|
+
hsh = 'SCRIPT_LINES__'
|
29
|
+
Object.send(:remove_const, hsh) if Object.const_defined?(hsh)
|
30
|
+
Object.const_set(hsh, {})
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# Byebug's interface is its handler's interface
|
35
|
+
#
|
36
|
+
def self.interface=(value)
|
37
|
+
handler.interface = value
|
38
|
+
end
|
39
|
+
|
40
|
+
#
|
41
|
+
# Byebug's prints according to its handler's interface
|
42
|
+
#
|
43
|
+
def self.puts(message)
|
44
|
+
handler.interface.puts(message)
|
45
|
+
end
|
46
|
+
|
47
|
+
#
|
48
|
+
# Runs normal byebug initialization scripts.
|
49
|
+
#
|
50
|
+
# Reads and executes the commands from init file (if any) in the current
|
51
|
+
# working directory. This is only done if the current directory is
|
52
|
+
# different from your home directory. Thus, you can have more than one init
|
53
|
+
# file, one generic in your home directory, and another, specific to the
|
54
|
+
# program you are debugging, in the directory where you invoke byebug.
|
55
|
+
#
|
56
|
+
def self.run_init_script(out = handler.interface)
|
57
|
+
cwd_script = File.expand_path(File.join('.', INITFILE))
|
58
|
+
run_script(cwd_script, out, true) if File.exist?(cwd_script)
|
59
|
+
|
60
|
+
home_script = File.expand_path(File.join(ENV['HOME'].to_s, INITFILE))
|
61
|
+
if File.exist?(home_script) && cwd_script != home_script
|
62
|
+
run_script(home_script, out, true)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
#
|
67
|
+
# Runs a script file
|
68
|
+
#
|
69
|
+
def self.run_script(file, out = handler.interface, verbose = false)
|
70
|
+
interface = ScriptInterface.new(File.expand_path(file), out)
|
71
|
+
processor = ControlCommandProcessor.new(interface)
|
72
|
+
processor.process_commands(verbose)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
#
|
77
|
+
# Extends the extension class to be able to pass information about the
|
78
|
+
# debugging environment from the c-extension to the user.
|
79
|
+
#
|
80
|
+
class Exception
|
81
|
+
attr_reader :__bb_file, :__bb_line, :__bb_binding, :__bb_context
|
82
|
+
end
|