Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit a3cb3e6

Browse files
authoredMar 16, 2019
Merge branch 'master' into teh/fix_161
2 parents 46e5452 + d486348 commit a3cb3e6

File tree

7 files changed

+152
-112
lines changed

7 files changed

+152
-112
lines changed
 

‎Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "JuliaInterpreter"
22
uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a"
3-
version = "0.1.1"
3+
version = "0.2.0"
44

55
[deps]
66
CodeTracking = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2"

‎docs/src/dev_reference.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ breakpoint
6060
enable
6161
disable
6262
remove
63+
break_on
64+
break_off
6365
JuliaInterpreter.dummy_breakpoint
6466
```
6567

‎src/JuliaInterpreter.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ using CodeTracking
1414

1515
export @interpret, Compiled, Frame, root, leaf,
1616
BreakpointRef, breakpoint, @breakpoint, breakpoints, enable, disable, remove,
17-
debug_command, @bp
17+
debug_command, @bp, break_on, break_off
1818

1919
module CompiledCalls
2020
# This module is for handling intrinsics that must be compiled (llvmcall)

‎src/breakpoints.jl

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,40 @@ function remove()
129129
return nothing
130130
end
131131

132+
"""
133+
break_on(states...)
134+
135+
Turn on automatic breakpoints when any of the conditions described in `states` occurs.
136+
The supported states are:
137+
138+
- `:error`: trigger a breakpoint any time an uncaught exception is thrown
139+
"""
140+
function break_on(states::Vararg{Symbol})
141+
for state in states
142+
if state == :error
143+
break_on_error[] = true
144+
else
145+
throw(ArgumentError(string("unsupported state :", state)))
146+
end
147+
end
148+
end
149+
150+
"""
151+
break_off(states...)
152+
153+
Turn off automatic breakpoints when any of the conditions described in `states` occurs.
154+
See [`break_on`](@ref) for a description of valid states.
155+
"""
156+
function break_off(states::Vararg{Symbol})
157+
for state in states
158+
if state == :error
159+
break_on_error[] = false
160+
else
161+
throw(ArgumentError(string("unsupported state :", state)))
162+
end
163+
end
164+
end
165+
132166
"""
133167
breakpoint(f, sig)
134168
breakpoint(f, sig, line)

‎src/commands.jl

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -297,38 +297,38 @@ end
297297
298298
Perform one "debugger" command. `cmd` should be one of:
299299
300-
- "n": advance to the next line
301-
- "s": step into the next call
302-
- "c": continue execution until termination or reaching a breakpoint
303-
- "finish": finish the current frame and return to the parent
300+
- `:n`: advance to the next line
301+
- `:s`: step into the next call
302+
- `:c`: continue execution until termination or reaching a breakpoint
303+
- `:finish`: finish the current frame and return to the parent
304304
305305
or one of the 'advanced' commands
306306
307-
- "nc": step forward to the next call
308-
- "se": execute a single statement
309-
- "si": execute a single statement, stepping in if it's a call
310-
- "sg": step into the generator of a generated function
307+
- `:nc`: step forward to the next call
308+
- `:se`: execute a single statement
309+
- `:si`: execute a single statement, stepping in if it's a call
310+
- `:sg`: step into the generator of a generated function
311311
312312
`rootistoplevel` and `ret` are as described for [`JuliaInterpreter.maybe_reset_frame!`](@ref).
313313
"""
314-
function debug_command(@nospecialize(recurse), frame::Frame, cmd::AbstractString, rootistoplevel::Bool=false)
314+
function debug_command(@nospecialize(recurse), frame::Frame, cmd::Symbol, rootistoplevel::Bool=false)
315315
istoplevel = rootistoplevel && frame.caller === nothing
316316
cmd0 = cmd
317-
if cmd == "si"
317+
if cmd == :si
318318
stmt = pc_expr(frame)
319-
cmd = is_call(stmt) ? "s" : "se"
319+
cmd = is_call(stmt) ? :s : :se
320320
end
321321
try
322-
cmd == "nc" && return maybe_reset_frame!(recurse, frame, next_call!(recurse, frame, istoplevel), rootistoplevel)
323-
cmd == "n" && return maybe_reset_frame!(recurse, frame, next_line!(recurse, frame, istoplevel), rootistoplevel)
324-
cmd == "se" && return maybe_reset_frame!(recurse, frame, step_expr!(recurse, frame, istoplevel), rootistoplevel)
322+
cmd == :nc && return maybe_reset_frame!(recurse, frame, next_call!(recurse, frame, istoplevel), rootistoplevel)
323+
cmd == :n && return maybe_reset_frame!(recurse, frame, next_line!(recurse, frame, istoplevel), rootistoplevel)
324+
cmd == :se && return maybe_reset_frame!(recurse, frame, step_expr!(recurse, frame, istoplevel), rootistoplevel)
325325

326326
enter_generated = false
327-
if cmd == "sg"
327+
if cmd == :sg
328328
enter_generated = true
329-
cmd = "s"
329+
cmd = :s
330330
end
331-
if cmd == "s"
331+
if cmd == :s
332332
pc = maybe_next_call!(recurse, frame, istoplevel)
333333
(isa(pc, BreakpointRef) || pc === nothing) && return maybe_reset_frame!(recurse, frame, pc, rootistoplevel)
334334
stmt0 = stmt = pc_expr(frame, pc)
@@ -345,7 +345,7 @@ function debug_command(@nospecialize(recurse), frame::Frame, cmd::AbstractString
345345
end
346346
if isa(ret, BreakpointRef)
347347
newframe = leaf(frame)
348-
cmd0 == "si" && return newframe, ret
348+
cmd0 == :si && return newframe, ret
349349
newframe = maybe_step_through_wrapper!(recurse, newframe)
350350
return newframe, BreakpointRef(newframe.framecode, 0)
351351
end
@@ -354,21 +354,21 @@ function debug_command(@nospecialize(recurse), frame::Frame, cmd::AbstractString
354354
frame.pc += 1
355355
return frame, frame.pc
356356
end
357-
if cmd == "c"
357+
if cmd == :c
358358
r = root(frame)
359359
ret = finish_stack!(recurse, r, rootistoplevel)
360360
return isa(ret, BreakpointRef) ? (leaf(r), ret) : nothing
361361
end
362-
cmd == "finish" && return maybe_reset_frame!(recurse, frame, finish!(recurse, frame, istoplevel), rootistoplevel)
362+
cmd == :finish && return maybe_reset_frame!(recurse, frame, finish!(recurse, frame, istoplevel), rootistoplevel)
363363
catch err
364364
frame = unwind_exception(frame, err)
365-
if cmd == "c"
366-
return debug_command(recurse, frame, "c", istoplevel)
365+
if cmd == :c
366+
return debug_command(recurse, frame, :c, istoplevel)
367367
else
368-
return debug_command(recurse, frame, "nc", istoplevel)
368+
return debug_command(recurse, frame, :nc, istoplevel)
369369
end
370370
end
371371
throw(ArgumentError("command $cmd not recognized"))
372372
end
373-
debug_command(frame::Frame, cmd::AbstractString, rootistoplevel::Bool=false) =
373+
debug_command(frame::Frame, cmd::Symbol, rootistoplevel::Bool=false) =
374374
debug_command(finish_and_return!, frame, cmd, rootistoplevel)

‎test/breakpoints.jl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,8 @@ end
130130

131131
# break on error
132132
try
133-
JuliaInterpreter.break_on_error[] = true
133+
@test_throws ArgumentError("unsupported state :missing") break_on(:missing)
134+
break_on(:error)
134135

135136
inner(x) = error("oops")
136137
outer() = inner(1)
@@ -158,7 +159,7 @@ end
158159
@test v isa ErrorException
159160
@test stacklength(frame) == 1
160161
finally
161-
JuliaInterpreter.break_on_error[] = false
162+
break_off(:error)
162163
end
163164

164165
# Breakpoint display

‎test/debug.jl

Lines changed: 87 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,31 @@ using JuliaInterpreter, Test
22
using JuliaInterpreter: enter_call, enter_call_expr, get_return, @lookup
33
using Base.Meta: isexpr
44

5-
function step_through(frame)
6-
r = root(frame)
7-
@test debug_command(JuliaInterpreter.finish_and_return!, frame, "c") === nothing
8-
@test r.callee === nothing
9-
return get_return(r)
10-
end
5+
const ALL_COMMANDS = (:n, :s, :c, :finish, :nc, :se, :si)
116

12-
function step_through_function(f, args...)
13-
frame = JuliaInterpreter.enter_call(f, args...)
7+
function step_through_command(fr::Frame, cmd::Symbol)
148
while true
15-
ret = JuliaInterpreter.debug_command(JuliaInterpreter.finish_and_return!, frame, "s")
9+
ret = JuliaInterpreter.debug_command(JuliaInterpreter.finish_and_return!, fr, cmd)
1610
ret == nothing && break
17-
frame, pc = ret
11+
fr, pc = ret
12+
end
13+
@test fr.callee === nothing
14+
@test fr.caller === nothing
15+
return get_return(fr)
16+
end
17+
18+
function step_through_frame(frame_creator)
19+
rets = []
20+
for cmd in ALL_COMMANDS
21+
frame = frame_creator()
22+
ret = step_through_command(frame, cmd)
23+
push!(rets, ret)
1824
end
19-
@test frame.callee === nothing
20-
@test frame.caller === nothing
21-
return JuliaInterpreter.get_return(frame)
25+
@test all(ret -> ret == rets[1], rets)
26+
return rets[1]
2227
end
28+
step_through(f, args...; kwargs...) = step_through_frame(() -> enter_call(f, args...; kwargs...))
29+
step_through(expr::Expr) = step_through_frame(() -> enter_call_expr(expr))
2330

2431
@generated function generatedfoo(x)
2532
:(return x)
@@ -45,7 +52,7 @@ struct B{T} end
4552
# @testset "Debug" begin
4653
@testset "Basics" begin
4754
frame = enter_call(map, x->2x, 1:10)
48-
@test debug_command(frame, "finish") === nothing
55+
@test debug_command(frame, :finish) === nothing
4956
@test frame.caller === frame.callee === nothing
5057
@test get_return(frame) == map(x->2x, 1:10)
5158

@@ -55,65 +62,62 @@ struct B{T} end
5562
end
5663
for (args, kwargs) in (((1,), ()), ((1, 2), (x=7, y=33)))
5764
frame = enter_call(complicated_keyword_stuff, args...; kwargs...)
58-
f, pc = debug_command(frame, "n")
65+
f, pc = debug_command(frame, :n)
5966
@test f === frame
6067
@test isa(pc, Int)
61-
@test debug_command(frame, "finish") === nothing
68+
@test debug_command(frame, :finish) === nothing
6269
@test frame.caller === frame.callee === nothing
6370
@test get_return(frame) == complicated_keyword_stuff(args...; kwargs...)
6471
end
6572

6673
f22() = string(:(a+b))
67-
@test step_through(enter_call(f22)) == "a + b"
68-
@test step_through_function(f22) == "a + b"
74+
@test step_through(f22) == "a + b"
6975
f22() = string(QuoteNode(:a))
70-
@test step_through(enter_call(f22)) == ":a"
71-
@test step_through_function(f22) == ":a"
76+
@test step_through(f22) == ":a"
7277

7378
frame = enter_call(trivial, 2)
74-
@test debug_command(frame, "s") === nothing
79+
@test debug_command(frame, :s) === nothing
7580
@test get_return(frame) == 2
7681

77-
@test step_through(enter_call(trivial, 2)) == 2
78-
@test step_through_function(trivial, 2) == 2
79-
@test step_through(enter_call_expr(:($(+)(1,2.5)))) == 3.5
80-
@test step_through(enter_call_expr(:($(sin)(1)))) == sin(1)
81-
@test step_through(enter_call_expr(:($(gcd)(10,20)))) == gcd(10, 20)
82+
@test step_through(trivial, 2) == 2
83+
@test step_through(:($(+)(1,2.5))) == 3.5
84+
@test step_through(:($(sin)(1))) == sin(1)
85+
@test step_through(:($(gcd)(10,20))) == gcd(10, 20)
8286
end
8387

8488
@testset "generated" begin
8589
frame = enter_call_expr(:($(callgenerated)()))
86-
f, pc = debug_command(frame, "s")
90+
f, pc = debug_command(frame, :s)
8791
@test isa(pc, BreakpointRef)
8892
@test JuliaInterpreter.scopeof(f).name == :generatedfoo
8993
stmt = JuliaInterpreter.pc_expr(f)
9094
@test stmt.head == :return
91-
@test debug_command(frame, "c") === nothing
95+
@test debug_command(frame, :c) === nothing
9296
@test frame.callee === nothing
9397
@test get_return(frame) === 1
9498
# This time, step into the generated function itself
9599
frame = enter_call_expr(:($(callgenerated)()))
96-
f, pc = debug_command(frame, "sg")
100+
f, pc = debug_command(frame, :sg)
97101
@test isa(pc, BreakpointRef)
98102
@test JuliaInterpreter.scopeof(f).name == :generatedfoo
99103
stmt = JuliaInterpreter.pc_expr(f)
100104
@test stmt.head == :return
101-
f2, pc = debug_command(f, "finish")
105+
f2, pc = debug_command(f, :finish)
102106
@test JuliaInterpreter.scopeof(f2).name == :callgenerated
103107
# Now finish the regular function
104-
@test debug_command(frame, "finish") === nothing
108+
@test debug_command(frame, :finish) === nothing
105109
@test frame.callee === nothing
106110
@test get_return(frame) === Int
107111

108112
# Parametric generated function (see #157)
109113
frame = fr = JuliaInterpreter.enter_call(callgeneratedparams)
110114
while fr.pc < JuliaInterpreter.nstatements(fr.framecode) - 1
111-
fr, pc = debug_command(fr, "se")
115+
fr, pc = debug_command(fr, :se)
112116
end
113-
fr, pc = debug_command(fr, "sg")
117+
fr, pc = debug_command(fr, :sg)
114118
@test JuliaInterpreter.scopeof(fr).name == :generatedparams
115-
fr, pc = debug_command(fr, "finish")
116-
@test debug_command(fr, "finish") === nothing
119+
fr, pc = debug_command(fr, :finish)
120+
@test debug_command(fr, :finish) === nothing
117121
@test JuliaInterpreter.get_return(fr) == (Int, 2)
118122
end
119123

@@ -124,33 +128,33 @@ struct B{T} end
124128
end
125129
frame = JuliaInterpreter.enter_call_expr(:($(optional)()))
126130
# First call steps in and executes the first statement
127-
f, pc = debug_command(frame, "n")
131+
f, pc = debug_command(frame, :n)
128132
@test frame !== f
129133
# cos(1.0)
130-
debug_command(f, "n")
134+
debug_command(f, :n)
131135
# return
132-
f2, pc = debug_command(f, "n")
136+
f2, pc = debug_command(f, :n)
133137
@test f2 === frame
134-
@test debug_command(frame, "n") === nothing
138+
@test debug_command(frame, :n) === nothing
135139
end
136140

137141
@testset "Keyword arguments" begin
138142
f(x; b = 1) = x+b
139143
g() = f(1; b = 2)
140144
frame = JuliaInterpreter.enter_call_expr(:($(g)()));
141-
fr, pc = debug_command(frame, "nc")
142-
fr, pc = debug_command(fr, "nc")
143-
fr, pc = debug_command(fr, "nc")
144-
fr, pc = debug_command(fr, "s")
145-
fr, pc = debug_command(fr, "finish")
146-
@test debug_command(fr, "finish") === nothing
145+
fr, pc = debug_command(frame, :nc)
146+
fr, pc = debug_command(fr, :nc)
147+
fr, pc = debug_command(fr, :nc)
148+
fr, pc = debug_command(fr, :s)
149+
fr, pc = debug_command(fr, :finish)
150+
@test debug_command(fr, :finish) === nothing
147151
@test frame.callee === nothing
148152
@test get_return(frame) == 3
149153

150154
frame = JuliaInterpreter.enter_call(f, 2; b = 4)
151155
fr = JuliaInterpreter.maybe_step_through_wrapper!(frame)
152-
fr, pc = debug_command(fr, "nc")
153-
fr, pc = debug_command(fr, "nc")
156+
fr, pc = debug_command(fr, :nc)
157+
fr, pc = debug_command(fr, :nc)
154158
@test get_return(frame) == 6
155159
end
156160

@@ -167,16 +171,16 @@ struct B{T} end
167171
frame = fr = JuliaInterpreter.enter_call(f)
168172
pc = fr.pc
169173
while pc <= JuliaInterpreter.nstatements(fr.framecode) - 2
170-
fr, pc = debug_command(fr, "se")
174+
fr, pc = debug_command(fr, :se)
171175
end
172-
fr, pc = debug_command(frame, "si")
176+
fr, pc = debug_command(frame, :si)
173177
@test stacklength(frame) == 2
174178
frame = fr = JuliaInterpreter.enter_call(f)
175179
pc = fr.pc
176180
while pc <= JuliaInterpreter.nstatements(fr.framecode) - 2
177-
fr, pc = debug_command(fr, "se")
181+
fr, pc = debug_command(fr, :se)
178182
end
179-
fr, pc = debug_command(frame, "s")
183+
fr, pc = debug_command(frame, :s)
180184
@test stacklength(frame) > 2
181185
push!(scopes, JuliaInterpreter.scopeof(fr))
182186
end
@@ -195,21 +199,21 @@ struct B{T} end
195199
end
196200
""","file.jl")
197201
frame = JuliaInterpreter.enter_call_expr(:($(test_macro)()))
198-
f, pc = debug_command(frame, "n") # a is set
199-
f, pc = debug_command(f, "n") # b is set
200-
f, pc = debug_command(f, "n") # x is set
201-
f, pc = debug_command(f, "n") # y is set
202-
f, pc = debug_command(f, "n") # z is set
203-
@test debug_command(f, "n") === nothing # return
202+
f, pc = debug_command(frame, :n) # a is set
203+
f, pc = debug_command(f, :n) # b is set
204+
f, pc = debug_command(f, :n) # x is set
205+
f, pc = debug_command(f, :n) # y is set
206+
f, pc = debug_command(f, :n) # z is set
207+
@test debug_command(f, :n) === nothing # return
204208
end
205209

206210
@testset "Quoting" begin
207211
# Test that symbols don't get an extra QuoteNode
208212
f_symbol() = :limit => true
209213
frame = JuliaInterpreter.enter_call(f_symbol)
210-
fr, pc = debug_command(frame, "s")
211-
fr, pc = debug_command(fr, "finish")
212-
@test debug_command(fr, "finish") === nothing
214+
fr, pc = debug_command(frame, :s)
215+
fr, pc = debug_command(fr, :finish)
216+
@test debug_command(fr, :finish) === nothing
213217
@test get_return(frame) == f_symbol()
214218
end
215219

@@ -220,13 +224,13 @@ struct B{T} end
220224
# depending on whether this is in or out of a @testset, the first statement may differ
221225
stmt1 = fr.framecode.src.code[1]
222226
if isexpr(stmt1, :call) && @lookup(frame, stmt1.args[1]) === getfield
223-
fr, pc = debug_command(fr, "se")
227+
fr, pc = debug_command(fr, :se)
224228
end
225-
fr, pc = debug_command(fr, "s")
226-
fr, pc = debug_command(fr, "n")
229+
fr, pc = debug_command(fr, :s)
230+
fr, pc = debug_command(fr, :n)
227231
@test root(fr) !== fr
228-
fr, pc = debug_command(fr, "finish")
229-
@test debug_command(fr, "finish") === nothing
232+
fr, pc = debug_command(fr, :finish)
233+
@test debug_command(fr, :finish) === nothing
230234
@test get_return(frame) === 2
231235
end
232236

@@ -236,15 +240,14 @@ struct B{T} end
236240
return x + y
237241
end
238242
B_inst = B{Int}()
239-
step_through(JuliaInterpreter.enter_call(B_inst, 10)) == B_inst(10)
240-
step_through_function(B_inst, 10) == B_inst(10)
243+
step_through(B_inst, 10) == B_inst(10)
241244
end
242245

243246
@testset "Exceptions" begin
244247
# Don't break on caught exceptions
245248
err_caught = Any[nothing]
246249
function f_exc_outer()
247-
try
250+
try
248251
f_exc_inner()
249252
catch err;
250253
err_caught[1] = err
@@ -254,18 +257,18 @@ struct B{T} end
254257
end
255258
f_exc_inner() = error()
256259
fr = JuliaInterpreter.enter_call(f_exc_outer)
257-
fr, pc = debug_command(fr, "s")
258-
fr, pc = debug_command(fr, "n")
259-
fr, pc = debug_command(fr, "n")
260-
debug_command(fr, "finish")
260+
fr, pc = debug_command(fr, :s)
261+
fr, pc = debug_command(fr, :n)
262+
fr, pc = debug_command(fr, :n)
263+
debug_command(fr, :finish)
261264
@test get_return(fr) == 2
262265
@test first(err_caught) isa ErrorException
263266
@test stacklength(fr) == 1
264267

265268
err_caught = Any[nothing]
266269
fr = JuliaInterpreter.enter_call(f_exc_outer)
267-
fr, pc = debug_command(fr, "s")
268-
debug_command(fr, "c")
270+
fr, pc = debug_command(fr, :s)
271+
debug_command(fr, :c)
269272
@test get_return(root(fr)) == 2
270273
@test first(err_caught) isa ErrorException
271274
@test stacklength(root(fr)) == 1
@@ -274,23 +277,23 @@ struct B{T} end
274277
f_outer() = g_inner()
275278
g_inner() = error()
276279
fr = JuliaInterpreter.enter_call(f_outer)
277-
@test_throws ErrorException debug_command(fr, "finish")
280+
@test_throws ErrorException debug_command(fr, :finish)
278281
@test stacklength(fr) == 1
279282

280283
# Break on error
281284
try
282-
JuliaInterpreter.break_on_error[] = true
285+
break_on(:error)
283286
fr = JuliaInterpreter.enter_call(f_outer)
284-
fr, pc = debug_command(JuliaInterpreter.finish_and_return!, fr, "finish")
287+
fr, pc = debug_command(JuliaInterpreter.finish_and_return!, fr, :finish)
285288
@test fr.framecode.scope.name == :error
286289

287290
fundef() = undef_func()
288291
frame = JuliaInterpreter.enter_call(fundef)
289-
fr, pc = debug_command(frame, "s")
292+
fr, pc = debug_command(frame, :s)
290293
@test isa(pc, BreakpointRef)
291294
@test pc.err isa UndefVarError
292295
finally
293-
JuliaInterpreter.break_on_error[] = false
296+
break_off(:error)
294297
end
295298

296299
@testset "breakpoints" begin
@@ -308,21 +311,21 @@ struct B{T} end
308311
method_start = ln - 9
309312
fr = enter_call(f_bp, 2)
310313
@test JuliaInterpreter.linenumber(fr) == method_start + 1
311-
fr, pc = JuliaInterpreter.debug_command(fr, "c")
314+
fr, pc = JuliaInterpreter.debug_command(fr, :c)
312315
# Hit the breakpoint x1
313316
@test JuliaInterpreter.linenumber(fr) == method_start + 3
314317
@test pc isa BreakpointRef
315-
fr, pc = JuliaInterpreter.debug_command(fr, "n")
318+
fr, pc = JuliaInterpreter.debug_command(fr, :n)
316319
@test JuliaInterpreter.linenumber(fr) == method_start + 4
317-
fr, pc = JuliaInterpreter.debug_command(fr, "c")
320+
fr, pc = JuliaInterpreter.debug_command(fr, :c)
318321
# Hit the breakpoint again x2
319322
@test pc isa BreakpointRef
320323
@test JuliaInterpreter.linenumber(fr) == method_start + 3
321-
fr, pc = JuliaInterpreter.debug_command(fr, "c")
324+
fr, pc = JuliaInterpreter.debug_command(fr, :c)
322325
# Hit the breakpoint for the last time x3
323326
@test pc isa BreakpointRef
324327
@test JuliaInterpreter.linenumber(fr) == method_start + 3
325-
JuliaInterpreter.debug_command(fr, "c")
328+
JuliaInterpreter.debug_command(fr, :c)
326329
@test get_return(fr) == 2
327330
end
328331
end

0 commit comments

Comments
 (0)
Please sign in to comment.