Skip to content

Commit fc6b33f

Browse files
committed
Fix source handling
1 parent 53eee56 commit fc6b33f

File tree

3 files changed

+61
-23
lines changed

3 files changed

+61
-23
lines changed

src/DebugEngines.jl

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ mutable struct DebugEngine
2323

2424
on_stop::Function
2525

26+
sources::Vector{String}
27+
source_id_by_name::Dict{String,Int}
28+
2629
function DebugEngine(mod::Module, code::String, filename::String, stop_on_entry::Bool, on_stop::Function)
2730
return new(
2831
mod,
@@ -38,7 +41,9 @@ mutable struct DebugEngine
3841
String[],
3942
Set{Any}(),
4043
nothing,
41-
on_stop
44+
on_stop,
45+
String[],
46+
Dict{String,Int}()
4247
)
4348
end
4449
end
@@ -425,4 +430,31 @@ function execution_terminate(debug_engine::DebugEngine)
425430
put!(debug_engine.next_cmd, (cmd = :stop,))
426431
end
427432

433+
function has_source(debug_engine::DebugEngine, filename::AbstractString)
434+
return haskey(debug_engine.source_id_by_name, filename)
435+
end
436+
437+
function set_source(debug_engine::DebugEngine, filename::AbstractString, code::AbstractString)
438+
if !haskey(debug_engine.source_id_by_name, filename)
439+
source_id = length(debug_engine.sources) + 1
440+
push!(debug_engine.sources, code)
441+
debug_engine.source_id_by_name[filename] = source_id
442+
else
443+
source_id = debug_engine.source_id_by_name[filename]
444+
debug_engine.sources[source_id] = code
445+
end
446+
end
447+
448+
function get_source_id(debug_engine::DebugEngine, filename::AbstractString)
449+
return debug_engine.source_id_by_name[filename]
450+
end
451+
452+
function get_source(debug_engine::DebugEngine, filename::AbstractString)
453+
return debug_engine.sources[debug_engine.source_id_by_name[filename]]
454+
end
455+
456+
function get_source(debug_engine::DebugEngine, source_id::Int)
457+
return debug_engine.sources[source_id]
458+
end
459+
428460
end

