@@ -272,6 +272,22 @@ function maybe_reset_frame!(@nospecialize(recurse), frame::Frame, @nospecialize(
272
272
return frame, pc
273
273
end
274
274
275
+ # Unwind the stack until an exc is eventually caught, thereby
276
+ # returning the frame that caught the exception at the pc of the catch
277
+ # or rethrow the error
278
+ function unwind_exception (frame:: Frame , exc)
279
+ while frame != = nothing
280
+ if ! isempty (frame. framedata. exception_frames)
281
+ # Exception caught
282
+ frame. pc = frame. framedata. exception_frames[end ]
283
+ frame. framedata. last_exception[] = exc
284
+ return frame
285
+ end
286
+ frame = frame. caller
287
+ end
288
+ rethrow (exc)
289
+ end
290
+
275
291
"""
276
292
ret = debug_command(recurse, frame, cmd, rootistoplevel=false)
277
293
ret = debug_command(frame, cmd, rootistoplevel=false)
@@ -294,16 +310,19 @@ or one of the 'advanced' commands
294
310
Unlike other commands, the default setting for `recurse` is `Compiled()`.
295
311
"""
296
312
function debug_command (@nospecialize (recurse), frame:: Frame , cmd:: AbstractString , rootistoplevel:: Bool = false )
297
- # ::Union{Val{:nc},Val{:n},Val{:se}},
298
- # Need try/catch
299
313
istoplevel = rootistoplevel && frame. caller === nothing
300
- cmd == " nc" && return maybe_reset_frame! (recurse, frame, next_call! (recurse, frame, istoplevel), rootistoplevel)
301
- cmd == " n" && return maybe_reset_frame! (recurse, frame, next_line! (recurse, frame, istoplevel), rootistoplevel)
302
314
if cmd == " si"
303
315
stmt = pc_expr (frame)
304
316
cmd = is_call (stmt) ? " s" : " se"
305
317
end
306
- cmd == " se" && return maybe_reset_frame! (recurse, frame, step_expr! (recurse, frame, istoplevel), rootistoplevel)
318
+ try
319
+ cmd == " nc" && return maybe_reset_frame! (recurse, frame, next_call! (recurse, frame, istoplevel), rootistoplevel)
320
+ cmd == " n" && return maybe_reset_frame! (recurse, frame, next_line! (recurse, frame, istoplevel), rootistoplevel)
321
+ cmd == " se" && return maybe_reset_frame! (recurse, frame, step_expr! (recurse, frame, istoplevel), rootistoplevel)
322
+ catch err
323
+ frame = unwind_exception (frame, err)
324
+ return debug_command (recurse, frame, " nc" , istoplevel)
325
+ end
307
326
enter_generated = false
308
327
if cmd == " sg"
309
328
enter_generated = true
0 commit comments