Skip to content

Commit c8dbcd2

Browse files
committed
Improvements handling eval/exec
1 parent 6356d57 commit c8dbcd2

3 files changed

Lines changed: 51 additions & 38 deletions

File tree

trepan/lib/stack.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,9 @@ def frame2filesize(frame):
345345
bc_path = frame.f_globals["__cached__"]
346346
else:
347347
bc_path = None
348+
if frame.f_code.co_filename == "<string>":
349+
# There is no source-code file to compare against.
350+
return None, None
348351
path = frame.f_globals["__file__"]
349352
source_path = getsourcefile(path)
350353
if source_path is None:

trepan/processor/command/info_subcmd/line.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# -*- coding: utf-8 -*-
22
#
3-
# Copyright (C) 2008-2009, 2013, 2015, 2020, 2023-2024 Rocky Bernstein
3+
# Copyright (C) 2008-2009, 2013, 2015, 2020, 2023-2024, 2026 Rocky Bernstein
44
# <rocky@gnu.org>
55
#
66
# This program is free software: you can redistribute it and/or modify
@@ -19,7 +19,7 @@
1919
import os.path as osp
2020
import re
2121

22-
from pyficache import code_line_info
22+
from pyficache import get_linecache_info
2323

2424
from trepan.clifns import search_file
2525
from trepan.misc import wrapped_lines
@@ -113,14 +113,18 @@ def run(self, args):
113113
filename = search_file(filename, self.core.search_path, self.main_dirname)
114114
pass
115115

116-
line_info = code_line_info(filename, line_number)
116+
# FIXME: this needs work.
117+
linecache_info = get_linecache_info(filename)
118+
if line_number not in linecache_info.line_numbers:
119+
self.errmsg(
120+
"No line information for line %d of %s"
121+
% (line_number, filename)
122+
)
123+
return
117124
msg1 = 'Line %d of "%s"' % (line_number, self.core.filename(filename),)
125+
line_info = linecache_info.line_info
118126
if line_info:
119-
msg2 = "starts at offset %d of %s and contains %d instructions" % (
120-
line_info[0].offsets[0],
121-
line_info[0].name,
122-
len(line_info[0].offsets),
123-
)
127+
msg2 = "is at offset(s) %s" % ", ".join(linecache_info.line_numbers[line_number])
124128
self.msg(wrapped_lines(msg1, msg2, self.settings["width"]))
125129
else:
126130
self.errmsg(

trepan/processor/print.py

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -143,11 +143,14 @@ def prefix_for_filename(deparsed_text: str) -> str:
143143
144144
"""
145145
lines = deparsed_text.split("\n")
146+
147+
146148
# FIXME Rather than blindly take the first line,
147149
# check if it is blank and if so use other lines.
148150
for line in lines:
149151
if line:
150-
return proc_obj._saferepr(line.strip())[1:-1][:10]
152+
cleaned_line = re.sub(r"[()'\"\s]", "_", line.strip())
153+
return proc_obj._saferepr(cleaned_line)[1:-1][:10]
151154
return "..."
152155

153156
def prefix_for_source_text(source_text: str, maxwidth: int) -> str:
@@ -197,7 +200,9 @@ def prefix_for_source_text(source_text: str, maxwidth: int) -> str:
197200

198201
filename = frame2file(core_obj, frame, canonic=False)
199202
if "<string>" == filename:
200-
if dbgr_obj.eval_string:
203+
if remapped_file := pyficache.main.code2tempfile.get(frame.f_code):
204+
filename = remapped_file
205+
elif dbgr_obj.eval_string:
201206
remapped_file = filename
202207
filename = pyficache.unmap_file(filename)
203208
if "<string>" == filename:
@@ -214,38 +219,39 @@ def prefix_for_source_text(source_text: str, maxwidth: int) -> str:
214219
pass
215220
pass
216221

217-
# FIXME: should change filename to disambiguated <string> everywhere.
218-
eval_kind = is_eval_or_exec_stmt(frame) or "code-"
219-
deparsed = deparse_fn(frame.f_code)
220-
if deparsed:
221-
# Create a nice prefix for the temporary file to write.
222-
# Use the exec type and first line of the deparsed text.
223-
leading_code_str = prefix_for_filename(deparsed.text)
224-
prefix = f"{eval_kind}-{leading_code_str}-"
225-
226-
remapped_file = cmdfns.source_tempfile_remap(
227-
prefix,
228-
deparsed.text,
229-
tempdir=proc_obj.settings("tempdir"),
230-
)
231-
# FIXME: pyficache remaps seems backwards
232-
pyficache.remap_file(remapped_file, filename)
233-
filename = remapped_file
234222
else:
223+
# FIXME: should change filename to disambiguated <string> everywhere.
224+
eval_kind = is_eval_or_exec_stmt(frame) or "code-"
235225
deparsed = deparse_fn(frame.f_code)
236-
if deparsed is not None:
237-
source_text = deparsed.text
238-
# else:
239-
# print("Can't deparse", frame.f_code)
240-
if source_text is None and eval_kind:
241-
if source_text := get_exec_or_eval_string(frame):
242-
filename = "string-" + prefix_for_filename(source_text) + "-"
243-
else:
244-
source_text = f"{eval_kind}(...)"
226+
if deparsed:
227+
# Create a nice prefix for the temporary file to write.
228+
# Use the exec type and first line of the deparsed text.
229+
leading_code_str = prefix_for_filename(deparsed.text)
230+
prefix = f"{eval_kind}-{leading_code_str}-"
231+
232+
remapped_file = cmdfns.source_tempfile_remap(
233+
prefix,
234+
deparsed.text,
235+
tempdir=proc_obj.settings("tempdir"),
236+
)
237+
# FIXME: pyficache remaps seems backwards
238+
filename = remapped_file
239+
240+
else:
241+
deparsed = deparse_fn(frame.f_code)
242+
if deparsed is not None:
243+
source_text = deparsed.text
244+
# else:
245+
# print("Can't deparse", frame.f_code)
246+
if source_text is None and eval_kind:
247+
if source_text := get_exec_or_eval_string(frame):
248+
filename = "string-" + prefix_for_filename(source_text) + "-"
249+
else:
250+
source_text = f"{eval_kind}(...)"
251+
pass
245252
pass
246253
pass
247254
pass
248-
pass
249255
else:
250256
m = re.search("^<frozen (.*)>", filename)
251257
if m and m.group(1) in pyficache.file2file_remap:
@@ -328,7 +334,7 @@ def prefix_for_source_text(source_text: str, maxwidth: int) -> str:
328334
pyficache.remap_file(remapped_file, filename)
329335
fd.close()
330336
if source_text:
331-
pyficache.main.code2_tempfile[frame.f_code] = remapped_file
337+
pyficache.main.code2tempfile[frame.f_code] = remapped_file
332338
intf_obj.msg(
333339
f"remapped string {prefix_for_source_text(source_text, 10)} to file {remapped_file}"
334340
)

0 commit comments

Comments
 (0)