Skip to content

Commit 20bb999

Browse files
committed
Adjust ThreadClient's frames management for nested subsession change (#558)
1 parent 9f6352b commit 20bb999

File tree

2 files changed

+78
-5
lines changed

2 files changed

+78
-5
lines changed

lib/debug/thread_client.rb

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ def initialize id, q_evt, q_cmd, thr = Thread.current
8585
@is_management = false
8686
@id = id
8787
@thread = thr
88-
@target_frames = nil
88+
@frame_index_stack = []
89+
@frames_stack = []
8990
@q_evt = q_evt
9091
@q_cmd = q_cmd
9192
@step_tp = nil
@@ -102,19 +103,27 @@ def initialize id, q_evt, q_cmd, thr = Thread.current
102103
end
103104

104105
def target_frames
105-
@target_frames
106+
@frames_stack.last
106107
end
107108

108109
def set_target_frames(frames)
109-
@target_frames = frames
110+
@frames_stack << frames
111+
end
112+
113+
def pop_target_frames
114+
@frames_stack.pop
110115
end
111116

112117
def current_frame_index
113-
@current_frame_index
118+
@frame_index_stack.last
114119
end
115120

116121
def set_current_frame_index(i)
117-
@current_frame_index = i
122+
@frame_index_stack << i
123+
end
124+
125+
def pop_current_frame_index
126+
@frame_index_stack.pop
118127
end
119128

120129
def deactivate
@@ -298,6 +307,9 @@ def suspend event, tp = nil, bp: nil, sig: nil, postmortem_frames: nil, replay_f
298307
end
299308

300309
wait_next_action
310+
ensure
311+
pop_target_frames
312+
pop_current_frame_index
301313
end
302314

303315
def replay_suspend

test/debug/break_test.rb

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -722,4 +722,65 @@ def test_the_path_option_supersede_skip_path_config
722722
end
723723
end
724724
end
725+
726+
class NestedBreakTest < TestCase
727+
def program
728+
<<~RUBY
729+
1| class Foo
730+
2| def self.bar(num)
731+
3| num
732+
4| end
733+
5| end
734+
6|
735+
7| a = 10
736+
8| binding.b
737+
RUBY
738+
end
739+
740+
if RUBY_VERSION >= "3.1.0"
741+
def test_method_breakpoint_can_be_triggered_inside_another_breakpoint
742+
debug_code(program) do
743+
type "break Foo.bar"
744+
type "c"
745+
746+
# stops at the first breakpoint
747+
assert_line_num(8)
748+
749+
# enters the second breakpoint
750+
type "Foo.bar(a)"
751+
assert_line_num(3)
752+
type "num + 10"
753+
assert_line_text(/20/)
754+
type "c"
755+
756+
# returns to the first breakpoint
757+
assert_line_num(8)
758+
type "a + 100"
759+
assert_line_text(/110/)
760+
761+
type "c"
762+
end
763+
end
764+
else
765+
def test_nested_breakpoint_will_be_ignored
766+
debug_code(program) do
767+
type "break Foo.bar"
768+
type "c"
769+
770+
# stops at the first breakpoint
771+
assert_line_num(8)
772+
773+
# doesn't enter the another subsession
774+
type "Foo.bar(a)"
775+
776+
# returns to the first breakpoint
777+
assert_line_num(8)
778+
type "a + 100"
779+
assert_line_text(/110/)
780+
781+
type "c"
782+
end
783+
end
784+
end
785+
end
725786
end

0 commit comments

Comments
 (0)