Skip to content

Commit dd9b7e5

Browse files
committed
updates
1 parent 5c1a0be commit dd9b7e5

File tree

3 files changed

+55
-28
lines changed

3 files changed

+55
-28
lines changed

src/commands.jl

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,9 @@ function unwind_exception(frame::Frame, exc)
283283
frame.framedata.last_exception[] = exc
284284
return frame
285285
end
286-
frame = frame.caller
286+
# recycle(frame)
287+
frame = caller(frame)
288+
frame === nothing || (frame.callee = nothing)
287289
end
288290
rethrow(exc)
289291
end
@@ -319,34 +321,39 @@ function debug_command(@nospecialize(recurse), frame::Frame, cmd::AbstractString
319321
cmd == "nc" && return maybe_reset_frame!(recurse, frame, next_call!(recurse, frame, istoplevel), rootistoplevel)
320322
cmd == "n" && return maybe_reset_frame!(recurse, frame, next_line!(recurse, frame, istoplevel), rootistoplevel)
321323
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)
322349
catch err
323350
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)
337355
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
348356
end
349-
cmd == "finish" && return maybe_reset_frame!(recurse, frame, finish!(recurse, frame, istoplevel), rootistoplevel)
350357
throw(ArgumentError("command $cmd not recognized"))
351358
end
352359
debug_command(frame::Frame, cmd::AbstractString, rootistoplevel::Bool=false) =

test/debug.jl

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,18 +142,28 @@ end
142142
end
143143
f_exc_inner() = error()
144144
fr = JuliaInterpreter.enter_call(f_exc_outer)
145-
fr, pc = debug_command(fr, "s")
146-
fr, pc = debug_command(fr, "n")
147-
fr, pc = debug_command(fr, "n")
145+
fr, pc = debug_command(fr, "s")
146+
fr, pc = debug_command(fr, "n")
147+
fr, pc = debug_command(fr, "n")
148148
debug_command(fr, "finish")
149149
@test get_return(fr) == 2
150150
@test first(err_caught) isa ErrorException
151+
@test stacklength(fr) == 1
152+
153+
err_caught = Any[nothing]
154+
fr = JuliaInterpreter.enter_call(f_exc_outer)
155+
fr, pc = debug_command(fr, "s")
156+
debug_command(fr, "c")
157+
@test get_return(root(fr)) == 2
158+
@test first(err_caught) isa ErrorException
159+
@test stacklength(root(fr)) == 1
151160

152161
# Rethrow on uncaught exceptions
153162
f_outer() = g_inner()
154163
g_inner() = error()
155164
fr = JuliaInterpreter.enter_call(f_outer)
156165
@test_throws ErrorException debug_command(fr, "finish")
166+
@test stacklength(fr) == 1
157167

158168
# Break on error
159169
try

test/utils.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,16 @@ using JuliaInterpreter: finish_and_return!, evaluate_call!, step_expr!, shouldbr
66
using Base.Meta: isexpr
77
using Test, Random, SHA
88

9+
function stacklength(frame)
10+
n = 1
11+
frame = frame.callee
12+
while frame !== nothing
13+
n += 1
14+
frame = frame.callee
15+
end
16+
return n
17+
end
18+
919
# Execute a frame using Julia's regular compiled-code dispatch for any :call expressions
1020
runframe(frame) = Some{Any}(finish_and_return!(Compiled(), frame))
1121

0 commit comments

Comments
 (0)