@@ -165,10 +165,10 @@ or a `BreakpointRef` if it encountered a wrapper call. In the latter case, call
165
165
to obtain the new execution frame.
166
166
"""
167
167
function next_line! (@nospecialize (recurse), frame:: Frame , istoplevel:: Bool = false )
168
- initial = linenumber (frame)
169
- first = true
170
168
pc = frame. pc
171
- while linenumber (frame, pc) == initial
169
+ initialline, initialfile = linenumber (frame, pc), getfile (frame, pc)
170
+ first = true
171
+ while linenumber (frame, pc) == initialline && getfile (frame, pc) == initialfile
172
172
# If this is a return node, interrupt execution
173
173
expr = pc_expr (frame, pc)
174
174
(! first && isexpr (expr, :return )) && return pc
@@ -197,14 +197,19 @@ function next_line!(@nospecialize(recurse), frame::Frame, istoplevel::Bool=false
197
197
expr = pc_expr (frame)
198
198
end
199
199
# Signal that we've switched frames
200
- switched && return BreakpointRef (frame. framecode, frame. pc)
200
+ if switched
201
+ pc = next_line! (recurse, frame, false )
202
+ pc === nothing && error (" confusing next_line!" )
203
+ lframe = leaf (frame)
204
+ return isa (pc, BreakpointRef) ? pc : BreakpointRef (lframe. framecode, lframe. pc)
205
+ end
201
206
else
202
207
pc = step_expr! (recurse, frame, istoplevel)
203
208
(pc === nothing || isa (pc, BreakpointRef)) && return pc
204
209
end
205
210
shouldbreak (frame, pc) && return BreakpointRef (frame. framecode, pc)
206
211
end
207
- maybe_next_call! (recurse, frame, pc )
212
+ maybe_next_call! (recurse, frame, istoplevel )
208
213
end
209
214
next_line! (frame:: Frame , istoplevel:: Bool = false ) = next_line! (finish_and_return!, frame, istoplevel)
210
215
0 commit comments