Skip to content

Commit 119b686

Browse files
authored
Improve breakpoints on Julia 1.12 (#669)
This doesn't get all tests passing, but most uses of breakpoints now work.
1 parent c12d8e0 commit 119b686

File tree

5 files changed

+22
-2
lines changed

5 files changed

+22
-2
lines changed

src/optimize.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ function smallest_ref(stmts, arg, idmin)
3838
return idmin
3939
end
4040

41-
const isbindingresolved_deprecated = which(Base.isbindingresolved, Tuple{Module, Symbol}).file == Symbol("deprecated.jl")
4241
function lookup_global_ref(a::GlobalRef)
4342
isbindingresolved_deprecated && return a
4443
if Base.isbindingresolved(a.mod, a.name) &&

src/packagedef.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ else
2828
const Scope = Any
2929
end
3030

31+
const isbindingresolved_deprecated = which(Base.isbindingresolved, Tuple{Module, Symbol}).file == Symbol("deprecated.jl")
32+
3133
include("types.jl")
3234
include("utils.jl")
3335
include("construct.jl")

src/types.jl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,13 @@ function is_breakpoint_expr(ex::Expr)
123123
q = ex.args[3]
124124
return isa(q, QuoteNode) && q.value === :__BREAKPOINT_MARKER__
125125
end
126+
127+
@static if isbindingresolved_deprecated
128+
is_breakpoint_marker(stmt) = is_global_ref(stmt, JuliaInterpreter, :__BREAK_POINT_MARKER__)
129+
else
130+
is_breakpoint_marker(stmt) = stmt === __BREAK_POINT_MARKER__
131+
end
132+
126133
function FrameCode(scope, src::CodeInfo; generator=false, optimize=true)
127134
if optimize
128135
src, methodtables = optimize!(copy(src), scope)
@@ -132,7 +139,7 @@ function FrameCode(scope, src::CodeInfo; generator=false, optimize=true)
132139
end
133140
breakpoints = Vector{BreakpointState}(undef, length(src.code))
134141
for (i, pc_expr) in enumerate(src.code)
135-
if lookup_stmt(src.code, pc_expr) === __BREAK_POINT_MARKER__
142+
if is_breakpoint_marker(lookup_stmt(src.code, pc_expr))
136143
breakpoints[i] = BreakpointState()
137144
src.code[i] = nothing
138145
end

test/debug.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,9 @@ end
203203
frame = JuliaInterpreter.enter_call(f, 2; b = 4)
204204
fr = JuliaInterpreter.maybe_step_through_wrapper!(frame)
205205
fr, pc = debug_command(fr, :nc)
206+
if !isa(pc_expr(fr, pc), Core.ReturnNode) # Julia 1.12 has an extra step for global lookup
207+
fr, pc = debug_command(fr, :nc)
208+
end
206209
debug_command(fr, :nc)
207210
@test get_return(frame) == 6
208211
end
@@ -395,6 +398,9 @@ end
395398
@testset "invokelatest" begin
396399
fr = JuliaInterpreter.enter_call(f_inv_latest, 2.0)
397400
fr, pc = JuliaInterpreter.debug_command(fr, :nc)
401+
while is_getproperty(pc_expr(fr, pc).args[1]) # Julia 1.12 has more steps for global lookup
402+
fr, pc = JuliaInterpreter.debug_command(fr, :nc)
403+
end
398404
frame, pc = JuliaInterpreter.debug_command(fr, :s) # step into invokelatest
399405
@test frame.framecode.scope.sig == Tuple{typeof(f_inv),Real}
400406
JuliaInterpreter.debug_command(frame, :c)

test/utils.jl

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

9+
@static if JuliaInterpreter.isbindingresolved_deprecated
10+
is_getproperty(stmt) = JuliaInterpreter.is_global_ref(stmt, Base, :getproperty)
11+
else
12+
is_getproperty(stmt) = JuliaInterpreter.is_quotenode_egal(stmt, Base.getproperty)
13+
end
14+
915
function stacklength(frame)
1016
n = 1
1117
frame = frame.callee

0 commit comments

Comments
 (0)