@@ -283,7 +283,9 @@ function unwind_exception(frame::Frame, exc)
283
283
frame. framedata. last_exception[] = exc
284
284
return frame
285
285
end
286
- frame = frame. caller
286
+ # recycle(frame)
287
+ frame = caller (frame)
288
+ frame === nothing || (frame. callee = nothing )
287
289
end
288
290
rethrow (exc)
289
291
end
@@ -319,34 +321,39 @@ function debug_command(@nospecialize(recurse), frame::Frame, cmd::AbstractString
319
321
cmd == " nc" && return maybe_reset_frame! (recurse, frame, next_call! (recurse, frame, istoplevel), rootistoplevel)
320
322
cmd == " n" && return maybe_reset_frame! (recurse, frame, next_line! (recurse, frame, istoplevel), rootistoplevel)
321
323
cmd == " se" && return maybe_reset_frame! (recurse, frame, step_expr! (recurse, frame, istoplevel), rootistoplevel)
324
+
325
+ enter_generated = false
326
+ if cmd == " sg"
327
+ enter_generated = true
328
+ cmd = " s"
329
+ end
330
+ if cmd == " s"
331
+ pc = maybe_next_call! (recurse, frame, istoplevel)
332
+ (isa (pc, BreakpointRef) || pc === nothing ) && return maybe_reset_frame! (recurse, frame, pc, rootistoplevel)
333
+ stmt0 = stmt = pc_expr (frame, pc)
334
+ if isexpr (stmt, :(= ))
335
+ stmt = stmt. args[2 ]
336
+ end
337
+ ret = evaluate_call! (dummy_breakpoint, frame, stmt; enter_generated= enter_generated)
338
+ isa (ret, BreakpointRef) && return maybe_reset_frame! (recurse, frame, ret, rootistoplevel)
339
+ maybe_assign! (frame, stmt0, ret)
340
+ frame. pc = ret + 1
341
+ return frame, frame. pc
342
+ end
343
+ if cmd == " c"
344
+ r = root (frame)
345
+ ret = finish_stack! (recurse, r, rootistoplevel)
346
+ return isa (ret, BreakpointRef) ? (leaf (r), ret) : nothing
347
+ end
348
+ cmd == " finish" && return maybe_reset_frame! (recurse, frame, finish! (recurse, frame, istoplevel), rootistoplevel)
322
349
catch err
323
350
frame = unwind_exception (frame, err)
324
- return debug_command (recurse, frame, " nc" , istoplevel)
325
- end
326
- enter_generated = false
327
- if cmd == " sg"
328
- enter_generated = true
329
- cmd = " s"
330
- end
331
- if cmd == " s"
332
- pc = maybe_next_call! (recurse, frame, istoplevel)
333
- (isa (pc, BreakpointRef) || pc === nothing ) && return maybe_reset_frame! (recurse, frame, pc, rootistoplevel)
334
- stmt0 = stmt = pc_expr (frame, pc)
335
- if isexpr (stmt, :(= ))
336
- stmt = stmt. args[2 ]
351
+ if cmd == " c"
352
+ return debug_command (recurse, frame, " c" , istoplevel)
353
+ else
354
+ return debug_command (recurse, frame, " nc" , istoplevel)
337
355
end
338
- ret = evaluate_call! (dummy_breakpoint, frame, stmt; enter_generated= enter_generated)
339
- isa (ret, BreakpointRef) && return maybe_reset_frame! (recurse, frame, ret, rootistoplevel)
340
- maybe_assign! (frame, stmt0, ret)
341
- frame. pc = ret + 1
342
- return frame, frame. pc
343
- end
344
- if cmd == " c"
345
- r = root (frame)
346
- ret = finish_stack! (recurse, r, rootistoplevel)
347
- return isa (ret, BreakpointRef) ? (leaf (r), ret) : nothing
348
356
end
349
- cmd == " finish" && return maybe_reset_frame! (recurse, frame, finish! (recurse, frame, istoplevel), rootistoplevel)
350
357
throw (ArgumentError (" command $cmd not recognized" ))
351
358
end
352
359
debug_command (frame:: Frame , cmd:: AbstractString , rootistoplevel:: Bool = false ) =
0 commit comments