byebug 3.1.2 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +4 -2
- data/CHANGELOG.md +15 -0
- data/GUIDE.md +17 -35
- data/Gemfile +8 -5
- data/LICENSE +1 -1
- data/README.md +10 -22
- data/Rakefile +1 -1
- data/ext/byebug/byebug.c +3 -2
- data/lib/byebug.rb +3 -38
- data/lib/byebug/commands/break.rb +83 -0
- data/lib/byebug/commands/catchpoint.rb +0 -1
- data/lib/byebug/commands/condition.rb +10 -6
- data/lib/byebug/commands/continue.rb +3 -6
- data/lib/byebug/commands/delete.rb +38 -0
- data/lib/byebug/commands/edit.rb +0 -2
- data/lib/byebug/commands/enable.rb +7 -8
- data/lib/byebug/commands/finish.rb +0 -2
- data/lib/byebug/commands/frame.rb +13 -15
- data/lib/byebug/commands/help.rb +1 -3
- data/lib/byebug/commands/history.rb +3 -3
- data/lib/byebug/commands/info.rb +4 -13
- data/lib/byebug/commands/interrupt.rb +25 -0
- data/lib/byebug/commands/kill.rb +0 -2
- data/lib/byebug/commands/list.rb +2 -4
- data/lib/byebug/commands/method.rb +2 -8
- data/lib/byebug/commands/quit.rb +0 -2
- data/lib/byebug/commands/reload.rb +2 -15
- data/lib/byebug/commands/repl.rb +0 -3
- data/lib/byebug/commands/{control.rb → restart.rb} +2 -26
- data/lib/byebug/commands/save.rb +0 -1
- data/lib/byebug/commands/set.rb +4 -7
- data/lib/byebug/commands/show.rb +0 -3
- data/lib/byebug/commands/source.rb +0 -3
- data/lib/byebug/commands/stepping.rb +3 -4
- data/lib/byebug/commands/trace.rb +0 -1
- data/lib/byebug/commands/variables.rb +3 -4
- data/lib/byebug/context.rb +0 -1
- data/lib/byebug/helper.rb +23 -0
- data/lib/byebug/interfaces/script_interface.rb +1 -1
- data/lib/byebug/processors/command_processor.rb +9 -9
- data/lib/byebug/remote.rb +2 -2
- data/lib/byebug/setting.rb +3 -1
- data/lib/byebug/settings/autoeval.rb +3 -1
- data/lib/byebug/settings/autoirb.rb +3 -1
- data/lib/byebug/settings/autolist.rb +3 -1
- data/lib/byebug/settings/autoreload.rb +1 -3
- data/lib/byebug/settings/autosave.rb +1 -3
- data/lib/byebug/settings/callstyle.rb +2 -4
- data/lib/byebug/settings/fullpath.rb +1 -3
- data/lib/byebug/settings/histfile.rb +1 -3
- data/lib/byebug/settings/histsize.rb +0 -4
- data/lib/byebug/settings/listsize.rb +1 -3
- data/lib/byebug/settings/post_mortem.rb +14 -1
- data/lib/byebug/settings/width.rb +1 -17
- data/lib/byebug/version.rb +1 -1
- data/test/break_test.rb +376 -0
- data/test/condition_test.rb +82 -0
- data/test/continue_test.rb +27 -30
- data/test/debugger_alias_test.rb +4 -4
- data/test/delete_test.rb +26 -0
- data/test/display_test.rb +80 -102
- data/test/edit_test.rb +28 -31
- data/test/eval_test.rb +50 -80
- data/test/finish_test.rb +23 -23
- data/test/frame_test.rb +172 -186
- data/test/help_test.rb +27 -37
- data/test/history_test.rb +32 -41
- data/test/info_test.rb +198 -230
- data/test/interrupt_test.rb +17 -36
- data/test/irb_test.rb +47 -0
- data/test/kill_test.rb +19 -19
- data/test/list_test.rb +126 -133
- data/test/method_test.rb +21 -54
- data/test/post_mortem_test.rb +44 -46
- data/test/pry_test.rb +42 -0
- data/test/quit_test.rb +17 -15
- data/test/reload_test.rb +23 -28
- data/test/restart_test.rb +35 -63
- data/test/save_test.rb +46 -62
- data/test/set_test.rb +93 -144
- data/test/show_test.rb +50 -71
- data/test/source_test.rb +23 -26
- data/test/stepping_test.rb +125 -153
- data/test/support/matchers.rb +1 -6
- data/test/support/test_interface.rb +1 -1
- data/test/support/{test_dsl.rb → utils.rb} +17 -64
- data/test/test_helper.rb +25 -7
- data/test/thread_test.rb +101 -89
- data/test/trace_test.rb +48 -85
- data/test/variables_test.rb +43 -80
- metadata +18 -13
- data/lib/byebug/commands/breakpoints.rb +0 -137
- data/lib/byebug/commands/skip.rb +0 -30
- data/test/breakpoints_test.rb +0 -474
- data/test/conditions_test.rb +0 -82
- data/test/repl_test.rb +0 -75
data/test/source_test.rb
CHANGED
@@ -1,44 +1,41 @@
|
|
1
|
-
module
|
2
|
-
class SourceTestCase <
|
3
|
-
|
4
|
-
|
5
|
-
before do
|
1
|
+
module Byebug
|
2
|
+
class SourceTestCase < TestCase
|
3
|
+
def setup
|
6
4
|
@example = -> do
|
7
5
|
byebug
|
8
6
|
a = 2
|
9
7
|
a = 3
|
10
8
|
end
|
11
9
|
|
12
|
-
File.open(
|
10
|
+
File.open('source_example.txt', 'w') do |f|
|
13
11
|
f.puts 'break 2'
|
14
12
|
f.puts 'break 3 if true'
|
15
13
|
end
|
16
|
-
end
|
17
|
-
|
18
|
-
after { FileUtils.rm(filename) }
|
19
14
|
|
20
|
-
|
21
|
-
enter "source #{filename}"
|
22
|
-
debug_proc(@example) do
|
23
|
-
Byebug.breakpoints[0].pos.must_equal 2
|
24
|
-
Byebug.breakpoints[1].pos.must_equal 3
|
25
|
-
Byebug.breakpoints[1].expr.must_equal 'true'
|
26
|
-
end
|
15
|
+
super
|
27
16
|
end
|
28
17
|
|
29
|
-
|
30
|
-
|
31
|
-
debug_proc(@example) { Byebug.breakpoints[0].pos.must_equal 2 }
|
18
|
+
def teardown
|
19
|
+
FileUtils.rm('source_example.txt')
|
32
20
|
end
|
33
21
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
22
|
+
%w(source so).each do |cmd_alias|
|
23
|
+
define_method(:"test_#{cmd_alias}_runs_byebug_commands_from_file") do
|
24
|
+
enter "#{cmd_alias} source_example.txt"
|
25
|
+
debug_proc(@example) do
|
26
|
+
assert_equal 2, Byebug.breakpoints[0].pos
|
27
|
+
assert_equal 3, Byebug.breakpoints[1].pos
|
28
|
+
assert_equal 'true', Byebug.breakpoints[1].expr
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
define_method(:"test_#{cmd_alias}_shows_an_error_if_file_not_found") do
|
33
|
+
enter "#{cmd_alias} blabla"
|
34
|
+
debug_proc(@example)
|
35
|
+
check_error_includes(/File ".*blabla" not found/)
|
36
|
+
end
|
39
37
|
|
40
|
-
|
41
|
-
it 'must show help when used without arguments' do
|
38
|
+
define_method(:"test_#{cmd_alias}_without_arguments_shows_help") do
|
42
39
|
enter 'source'
|
43
40
|
debug_proc(@example)
|
44
41
|
check_output_includes \
|
data/test/stepping_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module Byebug
|
2
2
|
class Example
|
3
3
|
def self.a(num)
|
4
4
|
num += 2
|
@@ -16,8 +16,41 @@ module SteppingTest
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
class
|
20
|
-
|
19
|
+
class BasicSteppingTestCase < TestCase
|
20
|
+
def setup
|
21
|
+
@example = -> do
|
22
|
+
byebug
|
23
|
+
|
24
|
+
ex = Example.c(7)
|
25
|
+
ex
|
26
|
+
end
|
27
|
+
|
28
|
+
super
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_next_goes_to_the_next_line
|
32
|
+
enter 'next'
|
33
|
+
debug_proc(@example) { assert_equal 25, state.line }
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_n_goes_to_the_next_line
|
37
|
+
enter 'n'
|
38
|
+
debug_proc(@example) { assert_equal 25, state.line }
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_step_goes_to_the_next_statement
|
42
|
+
enter 'step'
|
43
|
+
debug_proc(@example) { assert_equal 14, state.line }
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_s_goes_to_the_next_statement
|
47
|
+
enter 's'
|
48
|
+
debug_proc(@example) { assert_equal 14, state.line }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class AdvancedStepping < TestCase
|
53
|
+
def setup
|
21
54
|
@example = -> do
|
22
55
|
byebug
|
23
56
|
|
@@ -28,184 +61,123 @@ module SteppingTest
|
|
28
61
|
|
29
62
|
Example.b(ex)
|
30
63
|
end
|
31
|
-
end
|
32
64
|
|
33
|
-
|
34
|
-
describe 'method call behaviour' do
|
35
|
-
before { enter 'break 9', 'cont' }
|
65
|
+
super
|
36
66
|
|
37
|
-
|
38
|
-
|
39
|
-
debug_proc(@example) { state.line.must_equal 9 }
|
40
|
-
end
|
67
|
+
enter 'break 9', 'cont'
|
68
|
+
end
|
41
69
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
70
|
+
%w(next step).each do |cmd|
|
71
|
+
define_method(:"test_#{cmd}_stays_by_default") do
|
72
|
+
enter cmd
|
73
|
+
debug_proc(@example) { assert_equal 9, state.line }
|
74
|
+
end
|
46
75
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
76
|
+
define_method(:"test_#{cmd}+_goes_2_next_line") do
|
77
|
+
enter "#{cmd}+"
|
78
|
+
debug_proc(@example) { assert_equal 10, state.line }
|
79
|
+
end
|
51
80
|
|
52
|
-
|
53
|
-
|
81
|
+
define_method(:"test_#{cmd}-_stays") do
|
82
|
+
enter "#{cmd}-"
|
83
|
+
debug_proc(@example) { assert_equal 9, state.line }
|
84
|
+
end
|
54
85
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
86
|
+
define_method(:"test_#{cmd}_goes_2_next_line_if_forcestep_is_set") do
|
87
|
+
enter 'set forcestep', cmd
|
88
|
+
debug_proc(@example) { assert_equal 10, state.line }
|
89
|
+
end
|
59
90
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
91
|
+
define_method(:"test_#{cmd}+_goes_2_next_line_regardless_forcestep") do
|
92
|
+
enter 'set forcestep', "#{cmd}+"
|
93
|
+
debug_proc(@example) { assert_equal 10, state.line }
|
94
|
+
end
|
95
|
+
|
96
|
+
define_method(:"test_#{cmd}-_stays_regardless_forcestep") do
|
97
|
+
enter 'set forcestep', "#{cmd}-"
|
98
|
+
debug_proc(@example) { assert_equal 9, state.line }
|
99
|
+
end
|
100
|
+
end
|
64
101
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
102
|
+
def test_next_goes_the_specified_number_of_lines_forward_by_default
|
103
|
+
enter 'set forcestep', 'next 2'
|
104
|
+
debug_proc(@example) { assert_equal 58, state.line }
|
105
|
+
end
|
69
106
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
107
|
+
def test_next_informs_when_not_staying_in_the_same_frame
|
108
|
+
enter 'set forcestep', 'next 2'
|
109
|
+
debug_proc(@example)
|
110
|
+
check_output_includes \
|
111
|
+
'Next went up a frame because previous frame finished'
|
112
|
+
end
|
76
113
|
|
114
|
+
def step_goes_the_specified_number_of_statements_forward_by_default
|
115
|
+
enter 'set forcestep', 'step 2'
|
116
|
+
debug_proc(@example) { assert_equal 58, state.line }
|
117
|
+
end
|
77
118
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
end
|
83
|
-
end
|
119
|
+
def test_next_steps_OVER_blocks
|
120
|
+
enter 'break 58', 'cont', 'next'
|
121
|
+
debug_proc(@example) { assert_equal 62, state.line }
|
122
|
+
end
|
84
123
|
|
85
|
-
|
86
|
-
|
124
|
+
def test_step_steps_INTO_blocks
|
125
|
+
enter 'break 58', 'cont', 'step'
|
126
|
+
debug_proc(@example) { assert_equal 59, state.line }
|
127
|
+
end
|
87
128
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
129
|
+
class RaiseFromCMethodExample
|
130
|
+
def a
|
131
|
+
b
|
132
|
+
rescue NameError
|
133
|
+
1
|
92
134
|
end
|
93
135
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
@example_raise = -> do
|
98
|
-
byebug
|
99
|
-
|
100
|
-
class RaiseFromCMethodExample
|
101
|
-
def a
|
102
|
-
b
|
103
|
-
rescue NameError
|
104
|
-
1
|
105
|
-
end
|
106
|
-
|
107
|
-
def b
|
108
|
-
c
|
109
|
-
end
|
110
|
-
|
111
|
-
def c
|
112
|
-
d
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
RaiseFromCMethodExample.new.a
|
117
|
-
end
|
118
|
-
enter 'break 102', 'cont'
|
119
|
-
end
|
120
|
-
|
121
|
-
it 'must step over rescue' do
|
122
|
-
enter 'next'
|
123
|
-
debug_proc(@example_raise) { state.line.must_equal 104 }
|
124
|
-
end
|
125
|
-
end
|
136
|
+
def b
|
137
|
+
c
|
138
|
+
end
|
126
139
|
|
127
|
-
|
128
|
-
|
129
|
-
@example_raise = -> do
|
130
|
-
byebug
|
131
|
-
|
132
|
-
class RaiseFromRubyMethodExample
|
133
|
-
def a
|
134
|
-
b
|
135
|
-
rescue
|
136
|
-
1
|
137
|
-
end
|
138
|
-
|
139
|
-
def b
|
140
|
-
c
|
141
|
-
end
|
142
|
-
|
143
|
-
def c
|
144
|
-
raise 'bang'
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
RaiseFromRubyMethodExample.new.a
|
149
|
-
end
|
150
|
-
enter 'break 134', 'cont'
|
151
|
-
end
|
152
|
-
|
153
|
-
it 'must step over rescue' do
|
154
|
-
enter 'next'
|
155
|
-
debug_proc(@example_raise) { state.line.must_equal 136 }
|
156
|
-
end
|
157
|
-
end
|
140
|
+
def c
|
141
|
+
d
|
158
142
|
end
|
159
143
|
end
|
160
144
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
before { enter 'break 9', 'cont' }
|
165
|
-
|
166
|
-
it 'must leave on the same line if forced by a setting' do
|
167
|
-
enter 'step'
|
168
|
-
debug_proc(@example) { state.line.must_equal 9 }
|
169
|
-
end
|
170
|
-
|
171
|
-
it 'must go to the step line if forced to do that by "plus" sign' do
|
172
|
-
enter 'step+'
|
173
|
-
debug_proc(@example) { state.line.must_equal 10 }
|
174
|
-
end
|
145
|
+
def test_next_steps_over_rescue_when_raising_from_c_method
|
146
|
+
example_raise = -> do
|
147
|
+
byebug
|
175
148
|
|
176
|
-
|
177
|
-
|
178
|
-
debug_proc(@example) { state.line.must_equal 9 }
|
179
|
-
end
|
149
|
+
RaiseFromCMethodExample.new.a
|
150
|
+
end
|
180
151
|
|
181
|
-
|
182
|
-
|
152
|
+
enter 'break 131', 'cont', 'next'
|
153
|
+
debug_proc(example_raise) { assert_equal 133, state.line }
|
154
|
+
end
|
183
155
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
156
|
+
class RaiseFromRubyMethodExample
|
157
|
+
def a
|
158
|
+
b
|
159
|
+
rescue
|
160
|
+
1
|
161
|
+
end
|
188
162
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
end
|
163
|
+
def b
|
164
|
+
c
|
165
|
+
end
|
193
166
|
|
194
|
-
|
195
|
-
|
196
|
-
debug_proc(@example) { state.line.must_equal 14 }
|
197
|
-
end
|
198
|
-
end
|
167
|
+
def c
|
168
|
+
raise 'bang'
|
199
169
|
end
|
170
|
+
end
|
200
171
|
|
201
|
-
|
202
|
-
|
172
|
+
def test_next_steps_over_rescue_when_raising_from_ruby_method
|
173
|
+
example_raise = -> do
|
174
|
+
byebug
|
203
175
|
|
204
|
-
|
205
|
-
enter 'step'
|
206
|
-
debug_proc(@example) { state.line.must_equal 26 }
|
207
|
-
end
|
176
|
+
RaiseFromRubyMethodExample.new.a
|
208
177
|
end
|
178
|
+
|
179
|
+
enter 'break 158', 'cont', 'next'
|
180
|
+
debug_proc(example_raise) { assert_equal 160, state.line }
|
209
181
|
end
|
210
182
|
end
|
211
183
|
end
|
data/test/support/matchers.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module Minitest::Assertions
|
2
2
|
|
3
3
|
# This matcher checks that given collection is included into the original
|
4
4
|
# collection and in correct order. It accepts both strings and regexps.
|
@@ -61,8 +61,3 @@ module MiniTest::Assertions
|
|
61
61
|
result
|
62
62
|
end
|
63
63
|
end
|
64
|
-
|
65
|
-
module MiniTest::Expectations
|
66
|
-
infect_an_assertion :assert_includes_in_order, :must_include_in_order
|
67
|
-
infect_an_assertion :refute_includes_in_order, :wont_include_in_order
|
68
|
-
end
|
@@ -1,62 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
class TestCase < MiniTest::Spec
|
4
|
-
include TestDsl
|
5
|
-
|
6
|
-
def setup
|
7
|
-
Byebug.handler = Byebug::CommandProcessor.new(Byebug::TestInterface.new)
|
8
|
-
Byebug.breakpoints.clear if Byebug.breakpoints
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.temporary_change_hash hash, key, value
|
12
|
-
before do
|
13
|
-
@old_hashes ||= {}
|
14
|
-
@old_hashes.merge!({ hash => { key => hash[key] } }) do |k, v1, v2|
|
15
|
-
v1.merge(v2)
|
16
|
-
end
|
17
|
-
hash[key] = value
|
18
|
-
end
|
19
|
-
|
20
|
-
after do
|
21
|
-
hash[key] = @old_hashes[hash][key]
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.temporary_change_const klass, const, value
|
26
|
-
before do
|
27
|
-
@old_consts ||= {}
|
28
|
-
old_value = klass.const_defined?(const) ?
|
29
|
-
klass.const_get(const) : :__undefined__
|
30
|
-
@old_consts.merge!({ klass => { const => old_value } }) do |k, v1, v2|
|
31
|
-
v1.merge(v2)
|
32
|
-
end
|
33
|
-
klass.send :remove_const, const if klass.const_defined?(const)
|
34
|
-
klass.const_set const, value unless value == :__undefined__
|
35
|
-
end
|
36
|
-
|
37
|
-
after do
|
38
|
-
klass.send :remove_const, const if klass.const_defined?(const)
|
39
|
-
klass.const_set const, @old_consts[klass][const] unless
|
40
|
-
@old_consts[klass][const] == :__undefined__
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
#
|
46
|
-
# Expand fullpath of a given example file
|
47
|
-
#
|
48
|
-
def fullpath(filename)
|
49
|
-
(Pathname.new(__FILE__) + "../../examples/#{filename}.rb").cleanpath.to_s
|
50
|
-
end
|
51
|
-
|
52
|
-
#
|
53
|
-
# Shorten a fullpath
|
54
|
-
#
|
55
|
-
def shortpath(fullpath)
|
56
|
-
separator = File::ALT_SEPARATOR || File::SEPARATOR
|
57
|
-
"...#{separator}" + fullpath.split(separator)[-3..-1].join(separator)
|
58
|
-
end
|
1
|
+
require_relative 'matchers'
|
2
|
+
require_relative 'test_interface'
|
59
3
|
|
4
|
+
module Byebug::TestUtils
|
60
5
|
#
|
61
6
|
# Adds commands to the input queue, so they will be later retrieved by
|
62
7
|
# Processor, i.e., it emulates user's input.
|
@@ -77,7 +22,7 @@ module TestDsl
|
|
77
22
|
end
|
78
23
|
|
79
24
|
#
|
80
|
-
# Runs the provided Proc
|
25
|
+
# Runs the provided Proc
|
81
26
|
#
|
82
27
|
# You also can specify a block, which will be executed when Processor extracts
|
83
28
|
# all the commands from the input queue. You can use that for making asserts
|
@@ -92,7 +37,7 @@ module TestDsl
|
|
92
37
|
# byebug
|
93
38
|
# puts 'hello'
|
94
39
|
# end
|
95
|
-
# debug_proc(code) { state.line
|
40
|
+
# debug_proc(code) { assert_equal 4, state.line }
|
96
41
|
#
|
97
42
|
def debug_proc(program, &block)
|
98
43
|
Byebug.stubs(:run_init_script)
|
@@ -120,19 +65,19 @@ module TestDsl
|
|
120
65
|
interface.output_queue : args.pop
|
121
66
|
queue_messages = queue.map(&:strip)
|
122
67
|
messages = Array(args).map { |msg| msg.is_a?(String) ? msg.strip : msg }
|
123
|
-
|
68
|
+
send(check_method, messages, queue_messages)
|
124
69
|
end
|
125
70
|
|
126
71
|
def check_error_includes(*args)
|
127
|
-
check_output :
|
72
|
+
check_output :assert_includes_in_order, *args, interface.error_queue
|
128
73
|
end
|
129
74
|
|
130
75
|
def check_output_includes(*args)
|
131
|
-
check_output :
|
76
|
+
check_output :assert_includes_in_order, *args
|
132
77
|
end
|
133
78
|
|
134
79
|
def check_output_doesnt_include(*args)
|
135
|
-
check_output :
|
80
|
+
check_output :refute_includes_in_order, *args
|
136
81
|
end
|
137
82
|
|
138
83
|
def interface
|
@@ -143,6 +88,14 @@ module TestDsl
|
|
143
88
|
Thread.current.thread_variable_get('state')
|
144
89
|
end
|
145
90
|
|
91
|
+
def first_brkpt
|
92
|
+
Byebug.breakpoints.first
|
93
|
+
end
|
94
|
+
|
95
|
+
def last_brkpt
|
96
|
+
Byebug.breakpoints.last
|
97
|
+
end
|
98
|
+
|
146
99
|
def context
|
147
100
|
state.context
|
148
101
|
end
|