src/debugger_requests.jl

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ function stack_trace_request(debug_session::DebugSession, params::StackTraceArgu
301301
meth_or_mod_name = string(Base.nameof(curr_fr))
302302

303303
# Is this a file from base?
304-
if !isabspath(file_name)
304+
if !isabspath(file_name) && !occursin(r"REPL\[\d*\]", file_name)
305305
file_name = basepath(file_name)
306306
end
307307

@@ -361,7 +361,11 @@ function stack_trace_request(debug_session::DebugSession, params::StackTraceArgu
361361
elseif curr_scopeof isa Method
362362
ret = JuliaInterpreter.CodeTracking.definition(String, curr_fr.framecode.scope)
363363
if ret !== nothing
364-
debug_session.sources[debug_session.next_source_id], loc = ret
364+
source_name = string(curr_fr.framecode.scope)
365+
366+
DebugEngines.set_source(debug_session.debug_engine, source_name, ret[1])
367+
source_id = DebugEngines.get_source_id(debug_session.debug_engine, source_name)
368+
365369
push!(
366370
frames,
367371
StackFrame(
@@ -370,7 +374,7 @@ function stack_trace_request(debug_session::DebugSession, params::StackTraceArgu
370374
Source(
371375
file_name,
372376
missing,
373-
debug_session.next_source_id,
377+
source_id,
374378
source_hint,
375379
source_origin,
376380
missing,
@@ -386,7 +390,6 @@ function stack_trace_request(debug_session::DebugSession, params::StackTraceArgu
386390
sf_hint
387391
)
388392
)
389-
debug_session.next_source_id += 1
390393
else
391394
src = curr_fr.framecode.src
392395
@static if isdefined(JuliaInterpreter, :copy_codeinfo)
@@ -397,7 +400,10 @@ function stack_trace_request(debug_session::DebugSession, params::StackTraceArgu
397400
JuliaInterpreter.replace_coretypes!(src; rev = true)
398401
code = Base.invokelatest(JuliaInterpreter.framecode_lines, src)
399402

400-
debug_session.sources[debug_session.next_source_id] = join(code, '\n')
403+
source_name = string(uuid4())
404+
405+
DebugEngines.set_source(debug_session.debug_engine, source_name, join(code, '\n'))
406+
source_id = DebugEngines.get_source_id(debug_session.debug_engine, source_name)
401407

402408
push!(
403409
frames,
@@ -407,7 +413,7 @@ function stack_trace_request(debug_session::DebugSession, params::StackTraceArgu
407413
Source(
408414
file_name,
409415
missing,
410-
debug_session.next_source_id,
416+
source_id,
411417
source_hint,
412418
source_origin,
413419
missing,
@@ -423,21 +429,20 @@ function stack_trace_request(debug_session::DebugSession, params::StackTraceArgu
423429
sf_hint
424430
)
425431
)
426-
debug_session.next_source_id += 1
427432
end
428-
else
429-
# For now we are assuming that this can only happen
430-
# for code that is passed via the @enter or @run macros,
431-
# and that code we have stored as source with id 0
433+
elseif occursin(r"REPL\[\d*\]", file_name)
434+
source_name = file_name
435+
source_id = DebugEngines.get_source_id(debug_session.debug_engine, file_name)
436+
432437
push!(
433438
frames,
434439
StackFrame(
435440
id,
436441
meth_or_mod_name,
437442
Source(
438-
"REPL",
443+
file_name,
439444
missing,
440-
0,
445+
source_id,
441446
missing,
442447
missing,
443448
missing,
@@ -453,6 +458,8 @@ function stack_trace_request(debug_session::DebugSession, params::StackTraceArgu
453458
missing
454459
)
455460
)
461+
else
462+
error("Unknown stack type")
456463
end
457464

458465
id += 1
@@ -510,7 +517,9 @@ function source_request(debug_session::DebugSession, params::SourceArguments)
510517

511518
source_id = params.source.sourceReference
512519

513-
return SourceResponseArguments(debug_session.sources[source_id], missing)
520+
code = DebugEngines.get_source(debug_session.debug_engine, source_id)
521+
522+
return SourceResponseArguments(code, missing)
514523
end
515524

516525
function construct_return_msg_for_var(debug_session::DebugSession, name, value)

src/packagedef.jl

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ mutable struct DebugSession
2727

2828
terminate_on_finish::Bool
2929

30-
sources::Dict{Int,String}
31-
next_source_id::Int
30+
3231
varrefs::Vector{VariableReference}
3332

3433
configuration_done::Channel{Bool}
@@ -48,8 +47,6 @@ mutable struct DebugSession
4847
nothing,
4948
nothing,
5049
true,
51-
Dict{Int,String}(),
52-
1,
5350
VariableReference[],
5451
Channel{Bool}(1),
5552
Channel{Bool}(1),
@@ -135,10 +132,6 @@ function Base.run(debug_session::DebugSession, error_handler=nothing)
135132
break
136133
end
137134
elseif next_cmd.cmd == :debug
138-
if startswith(next_cmd.filename, "REPL[1]")
139-
debug_session.sources[0] = next_cmd.code
140-
end
141-
142135
debug_session.debug_engine = DebugEngines.DebugEngine(
143136
next_cmd.mod,
144137
next_cmd.code,
@@ -159,6 +152,10 @@ function Base.run(debug_session::DebugSession, error_handler=nothing)
159152
end
160153
)
161154

155+
if occursin(r"REPL\[\d*\]", next_cmd.filename)
156+
DebugEngines.set_source(debug_session.debug_engine, next_cmd.filename, next_cmd.code)
157+
end
158+
162159
DebugEngines.set_function_breakpoints!(debug_session.debug_engine, debug_session.function_breakpoints)
163160
DebugEngines.set_compiled_functions_modules!(debug_session.debug_engine, debug_session.compiled_modules_or_functions)
164161
DebugEngines.set_compiled_mode!(debug_session.debug_engine, debug_session.compiled_mode)

0 commit comments

Comments
 (0)