@@ -138,6 +138,9 @@ function lineoffset(framecode::FrameCode)
138
138
return offset
139
139
end
140
140
141
+ getline (ln) = isexpr (ln, :line ) ? ln. args[1 ] : ln. line
142
+ getfile (ln) = String (isexpr (ln, :line ) ? ln. args[2 ] : ln. file)
143
+
141
144
"""
142
145
loc = whereis(frame, pc=frame.pc)
143
146
@@ -149,7 +152,7 @@ function CodeTracking.whereis(framecode::FrameCode, pc)
149
152
codeloc == 0 && return nothing
150
153
lineinfo = framecode. src. linetable[codeloc]
151
154
return isa (framecode. scope, Method) ?
152
- whereis (lineinfo, framecode. scope) : string (lineinfo. file ), lineinfo. line
155
+ whereis (lineinfo, framecode. scope) : getfile (lineinfo), getline ( lineinfo)
153
156
end
154
157
CodeTracking. whereis (frame:: Frame , pc= frame. pc) = whereis (frame. framecode, pc)
155
158
@@ -163,10 +166,17 @@ See [`CodeTracking.whereis`](@ref) for dynamic line information.
163
166
function linenumber (framecode:: FrameCode , pc)
164
167
codeloc = codelocation (framecode. src, pc)
165
168
codeloc == 0 && return nothing
166
- return framecode. src. linetable[codeloc]. line
169
+ return getline ( framecode. src. linetable[codeloc])
167
170
end
168
171
linenumber (frame:: Frame , pc= frame. pc) = linenumber (frame. framecode, pc)
169
172
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
+
170
180
function codelocation (code:: CodeInfo , idx)
171
181
codeloc = code. codelocs[idx]
172
182
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
183
193
static line number `line`.
184
194
"""
185
195
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) )
187
197
1 <= lineidx <= length (framecode. src. linetable) || throw (ArgumentError (" line $line not found in $(framecode. scope) " ))
188
198
return searchsortedfirst (framecode. src. codelocs, lineidx)
189
199
end
@@ -222,7 +232,7 @@ function print_framecode(io::IO, framecode::FrameCode; pc=0, range=1:nstatements
222
232
ndstmt = ndigits (nstatements (framecode))
223
233
lt = framecode. src. linetable
224
234
offset = lineoffset (framecode)
225
- ndline = isempty (lt) ? 0 : ndigits (lt[end ]. line + offset)
235
+ ndline = isempty (lt) ? 0 : ndigits (getline ( lt[end ]) + offset)
226
236
nullline = " " ^ ndline
227
237
code = framecode_lines (framecode)
228
238
isfirst = true
0 commit comments