Skip to content

Commit

Permalink
Merge pull request #84 from julia-vscode/fix-sources
Browse files Browse the repository at this point in the history
Fix source handling
  • Loading branch information
davidanthoff authored Jul 27, 2024
2 parents 53eee56 + fc6b33f commit a8d907e
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 23 deletions.
34 changes: 33 additions & 1 deletion src/DebugEngines.jl
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ mutable struct DebugEngine

on_stop::Function

sources::Vector{String}
source_id_by_name::Dict{String,Int}

function DebugEngine(mod::Module, code::String, filename::String, stop_on_entry::Bool, on_stop::Function)
return new(
mod,
Expand All @@ -38,7 +41,9 @@ mutable struct DebugEngine
String[],
Set{Any}(),
nothing,
on_stop
on_stop,
String[],
Dict{String,Int}()
)
end
end
Expand Down Expand Up @@ -425,4 +430,31 @@ function execution_terminate(debug_engine::DebugEngine)
put!(debug_engine.next_cmd, (cmd = :stop,))
end

function has_source(debug_engine::DebugEngine, filename::AbstractString)
return haskey(debug_engine.source_id_by_name, filename)
end

function set_source(debug_engine::DebugEngine, filename::AbstractString, code::AbstractString)
if !haskey(debug_engine.source_id_by_name, filename)
source_id = length(debug_engine.sources) + 1
push!(debug_engine.sources, code)
debug_engine.source_id_by_name[filename] = source_id
else
source_id = debug_engine.source_id_by_name[filename]
debug_engine.sources[source_id] = code
end
end

function get_source_id(debug_engine::DebugEngine, filename::AbstractString)
return debug_engine.source_id_by_name[filename]
end

function get_source(debug_engine::DebugEngine, filename::AbstractString)
return debug_engine.sources[debug_engine.source_id_by_name[filename]]
end

function get_source(debug_engine::DebugEngine, source_id::Int)
return debug_engine.sources[source_id]
end

end
37 changes: 23 additions & 14 deletions src/debugger_requests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ function stack_trace_request(debug_session::DebugSession, params::StackTraceArgu
meth_or_mod_name = string(Base.nameof(curr_fr))

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

Expand Down Expand Up @@ -361,7 +361,11 @@ function stack_trace_request(debug_session::DebugSession, params::StackTraceArgu
elseif curr_scopeof isa Method
ret = JuliaInterpreter.CodeTracking.definition(String, curr_fr.framecode.scope)
if ret !== nothing
debug_session.sources[debug_session.next_source_id], loc = ret
source_name = string(curr_fr.framecode.scope)

DebugEngines.set_source(debug_session.debug_engine, source_name, ret[1])
source_id = DebugEngines.get_source_id(debug_session.debug_engine, source_name)

push!(
frames,
StackFrame(
Expand All @@ -370,7 +374,7 @@ function stack_trace_request(debug_session::DebugSession, params::StackTraceArgu
Source(
file_name,
missing,
debug_session.next_source_id,
source_id,
source_hint,
source_origin,
missing,
Expand All @@ -386,7 +390,6 @@ function stack_trace_request(debug_session::DebugSession, params::StackTraceArgu
sf_hint
)
)
debug_session.next_source_id += 1
else
src = curr_fr.framecode.src
@static if isdefined(JuliaInterpreter, :copy_codeinfo)
Expand All @@ -397,7 +400,10 @@ function stack_trace_request(debug_session::DebugSession, params::StackTraceArgu
JuliaInterpreter.replace_coretypes!(src; rev = true)
code = Base.invokelatest(JuliaInterpreter.framecode_lines, src)

debug_session.sources[debug_session.next_source_id] = join(code, '\n')
source_name = string(uuid4())

DebugEngines.set_source(debug_session.debug_engine, source_name, join(code, '\n'))
source_id = DebugEngines.get_source_id(debug_session.debug_engine, source_name)

push!(
frames,
Expand All @@ -407,7 +413,7 @@ function stack_trace_request(debug_session::DebugSession, params::StackTraceArgu
Source(
file_name,
missing,
debug_session.next_source_id,
source_id,
source_hint,
source_origin,
missing,
Expand All @@ -423,21 +429,20 @@ function stack_trace_request(debug_session::DebugSession, params::StackTraceArgu
sf_hint
)
)
debug_session.next_source_id += 1
end
else
# For now we are assuming that this can only happen
# for code that is passed via the @enter or @run macros,
# and that code we have stored as source with id 0
elseif occursin(r"REPL\[\d*\]", file_name)
source_name = file_name
source_id = DebugEngines.get_source_id(debug_session.debug_engine, file_name)

push!(
frames,
StackFrame(
id,
meth_or_mod_name,
Source(
"REPL",
file_name,
missing,
0,
source_id,
missing,
missing,
missing,
Expand All @@ -453,6 +458,8 @@ function stack_trace_request(debug_session::DebugSession, params::StackTraceArgu
missing
)
)
else
error("Unknown stack type")
end

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

source_id = params.source.sourceReference

return SourceResponseArguments(debug_session.sources[source_id], missing)
code = DebugEngines.get_source(debug_session.debug_engine, source_id)

return SourceResponseArguments(code, missing)
end

function construct_return_msg_for_var(debug_session::DebugSession, name, value)
Expand Down
13 changes: 5 additions & 8 deletions src/packagedef.jl
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ mutable struct DebugSession

terminate_on_finish::Bool

sources::Dict{Int,String}
next_source_id::Int

varrefs::Vector{VariableReference}

configuration_done::Channel{Bool}
Expand All @@ -48,8 +47,6 @@ mutable struct DebugSession
nothing,
nothing,
true,
Dict{Int,String}(),
1,
VariableReference[],
Channel{Bool}(1),
Channel{Bool}(1),
Expand Down Expand Up @@ -135,10 +132,6 @@ function Base.run(debug_session::DebugSession, error_handler=nothing)
break
end
elseif next_cmd.cmd == :debug
if startswith(next_cmd.filename, "REPL[1]")
debug_session.sources[0] = next_cmd.code
end

debug_session.debug_engine = DebugEngines.DebugEngine(
next_cmd.mod,
next_cmd.code,
Expand All @@ -159,6 +152,10 @@ function Base.run(debug_session::DebugSession, error_handler=nothing)
end
)

if occursin(r"REPL\[\d*\]", next_cmd.filename)
DebugEngines.set_source(debug_session.debug_engine, next_cmd.filename, next_cmd.code)
end

DebugEngines.set_function_breakpoints!(debug_session.debug_engine, debug_session.function_breakpoints)
DebugEngines.set_compiled_functions_modules!(debug_session.debug_engine, debug_session.compiled_modules_or_functions)
DebugEngines.set_compiled_mode!(debug_session.debug_engine, debug_session.compiled_mode)
Expand Down

0 comments on commit a8d907e

Please sign in to comment.