Skip to content

Commit 8dad341

Browse files
committed
Better handling of remapped exec/eval files
1 parent fa8469b commit 8dad341

3 files changed

Lines changed: 41 additions & 25 deletions

File tree

trepan/lib/stack.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -255,12 +255,13 @@ def format_return_and_location(
255255
add_quotes_around_file = not is_pseudo_file
256256
if is_module:
257257
if filename == "<string>":
258-
s += " in exec"
258+
if (func_name := is_eval_or_exec_stmt(frame)):
259+
s += f" in {func_name}"
259260
elif not is_eval_or_exec_stmt(frame) and not is_pseudo_file:
260261
s += " file"
261262
elif s == "?()":
262-
if is_eval_or_exec_stmt(frame):
263-
s = "in exec"
263+
if (func_name := is_eval_or_exec_stmt(frame)):
264+
s = f"in {func_name}"
264265
exec_str = get_exec_string(frame.f_back)
265266
if exec_str is not None:
266267
filename = exec_str

trepan/processor/cmdproc.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# -*- coding: utf-8 -*-
22
#
3-
# Copyright (C) 2008-2010, 2013-2021, 2023-2025 Rocky Bernstein
3+
# Copyright (C) 2008-2010, 2013-2021, 2023-2026 Rocky Bernstein
44
# <rocky@gnu.org>
55
#
66
# This program is free software: you can redistribute it and/or modify
@@ -210,9 +210,8 @@ def get_option_fn(key):
210210
self.list_lineno = 0 # last list number used in "list"
211211
self.list_offset = -1 # last list number used in "disassemble"
212212
self.list_obj = None
213-
self.list_filename = None # last filename used in list
214213
self.list_orig_lineno = 0 # line number of frame or exception on setup
215-
self.list_filename = None # filename of frame or exception on setup
214+
self.list_filename = None # filename of frame or exception on setup, or "list" command
216215

217216
self.macros = {} # Debugger Macros
218217

trepan/processor/print.py

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,18 @@ def prefix_for_filename(deparsed_text: str) -> str:
145145
return proc_obj._saferepr(line.strip())[1:-1][:10]
146146
return "..."
147147

148+
def prefix_for_source_text(source_text: str, maxwidth: int) -> str:
149+
"""
150+
Return source_text possibly truncated to `maxwidth`
151+
We do this so that the user gets some idea of
152+
what the string (source code text) is contained in the file.
153+
154+
"""
155+
source_text = source_text.strip()
156+
if len(source_text) < maxwidth:
157+
return source_text
158+
return proc_obj._saferepr(source_text)[:maxwidth] + "'..."
159+
148160
i_stack = proc_obj.curindex
149161
if i_stack is None or proc_obj.stack is None:
150162
return False
@@ -179,21 +191,21 @@ def prefix_for_filename(deparsed_text: str) -> str:
179191
# break
180192

181193
filename = frame2file(core_obj, frame, canonic=False)
182-
if "<string>" == filename and dbgr_obj.eval_string:
183-
eval_kind = "string"
184-
remapped_file = filename
185-
filename = pyficache.unmap_file(filename)
186-
if "<string>" == filename:
187-
remapped_file = cmdfns.source_tempfile_remap(
188-
"eval_string",
189-
dbgr_obj.eval_string,
190-
tempdir=proc_obj.settings("tempdir"),
191-
)
192-
pyficache.remap_file(filename, remapped_file)
193-
filename, line_number = pyficache.unmap_file_line(filename, line_number)
194+
if "<string>" == filename:
195+
if dbgr_obj.eval_string:
196+
remapped_file = filename
197+
filename = pyficache.unmap_file(filename)
198+
if "<string>" == filename:
199+
remapped_file = cmdfns.source_tempfile_remap(
200+
"eval_string",
201+
dbgr_obj.eval_string,
202+
tempdir=proc_obj.settings("tempdir"),
203+
)
204+
pyficache.remap_file(filename, remapped_file)
205+
filename, line_number = pyficache.unmap_file_line(filename, line_number)
206+
pass
194207
pass
195-
pass
196-
elif "<string>" == filename:
208+
197209
# FIXME: should change filename to disambiguated <string> everywhere.
198210
eval_kind = is_eval_or_exec_stmt(frame) or "code-"
199211
deparsed = deparse_fn(frame.f_code)
@@ -212,7 +224,6 @@ def prefix_for_filename(deparsed_text: str) -> str:
212224
pyficache.remap_file(remapped_file, filename)
213225
filename = remapped_file
214226
else:
215-
eval_kind = is_eval_or_exec_stmt(frame)
216227
deparsed = deparse_fn(frame.f_code)
217228
if deparsed is not None:
218229
source_text = deparsed.text
@@ -289,14 +300,14 @@ def prefix_for_filename(deparsed_text: str) -> str:
289300
# FIXME:
290301
if source_text:
291302
lines = source_text.split("\n")
292-
temp_name = "string-" + prefix_for_filename(source_text) + "-"
303+
temp_name = "string-" + prefix_for_filename(source_text)
293304
else:
294305
# try with good ol linecache and consider fixing pyficache
295306
lines = linecache.getlines(filename)
296307
temp_name = filename
297308
if lines and not filename.endswith(".pyasm"):
298309
# FIXME: DRY code with version in cmdproc.py print_location
299-
prefix = osp.basename(temp_name).split(".")[0]
310+
prefix = osp.basename(temp_name).split(".")[0] + "-"
300311
fd = NamedTemporaryFile(
301312
suffix=".py",
302313
prefix=prefix,
@@ -308,7 +319,11 @@ def prefix_for_filename(deparsed_text: str) -> str:
308319
remapped_file = fd.name
309320
pyficache.remap_file(remapped_file, filename)
310321
fd.close()
311-
intf_obj.msg(f"remapped file {filename} to {remapped_file}")
322+
if source_text:
323+
intf_obj.msg(f"remapped string {prefix_for_source_text(source_text, 10)} to file {remapped_file}")
324+
else:
325+
intf_obj.msg(f"remapped file {filename} to {remapped_file}")
326+
proc_obj.list_filename = remapped_file
312327

313328
pass
314329

@@ -334,7 +349,7 @@ def prefix_for_filename(deparsed_text: str) -> str:
334349
filename, line = cmdfns.deparse_getline(
335350
code, remapped_file, line_number, opts
336351
)
337-
pass
352+
proc_obj.list_filename = remapped_file
338353
pass
339354

340355
if eval_kind is None:
@@ -402,6 +417,7 @@ def five():
402417
cmdproc.frame = currentframe()
403418
cmdproc.event = "line"
404419
cmdproc.setup()
420+
405421
print_location(cmdproc)
406422

407423
cmdproc.curindex = 1

0 commit comments

Comments
 (0)