Skip to content

Commit b888b2f

Browse files
committed
Support Expr(:line, ...) linetables for generated functions
1 parent 6a5027f commit b888b2f

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

src/breakpoints.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ function breakpoint(filename::AbstractString, line::Integer, args...)
217217
offset = line1 - method.line
218218
src = JuliaInterpreter.get_source(method)
219219
lastline = src.linetable[end]
220-
if lastline.line + offset >= line
220+
if getline(lastline) + offset >= line
221221
return breakpoint(method, line, args...)
222222
end
223223
end

src/utils.jl

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@ function lineoffset(framecode::FrameCode)
138138
return offset
139139
end
140140

141+
getline(ln) = isexpr(ln, :line) ? ln.args[1] : ln.line
142+
getfile(ln) = String(isexpr(ln, :line) ? ln.args[2] : ln.file)
143+
141144
"""
142145
loc = whereis(frame, pc=frame.pc)
143146
@@ -149,7 +152,7 @@ function CodeTracking.whereis(framecode::FrameCode, pc)
149152
codeloc == 0 && return nothing
150153
lineinfo = framecode.src.linetable[codeloc]
151154
return isa(framecode.scope, Method) ?
152-
whereis(lineinfo, framecode.scope) : string(lineinfo.file), lineinfo.line
155+
whereis(lineinfo, framecode.scope) : getfile(lineinfo), getline(lineinfo)
153156
end
154157
CodeTracking.whereis(frame::Frame, pc=frame.pc) = whereis(frame.framecode, pc)
155158

@@ -163,10 +166,17 @@ See [`CodeTracking.whereis`](@ref) for dynamic line information.
163166
function linenumber(framecode::FrameCode, pc)
164167
codeloc = codelocation(framecode.src, pc)
165168
codeloc == 0 && return nothing
166-
return framecode.src.linetable[codeloc].line
169+
return getline(framecode.src.linetable[codeloc])
167170
end
168171
linenumber(frame::Frame, pc=frame.pc) = linenumber(frame.framecode, pc)
169172

173+
function getfile(framecode::FrameCode, pc)
174+
codeloc = codelocation(framecode.src, pc)
175+
codeloc == 0 && return nothing
176+
return getfile(framecode.src.linetable[codeloc])
177+
end
178+
getfile(frame::Frame, pc=frame.pc) = getfile(frame.framecode, pc)
179+
170180
function codelocation(code::CodeInfo, idx)
171181
codeloc = code.codelocs[idx]
172182
while codeloc == 0 && code.code[idx] === nothing && idx < length(code.code)
@@ -183,7 +193,7 @@ Return the index of the first statement in `frame`'s `CodeInfo` that corresponds
183193
static line number `line`.
184194
"""
185195
function statementnumber(framecode::FrameCode, line)
186-
lineidx = searchsortedfirst(framecode.src.linetable, line; by=lin->isa(lin,Integer) ? lin : lin.line)
196+
lineidx = searchsortedfirst(framecode.src.linetable, line; by=lin->isa(lin,Integer) ? lin : getline(lin))
187197
1 <= lineidx <= length(framecode.src.linetable) || throw(ArgumentError("line $line not found in $(framecode.scope)"))
188198
return searchsortedfirst(framecode.src.codelocs, lineidx)
189199
end
@@ -222,7 +232,7 @@ function print_framecode(io::IO, framecode::FrameCode; pc=0, range=1:nstatements
222232
ndstmt = ndigits(nstatements(framecode))
223233
lt = framecode.src.linetable
224234
offset = lineoffset(framecode)
225-
ndline = isempty(lt) ? 0 : ndigits(lt[end].line + offset)
235+
ndline = isempty(lt) ? 0 : ndigits(getline(lt[end]) + offset)
226236
nullline = " "^ndline
227237
code = framecode_lines(framecode)
228238
isfirst = true

0 commit comments

Comments
 (0)